@livetemplate/client 0.8.34 → 0.8.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dom/scroll-away.d.ts.map +1 -1
- package/dist/dom/scroll-away.js +4 -2
- package/dist/dom/scroll-away.js.map +1 -1
- package/dist/livetemplate-client.browser.js +4 -4
- package/dist/livetemplate-client.browser.js.map +3 -3
- package/dist/livetemplate-client.d.ts +10 -0
- package/dist/livetemplate-client.d.ts.map +1 -1
- package/dist/livetemplate-client.js +136 -0
- package/dist/livetemplate-client.js.map +1 -1
- package/dist/tests/scroll-away.test.js +89 -2
- package/dist/tests/scroll-away.test.js.map +1 -1
- package/dist/tests/visibility-reconnect.test.d.ts +2 -0
- package/dist/tests/visibility-reconnect.test.d.ts.map +1 -0
- package/dist/tests/visibility-reconnect.test.js +351 -0
- package/dist/tests/visibility-reconnect.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-away.d.ts","sourceRoot":"","sources":["../../dom/scroll-away.ts"],"names":[],"mappings":"AAsBA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"scroll-away.d.ts","sourceRoot":"","sources":["../../dom/scroll-away.ts"],"names":[],"mappings":"AAsBA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA8DvD;AAOD,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,IAAI,CAS1D"}
|
package/dist/dom/scroll-away.js
CHANGED
|
@@ -21,7 +21,7 @@ function setupScrollAway(scanRoot) {
|
|
|
21
21
|
const edge = el.getAttribute("lvt-scroll-away");
|
|
22
22
|
if (!edge)
|
|
23
23
|
return;
|
|
24
|
-
if (edge !== "bottom") {
|
|
24
|
+
if (edge !== "bottom" && edge !== "top") {
|
|
25
25
|
console.warn(`Unknown lvt-scroll-away edge: ${edge}`);
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
@@ -52,7 +52,9 @@ function setupScrollAway(scanRoot) {
|
|
|
52
52
|
ticking = true;
|
|
53
53
|
requestAnimationFrame(() => {
|
|
54
54
|
ticking = false;
|
|
55
|
-
const distance =
|
|
55
|
+
const distance = edge === "top"
|
|
56
|
+
? target.scrollTop
|
|
57
|
+
: target.scrollHeight - target.scrollTop - target.clientHeight;
|
|
56
58
|
if (distance > threshold) {
|
|
57
59
|
el.classList.add("visible");
|
|
58
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scroll-away.js","sourceRoot":"","sources":["../../dom/scroll-away.ts"],"names":[],"mappings":";;AAsBA,
|
|
1
|
+
{"version":3,"file":"scroll-away.js","sourceRoot":"","sources":["../../dom/scroll-away.ts"],"names":[],"mappings":";;AAsBA,0CA8DC;AAOD,gDASC;AApGD,+DAAsD;AAQtD,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC,MAAM,cAAc,GAAwB,EAAE,CAAC;AAE/C,SAAS,yBAAyB;IAChC,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW;YAAE,SAAS;QAC1C,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAQ,OAAO,CAAC,OAAe,CAAC,SAAS,CAAC,CAAC;QAC3C,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAgB,eAAe,CAAC,QAAiB;IAC/C,yBAAyB,EAAE,CAAC;IAE5B,MAAM,SAAS,GAAG,CAAC,EAAW,EAAE,EAAE;QAChC,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mCAAa,EAAC,EAAE,CAAgB,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAI,EAAU,CAAC,SAAS,CAAkC,CAAC;YACzE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChE,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAQ,EAAU,CAAC,SAAS,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC;YAC5F,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAI,EAAU,CAAC,SAAS,CAAkC,CAAC;QACzE,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO;YACvC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChE,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QAED,MAAM,GAAG,GAAG,QAAQ,CAClB,gBAAgB,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAC3E,CAAC;QACF,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAEzC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,qBAAqB,CAAC,GAAG,EAAE;gBACzB,OAAO,GAAG,KAAK,CAAC;gBAChB,MAAM,QAAQ,GAAG,IAAI,KAAK,KAAK;oBAC7B,CAAC,CAAC,MAAM,CAAC,SAAS;oBAClB,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;gBACjE,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;oBACzB,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC9B,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,OAAO,EAAE,CAAC;QAEV,MAAM,OAAO,GAAsB,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QACnE,EAAU,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;QACjC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,SAAS,CAAC,QAAQ,CAAC,CAAC;IACpB,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC;AAED,SAAS,aAAa,CAAC,OAA0B;IAC/C,MAAM,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAiB;IAClD,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QAClC,IAAI,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;YAAE,SAAS;QAC3F,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAQ,OAAO,CAAC,OAAe,CAAC,SAAS,CAAC,CAAC;QAC3C,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var LiveTemplateClient=(()=>{var Se=Object.defineProperty;var Lt=Object.getOwnPropertyDescriptor;var At=Object.getOwnPropertyNames;var Mt=Object.prototype.hasOwnProperty;var kt=(i,e)=>{for(var t in e)Se(i,t,{get:e[t],enumerable:!0})},xt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of At(e))!Mt.call(i,r)&&r!==t&&Se(i,r,{get:()=>e[r],enumerable:!(n=Lt(e,r))||n.enumerable});return i};var Ct=i=>xt(Se({},"__esModule",{value:!0}),i);var cn={};kt(cn,{LiveTemplateClient:()=>Ee,compareHTML:()=>Tt,loadAndApplyUpdate:()=>St,setupReactiveAttributeListeners:()=>ae});var Re=11;function Ht(i,e){var t=e.attributes,n,r,s,l,o;if(!(e.nodeType===Re||i.nodeType===Re)){for(var a=t.length-1;a>=0;a--)n=t[a],r=n.name,s=n.namespaceURI,l=n.value,s?(r=n.localName||r,o=i.getAttributeNS(s,r),o!==l&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(s,r,l))):(o=i.getAttribute(r),o!==l&&i.setAttribute(r,l));for(var c=i.attributes,d=c.length-1;d>=0;d--)n=c[d],r=n.name,s=n.namespaceURI,s?(r=n.localName||r,e.hasAttributeNS(s,r)||i.removeAttributeNS(s,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var te,_t="http://www.w3.org/1999/xhtml",F=typeof document=="undefined"?void 0:document,Ft=!!F&&"content"in F.createElement("template"),Ot=!!F&&F.createRange&&"createContextualFragment"in F.createRange();function It(i){var e=F.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function Dt(i){te||(te=F.createRange(),te.selectNode(F.body));var e=te.createContextualFragment(i);return e.childNodes[0]}function Rt(i){var e=F.createElement("body");return e.innerHTML=i,e.childNodes[0]}function Nt(i){return i=i.trim(),Ft?It(i):Ot?Dt(i):Rt(i)}function ne(i,e){var t=i.nodeName,n=e.nodeName,r,s;return t===n?!0:(r=t.charCodeAt(0),s=n.charCodeAt(0),r<=90&&s>=97?t===n.toUpperCase():s<=90&&r>=97?n===t.toUpperCase():!1)}function Ut(i,e){return!e||e===_t?F.createElement(i):F.createElementNS(e,i)}function Wt(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Te(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var Ne={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}Te(i,e,"selected")},INPUT:function(i,e){Te(i,e,"checked"),Te(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,s,l;r;)if(l=r.nodeName&&r.nodeName.toUpperCase(),l==="OPTGROUP")s=r,r=s.firstChild,r||(r=s.nextSibling,s=null);else{if(l==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&s&&(r=s.nextSibling,s=null)}i.selectedIndex=t}}},G=1,Ue=11,We=3,$e=8;function P(){}function $t(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function Pt(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var s=n;n=F.createElement("html"),n.innerHTML=s}else n=Nt(n);else n.nodeType===Ue&&(n=n.firstElementChild);var l=r.getNodeKey||$t,o=r.onBeforeNodeAdded||P,a=r.onNodeAdded||P,c=r.onBeforeElUpdated||P,d=r.onElUpdated||P,p=r.onBeforeNodeDiscarded||P,u=r.onNodeDiscarded||P,g=r.onBeforeElChildrenUpdated||P,v=r.skipFromChildren||P,x=r.addChild||function(h,m){return h.appendChild(m)},w=r.childrenOnly===!0,y=Object.create(null),H=[];function f(h){H.push(h)}function C(h,m){if(h.nodeType===G)for(var A=h.firstChild;A;){var E=void 0;m&&(E=l(A))?f(E):(u(A),A.firstChild&&C(A,m)),A=A.nextSibling}}function k(h,m,A){p(h)!==!1&&(m&&m.removeChild(h),u(h),C(h,A))}function I(h){if(h.nodeType===G||h.nodeType===Ue)for(var m=h.firstChild;m;){var A=l(m);A&&(y[A]=m),I(m),m=m.nextSibling}}I(t);function Q(h){a(h);for(var m=h.firstChild;m;){var A=m.nextSibling,E=l(m);if(E){var T=y[E];T&&ne(m,T)?(m.parentNode.replaceChild(T,m),_(T,m)):Q(m)}else Q(m);m=A}}function M(h,m,A){for(;m;){var E=m.nextSibling;(A=l(m))?f(A):k(m,h,!0),m=E}}function _(h,m,A){var E=l(m);if(E&&delete y[E],!A){var T=c(h,m);if(T===!1||(T instanceof HTMLElement&&(h=T,I(h)),i(h,m),d(h),g(h,m)===!1))return}h.nodeName!=="TEXTAREA"?L(h,m):Ne.TEXTAREA(h,m)}function L(h,m){var A=v(h,m),E=m.firstChild,T=h.firstChild,j,D,q,Z,W;e:for(;E;){for(Z=E.nextSibling,j=l(E);!A&&T;){if(q=T.nextSibling,E.isSameNode&&E.isSameNode(T)){E=Z,T=q;continue e}D=l(T);var ee=T.nodeType,$=void 0;if(ee===E.nodeType&&(ee===G?(j?j!==D&&((W=y[j])?q===W?$=!1:(h.insertBefore(W,T),D?f(D):k(T,h,!0),T=W,D=l(T)):$=!1):D&&($=!1),$=$!==!1&&ne(T,E),$&&_(T,E)):(ee===We||ee==$e)&&($=!0,T.nodeValue!==E.nodeValue&&(T.nodeValue=E.nodeValue))),$){E=Z,T=q;continue e}D?f(D):k(T,h,!0),T=q}if(j&&(W=y[j])&&ne(W,E))A||x(h,W),_(W,E);else{var we=o(E);we!==!1&&(we&&(E=we),E.actualize&&(E=E.actualize(h.ownerDocument||F)),x(h,E),Q(E))}E=Z,T=q}M(h,T,D);var De=Ne[h.nodeName];De&&De(h,m)}var b=t,S=b.nodeType,N=n.nodeType;if(!w){if(S===G)N===G?ne(t,n)||(u(t),b=Wt(t,Ut(n.nodeName,n.namespaceURI))):b=n;else if(S===We||S===$e){if(N===S)return b.nodeValue!==n.nodeValue&&(b.nodeValue=n.nodeValue),b;b=n}}if(b===n)u(t);else{if(n.isSameNode&&n.isSameNode(b))return;if(_(b,n,w),H)for(var O=0,U=H.length;O<U;O++){var V=y[H[O]];V&&k(V,V.parentNode,!1)}}return!w&&b!==t&&t.parentNode&&(b.actualize&&(b=b.actualize(t.ownerDocument||F)),t.parentNode.replaceChild(b,t)),b}}var Bt=Pt(Ht),Pe=Bt;var Le=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var re=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=`${Le.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=l=>{var a;let o=l.target;!o||!((a=this.wrapperElement)!=null&&a.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))},s=l=>{var a;let o=l.target;!o||!((a=this.wrapperElement)!=null&&a.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]=s,document.addEventListener("focus",r,!0),document.addEventListener("blur",s,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var l,o,a;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(l=this.lastFocusedElement)==null?void 0:l.tagName,((o=this.lastFocusedElement)==null?void 0:o.id)||((a=this.lastFocusedElement)==null?void 0:a.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 c=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[c]||null,this.logger.debug("[Focus] Found by index:",c,t==null?void 0:t.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,t==null?void 0:t.tagName);if(!t){this.logger.debug("[Focus] Element not found in updated DOM");return}let n=t.matches(":focus");if(this.logger.debug("[Focus] Already focused:",n),n){this.logger.debug("[Focus] Element retained focus \u2014 skipping restoration");return}let r=this.lastFocusedSelectionStart,s=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&s!==null&&(t.setSelectionRange(r,s),this.logger.debug("[Focus] Restored cursor:",r,"-",s))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?Le.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 Be=["pending","success","error","done"],Ae=new Set(Be),ie=new Set(["click-away"]),Me={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Kt(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],s=Me[r];if(!s)return null;let l=n[2];if(ie.has(l)||!Ae.has(l)&&!l.includes(":"))return null;let o=l.split(":"),a=o[o.length-1];if(!Ae.has(a))return null;let c=a,d=o.length>1?o.slice(0,-1).join(":"):void 0;return{action:s,lifecycle:c,actionName:d||void 0,param:e||void 0}}return null}function B(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function se(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),s=t.substring(n+1);i.setAttribute(r,s)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function Vt(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function jt(i,e){let t=Object.keys(Me),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let o of t)n.push(`[lvt-el\\:${o}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${o}\\:on\\:${r}\\:${i}]`);let s=n.join(", "),l;try{l=document.querySelectorAll(s)}catch(o){let a=t.map(c=>`[lvt-el\\:${c}\\:on\\:${i}]`);try{l=document.querySelectorAll(a.join(", "))}catch(c){return}}l.forEach(o=>{Array.from(o.attributes).forEach(a=>{if(!a.name.startsWith("lvt-el:")||!a.name.includes(":on:"))return;let c=Kt(a.name,a.value);c&&Vt(c,i,e)&&se(B(o),c.action,c.param)})})}function oe(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),s=Me[r];s&&se(B(i),s,t.value)}}function Ke(i){return!Ae.has(i)&&!ie.has(i)}function ae(){Be.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;jt(i,n)},!0)})}var qe=new Set(["pending","success","error","done"]),Ve=new WeakSet;function ze(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function Ge(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(l=>l.el.isConnected),s=l=>{var o;for(let a of l.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let c=ze(a.name);if(!c.trigger||qe.has(c.trigger)||ie.has(c.trigger))continue;let d=`__lvt_fx_${a.name}`;if(l[d])continue;let p=(o=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:o[1];if(!p)continue;let u=a.name,g=()=>{if(!l.hasAttribute(u))return;let v=l.getAttribute(u)||"",x=B(l);Y(x,p,v)};l.addEventListener(c.trigger,g),l[d]=g,r.push({el:l,event:c.trigger,handler:g,guardKey:d})}};s(i),i.querySelectorAll("*").forEach(s),t[n]=r}function Ye(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:s,guardKey:l})=>{n.removeEventListener(r,s),delete n[l]}),delete i[e])}function qt(i,e,t){let n=r=>{var s;for(let l of r.attributes){if(!l.name.startsWith("lvt-fx:"))continue;let o=ze(l.name);if(!o.trigger||!qe.has(o.trigger)||o.trigger!==e||o.actionName&&o.actionName!==t)continue;let a=(s=l.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];a&&Y(r,a,l.value)}};n(i),i.querySelectorAll("*").forEach(n)}function Y(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),s=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",l=i.style.backgroundColor,o=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=s,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=l,i.style.transition=o,i.__lvtHighlighting=!1;return}i.style.backgroundColor=l,setTimeout(()=>{i.isConnected&&(i.style.transition=o),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ve.has(i))break;Ve.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),s=t||"fade",l="";switch(s){case"fade":l=`lvt-fade-in ${r}ms ease-out`;break;case"slide":l=`lvt-slide-in ${r}ms ease-out`;break;case"scale":l=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${s}`)}if(!l)break;i.style.animation=l,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),s=zt.has(r)?r:"auto",l=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),o=t||"bottom";switch(o){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:s});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=l&&i.scrollTo({top:i.scrollHeight,behavior:s}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:s});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${o}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function Xe(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let s=l=>{var c;let a=(c=l.detail)==null?void 0:c.action;qt(i,r,a)};document.addEventListener(`lvt:${r}`,s,!0),t.push({event:`lvt:${r}`,handler:s})}),i.__lvtFxLifecycleListeners=t}function Je(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var zt=new Set(["auto","smooth","instant"]);function Qe(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&Y(e,"scroll",t)})}function Ze(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&Y(e,"highlight",t)})}function et(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&Y(e,"animate",t)}),Gt()}function Gt(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=`
|
|
1
|
+
"use strict";var LiveTemplateClient=(()=>{var Te=Object.defineProperty;var At=Object.getOwnPropertyDescriptor;var Lt=Object.getOwnPropertyNames;var Mt=Object.prototype.hasOwnProperty;var kt=(i,e)=>{for(var t in e)Te(i,t,{get:e[t],enumerable:!0})},xt=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Lt(e))!Mt.call(i,r)&&r!==t&&Te(i,r,{get:()=>e[r],enumerable:!(n=At(e,r))||n.enumerable});return i};var Ht=i=>xt(Te({},"__esModule",{value:!0}),i);var cn={};kt(cn,{LiveTemplateClient:()=>Ee,compareHTML:()=>St,loadAndApplyUpdate:()=>Tt,setupReactiveAttributeListeners:()=>ae});var De=11;function Ct(i,e){var t=e.attributes,n,r,s,l,o;if(!(e.nodeType===De||i.nodeType===De)){for(var a=t.length-1;a>=0;a--)n=t[a],r=n.name,s=n.namespaceURI,l=n.value,s?(r=n.localName||r,o=i.getAttributeNS(s,r),o!==l&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(s,r,l))):(o=i.getAttribute(r),o!==l&&i.setAttribute(r,l));for(var c=i.attributes,d=c.length-1;d>=0;d--)n=c[d],r=n.name,s=n.namespaceURI,s?(r=n.localName||r,e.hasAttributeNS(s,r)||i.removeAttributeNS(s,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var te,_t="http://www.w3.org/1999/xhtml",R=typeof document=="undefined"?void 0:document,Rt=!!R&&"content"in R.createElement("template"),Ft=!!R&&R.createRange&&"createContextualFragment"in R.createRange();function Ot(i){var e=R.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function It(i){te||(te=R.createRange(),te.selectNode(R.body));var e=te.createContextualFragment(i);return e.childNodes[0]}function Dt(i){var e=R.createElement("body");return e.innerHTML=i,e.childNodes[0]}function Nt(i){return i=i.trim(),Rt?Ot(i):Ft?It(i):Dt(i)}function ne(i,e){var t=i.nodeName,n=e.nodeName,r,s;return t===n?!0:(r=t.charCodeAt(0),s=n.charCodeAt(0),r<=90&&s>=97?t===n.toUpperCase():s<=90&&r>=97?n===t.toUpperCase():!1)}function Ut(i,e){return!e||e===_t?R.createElement(i):R.createElementNS(e,i)}function Wt(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Se(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var Ne={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}Se(i,e,"selected")},INPUT:function(i,e){Se(i,e,"checked"),Se(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,s,l;r;)if(l=r.nodeName&&r.nodeName.toUpperCase(),l==="OPTGROUP")s=r,r=s.firstChild,r||(r=s.nextSibling,s=null);else{if(l==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&s&&(r=s.nextSibling,s=null)}i.selectedIndex=t}}},G=1,Ue=11,We=3,$e=8;function P(){}function $t(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function Pt(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var s=n;n=R.createElement("html"),n.innerHTML=s}else n=Nt(n);else n.nodeType===Ue&&(n=n.firstElementChild);var l=r.getNodeKey||$t,o=r.onBeforeNodeAdded||P,a=r.onNodeAdded||P,c=r.onBeforeElUpdated||P,d=r.onElUpdated||P,p=r.onBeforeNodeDiscarded||P,u=r.onNodeDiscarded||P,g=r.onBeforeElChildrenUpdated||P,v=r.skipFromChildren||P,x=r.addChild||function(h,m){return h.appendChild(m)},w=r.childrenOnly===!0,y=Object.create(null),C=[];function f(h){C.push(h)}function H(h,m){if(h.nodeType===G)for(var L=h.firstChild;L;){var E=void 0;m&&(E=l(L))?f(E):(u(L),L.firstChild&&H(L,m)),L=L.nextSibling}}function k(h,m,L){p(h)!==!1&&(m&&m.removeChild(h),u(h),H(h,L))}function O(h){if(h.nodeType===G||h.nodeType===Ue)for(var m=h.firstChild;m;){var L=l(m);L&&(y[L]=m),O(m),m=m.nextSibling}}O(t);function Q(h){a(h);for(var m=h.firstChild;m;){var L=m.nextSibling,E=l(m);if(E){var S=y[E];S&&ne(m,S)?(m.parentNode.replaceChild(S,m),_(S,m)):Q(m)}else Q(m);m=L}}function M(h,m,L){for(;m;){var E=m.nextSibling;(L=l(m))?f(L):k(m,h,!0),m=E}}function _(h,m,L){var E=l(m);if(E&&delete y[E],!L){var S=c(h,m);if(S===!1||(S instanceof HTMLElement&&(h=S,O(h)),i(h,m),d(h),g(h,m)===!1))return}h.nodeName!=="TEXTAREA"?A(h,m):Ne.TEXTAREA(h,m)}function A(h,m){var L=v(h,m),E=m.firstChild,S=h.firstChild,j,I,q,Z,W;e:for(;E;){for(Z=E.nextSibling,j=l(E);!L&&S;){if(q=S.nextSibling,E.isSameNode&&E.isSameNode(S)){E=Z,S=q;continue e}I=l(S);var ee=S.nodeType,$=void 0;if(ee===E.nodeType&&(ee===G?(j?j!==I&&((W=y[j])?q===W?$=!1:(h.insertBefore(W,S),I?f(I):k(S,h,!0),S=W,I=l(S)):$=!1):I&&($=!1),$=$!==!1&&ne(S,E),$&&_(S,E)):(ee===We||ee==$e)&&($=!0,S.nodeValue!==E.nodeValue&&(S.nodeValue=E.nodeValue))),$){E=Z,S=q;continue e}I?f(I):k(S,h,!0),S=q}if(j&&(W=y[j])&&ne(W,E))L||x(h,W),_(W,E);else{var we=o(E);we!==!1&&(we&&(E=we),E.actualize&&(E=E.actualize(h.ownerDocument||R)),x(h,E),Q(E))}E=Z,S=q}M(h,S,I);var Ie=Ne[h.nodeName];Ie&&Ie(h,m)}var b=t,T=b.nodeType,N=n.nodeType;if(!w){if(T===G)N===G?ne(t,n)||(u(t),b=Wt(t,Ut(n.nodeName,n.namespaceURI))):b=n;else if(T===We||T===$e){if(N===T)return b.nodeValue!==n.nodeValue&&(b.nodeValue=n.nodeValue),b;b=n}}if(b===n)u(t);else{if(n.isSameNode&&n.isSameNode(b))return;if(_(b,n,w),C)for(var F=0,U=C.length;F<U;F++){var V=y[C[F]];V&&k(V,V.parentNode,!1)}}return!w&&b!==t&&t.parentNode&&(b.actualize&&(b=b.actualize(t.ownerDocument||R)),t.parentNode.replaceChild(b,t)),b}}var Bt=Pt(Ct),Pe=Bt;var Ae=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var re=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=`${Ae.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=l=>{var a;let o=l.target;!o||!((a=this.wrapperElement)!=null&&a.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))},s=l=>{var a;let o=l.target;!o||!((a=this.wrapperElement)!=null&&a.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]=s,document.addEventListener("focus",r,!0),document.addEventListener("blur",s,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var l,o,a;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(l=this.lastFocusedElement)==null?void 0:l.tagName,((o=this.lastFocusedElement)==null?void 0:o.id)||((a=this.lastFocusedElement)==null?void 0:a.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 c=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[c]||null,this.logger.debug("[Focus] Found by index:",c,t==null?void 0:t.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,t==null?void 0:t.tagName);if(!t){this.logger.debug("[Focus] Element not found in updated DOM");return}let n=t.matches(":focus");if(this.logger.debug("[Focus] Already focused:",n),n){this.logger.debug("[Focus] Element retained focus \u2014 skipping restoration");return}let r=this.lastFocusedSelectionStart,s=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&s!==null&&(t.setSelectionRange(r,s),this.logger.debug("[Focus] Restored cursor:",r,"-",s))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?Ae.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 Be=["pending","success","error","done"],Le=new Set(Be),ie=new Set(["click-away"]),Me={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Kt(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],s=Me[r];if(!s)return null;let l=n[2];if(ie.has(l)||!Le.has(l)&&!l.includes(":"))return null;let o=l.split(":"),a=o[o.length-1];if(!Le.has(a))return null;let c=a,d=o.length>1?o.slice(0,-1).join(":"):void 0;return{action:s,lifecycle:c,actionName:d||void 0,param:e||void 0}}return null}function B(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function se(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),s=t.substring(n+1);i.setAttribute(r,s)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function Vt(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function jt(i,e){let t=Object.keys(Me),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let o of t)n.push(`[lvt-el\\:${o}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${o}\\:on\\:${r}\\:${i}]`);let s=n.join(", "),l;try{l=document.querySelectorAll(s)}catch(o){let a=t.map(c=>`[lvt-el\\:${c}\\:on\\:${i}]`);try{l=document.querySelectorAll(a.join(", "))}catch(c){return}}l.forEach(o=>{Array.from(o.attributes).forEach(a=>{if(!a.name.startsWith("lvt-el:")||!a.name.includes(":on:"))return;let c=Kt(a.name,a.value);c&&Vt(c,i,e)&&se(B(o),c.action,c.param)})})}function oe(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),s=Me[r];s&&se(B(i),s,t.value)}}function Ke(i){return!Le.has(i)&&!ie.has(i)}function ae(){Be.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;jt(i,n)},!0)})}var qe=new Set(["pending","success","error","done"]),Ve=new WeakSet;function ze(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function Ge(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(l=>l.el.isConnected),s=l=>{var o;for(let a of l.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let c=ze(a.name);if(!c.trigger||qe.has(c.trigger)||ie.has(c.trigger))continue;let d=`__lvt_fx_${a.name}`;if(l[d])continue;let p=(o=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:o[1];if(!p)continue;let u=a.name,g=()=>{if(!l.hasAttribute(u))return;let v=l.getAttribute(u)||"",x=B(l);Y(x,p,v)};l.addEventListener(c.trigger,g),l[d]=g,r.push({el:l,event:c.trigger,handler:g,guardKey:d})}};s(i),i.querySelectorAll("*").forEach(s),t[n]=r}function Ye(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:s,guardKey:l})=>{n.removeEventListener(r,s),delete n[l]}),delete i[e])}function qt(i,e,t){let n=r=>{var s;for(let l of r.attributes){if(!l.name.startsWith("lvt-fx:"))continue;let o=ze(l.name);if(!o.trigger||!qe.has(o.trigger)||o.trigger!==e||o.actionName&&o.actionName!==t)continue;let a=(s=l.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];a&&Y(r,a,l.value)}};n(i),i.querySelectorAll("*").forEach(n)}function Y(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),s=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",l=i.style.backgroundColor,o=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=s,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=l,i.style.transition=o,i.__lvtHighlighting=!1;return}i.style.backgroundColor=l,setTimeout(()=>{i.isConnected&&(i.style.transition=o),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ve.has(i))break;Ve.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),s=t||"fade",l="";switch(s){case"fade":l=`lvt-fade-in ${r}ms ease-out`;break;case"slide":l=`lvt-slide-in ${r}ms ease-out`;break;case"scale":l=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${s}`)}if(!l)break;i.style.animation=l,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),s=zt.has(r)?r:"auto",l=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),o=t||"bottom";switch(o){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:s});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=l&&i.scrollTo({top:i.scrollHeight,behavior:s}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:s});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${o}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function Xe(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let s=l=>{var c;let a=(c=l.detail)==null?void 0:c.action;qt(i,r,a)};document.addEventListener(`lvt:${r}`,s,!0),t.push({event:`lvt:${r}`,handler:s})}),i.__lvtFxLifecycleListeners=t}function Je(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var zt=new Set(["auto","smooth","instant"]);function Qe(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&Y(e,"scroll",t)})}function Ze(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&Y(e,"highlight",t)})}function et(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&Y(e,"animate",t)}),Gt()}function Gt(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=`
|
|
2
2
|
@keyframes lvt-fade-in {
|
|
3
3
|
from { opacity: 0; }
|
|
4
4
|
to { opacity: 1; }
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
from { opacity: 0; transform: scale(0.95); }
|
|
12
12
|
to { opacity: 1; transform: scale(1); }
|
|
13
13
|
}
|
|
14
|
-
`,document.head.appendChild(i)}}var je="__lvtPendingProcessed";function tt(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[je]===t)return;e[je]=t;let n;try{n=JSON.parse(t)}catch(l){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",s=Yt(r);n.forEach(l=>{let o=Jt(l);s.appendChild(o),typeof l.dismissMS=="number"&&l.dismissMS>0&&setTimeout(()=>o.remove(),l.dismissMS)})})}function nt(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(s=>s.remove())};document[i]=t,document.addEventListener("click",t)}function Yt(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),Xt(e,i),document.body.appendChild(e)),e}function Xt(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function Jt(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}function X(i,e){let t=null;return function(...r){let s=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(s,r)},e)}}function ke(i,e){let t=!1;return function(...r){let s=this;t||(i.apply(s,r),t=!0,setTimeout(()=>{t=!1},e))}}function xe(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var it={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Qt=Object.keys(it),Zt=new Set(["mouseenter","mouseleave","focus","blur"]),rt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave"],le=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of rt){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=rt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let l=`__lvt_delegated_${s}_${n}`,o=document[l];o&&document.removeEventListener(s,o,!1);let a=c=>{var x;let d=this.context.getWrapperElement();if(!d)return;let p=c.target;if(this.logger.debug("Event listener triggered:",s,c.target),!p)return;let u=p,g=!1;for(;u;){if(u===d){g=!0;break}u=u.parentElement}if(!g)return;let v=`lvt-on:${s}`;for(u=p;u&&u!==d.parentElement;){let w=u.getAttribute(v),y=u,H=!1;if(!w&&s==="submit"&&u instanceof HTMLFormElement){let f=u.getAttribute("lvt-persist");f&&(w=`persist:${f}`,y=u)}if(!w&&s==="click"){let f=u instanceof HTMLButtonElement?u:null;f&&f.name&&!f.disabled&&f.type!=="reset"&&f.form===null&&!f.hasAttribute("commandfor")&&(w=f.name,y=f,H=!0)}if(!w&&s==="submit"&&u instanceof HTMLFormElement&&!u.hasAttribute("lvt-form:no-intercept")){let f=u.getAttribute("lvt-form:action"),C=c.submitter;f?w=f:C instanceof HTMLButtonElement&&C.name?w=C.name:u.getAttribute("name")?w=u.getAttribute("name"):w="submit",y=u,C&&(u.__lvtSubmitter=C);let k=u.closest("dialog");k&&((x=u.getAttribute("method"))==null?void 0:x.toLowerCase())==="dialog"&&(u.__lvtCloseDialog=k)}if(w!=null&&y){if(s==="submit"&&c.preventDefault(),(s==="keydown"||s==="keyup")&&y.hasAttribute("lvt-key")){let M=y.getAttribute("lvt-key");if(M&&c.key!==M){u=u.parentElement;continue}}let f=y,C=()=>{this.logger.debug("handleAction called",{action:w,eventType:s,targetElement:f});let M={action:w,data:{}};if(f instanceof HTMLFormElement){this.logger.debug("Processing form element");let L=new FormData(f),b=Array.from(f.querySelectorAll('input[type="checkbox"][name]')),S=new Map;b.forEach(h=>{let m=S.get(h.name)||[];m.push(h),S.set(h.name,m)}),S.forEach((h,m)=>{h.length===1?M.data[m]=h[0].checked:M.data[m]=h.filter(A=>A.checked).map(A=>A.value)});let N=new Set(Array.from(f.querySelectorAll('input[type="password"][name]')).map(h=>h.name)),O=f.__lvtSubmitter,U=O==null?void 0:O.name;L.forEach((h,m)=>{h instanceof File||U&&m===U||S.has(m)||(N.has(m)?M.data[m]=h:M.data[m]=this.context.parseValue(h))});let V=f.__lvtSubmitter;V&&(this.extractButtonData(V,M.data),delete f.__lvtSubmitter),this.logger.debug("Form data collected:",M.data)}else if(s==="change"||s==="input"||s==="search"){if(f instanceof HTMLInputElement){let L=f.name||"value";M.data[L]=this.context.parseValue(f.value)}else if(f instanceof HTMLSelectElement){let L=f.name||"value";M.data[L]=this.context.parseValue(f.value)}else if(f instanceof HTMLTextAreaElement){let L=f.name||"value";M.data[L]=this.context.parseValue(f.value)}}H&&this.extractButtonData(y,M.data),!(f instanceof HTMLFormElement)&&!H&&Array.from(y.attributes).forEach(L=>{if(L.name.startsWith("data-")&&L.name!=="data-key"&&L.name!=="data-lvt-id"){let b=L.name.slice(5);M.data[b]=this.context.parseValue(L.value)}});let _=null;if(s==="submit"&&f instanceof HTMLFormElement){let L=f.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(L).some(S=>S.files&&S.files.length>0)){let S=c.submitter;_=new FormData(f),S!=null&&S.name&&_.set(S.name,S.value),_.set("lvt-action",w)}}if(s==="submit"&&f instanceof HTMLFormElement){let b=c.submitter,S=null;b&&b.hasAttribute("lvt-form:disable-with")&&(S=b.textContent,b.disabled=!0,b.textContent=b.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(f,b||null,S),f.querySelectorAll('input[type="file"][lvt-upload]').forEach(O=>{let U=O.getAttribute("lvt-upload");U&&(this.logger.debug("Triggering pending uploads for:",U),this.context.triggerPendingUploads(U))}),f.dispatchEvent(new CustomEvent("lvt:pending",{detail:M})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",M),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),_!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(f,w,_);return}if(this.context.send(M),this.logger.debug("send() called"),f instanceof HTMLFormElement){let L=f.__lvtCloseDialog;L&&(L.close(),delete f.__lvtCloseDialog)}},k=y.getAttribute("lvt-mod:throttle"),I=y.getAttribute("lvt-mod:debounce");if((k||I)&&s!=="search"){r.has(y)||r.set(y,new Map);let M=r.get(y),_=`${s}:${w}`,L=`__lvt_callback_${_}`,b=y;b[L]||(b[L]={current:C}),b[L].current=C;let S=M.get(_);if(!S){let N=()=>b[L].current();if(k){let O=parseInt(k,10);S=ke(N,O)}else if(I){let O=parseInt(I,10);S=X(N,O)}S&&M.set(_,S)}S&&S()}else C();return}u=u.parentElement}};document[l]=a,document.addEventListener(s,a,!1),this.logger.debug("Registered event listener:",s,"with key:",l)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let l=`__lvt_window_${s}_${n}`,o=window[l];o&&window.removeEventListener(s,o);let a=c=>{let d=this.context.getWrapperElement();if(!d)return;let p=`lvt-on:window:${s}`;d.querySelectorAll(xe(p)).forEach(g=>{let v=g.getAttribute(p);if(!v)return;if((s==="keydown"||s==="keyup")&&g.hasAttribute("lvt-key")){let f=g.getAttribute("lvt-key");if(f&&c.key!==f)return}let x={action:v,data:{}};Array.from(g.attributes).forEach(f=>{if(f.name.startsWith("data-")&&f.name!=="data-key"&&f.name!=="data-lvt-id"){let C=f.name.slice(5);x.data[C]=this.context.parseValue(f.value)}});let w=g.getAttribute("lvt-mod:throttle"),y=g.getAttribute("lvt-mod:debounce"),H=()=>this.context.send(x);if(w||y){r.has(g)||r.set(g,new Map);let f=r.get(g),C=`window-${s}:${v}`,k=f.get(C);if(!k){if(w){let I=parseInt(w,10);k=ke(H,I)}else if(y){let I=parseInt(y,10);k=X(H,I)}k&&f.set(C,k)}k&&k()}else H()})};window[l]=a,window.addEventListener(s,a)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=l=>{let o=this.context.getWrapperElement();if(!o)return;let a=l.target,c=Qt.map(p=>xe(`lvt-el:${p}:on:click-away`)).join(", ");o.querySelectorAll(c).forEach(p=>{p.contains(a)||Array.from(p.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let g=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!g)return;let v=it[g[1].toLowerCase()];v&&se(B(p),v,u.value)})})};document[n]=s,document.addEventListener("click",s)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,s=t[r]||new Set,l=`__lvt_el_listeners_${n}`,o=(t[l]||[]).filter(d=>d.el.isConnected),a=e||t,c=d=>{let p=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let g=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!g)continue;let v=g[1].toLowerCase();Ke(v)&&p.add(v)}for(let u of p)if(Zt.has(u)){let g=`__lvt_el_${u}`;if(d[g])continue;let v=()=>oe(d,u);d.addEventListener(u,v),d[g]=v,o.push({el:d,event:u,handler:v,guardKey:g})}else if(!s.has(u)){let g=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${g}$`,"i"),x=w=>{let y=w.target;for(;y&&y!==t;){let H=!1;for(let f of y.attributes)if(v.test(f.name)){H=!0;break}if(H){oe(y,u);return}y=y.parentElement}y===t&&oe(t,u)};t.addEventListener(u,x),s.add(u),o.push({el:t,event:u,handler:x})}};c(a),a.querySelectorAll("*").forEach(c),t[l]=o,t[r]=s}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:l,event:o,handler:a,guardKey:c})=>{l.removeEventListener(o,a),c&&delete l[c]}),delete e[n]);let s=`__lvt_el_delegated_${t}`;delete e[s]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let s=o=>{let a=["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(a)).filter(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",g=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||typeof process!="undefined"&&!1;return u&&g&&v})},l=o=>{if(o.key!=="Tab")return;let a=this.context.getWrapperElement();if(!a)return;let c=a.querySelectorAll("[lvt-focus-trap]"),d=null;if(c.forEach(v=>{v.contains(document.activeElement)&&(!d||v.contains(d))&&(d=v)}),d||c.forEach(v=>{let x=v,w=window.getComputedStyle(x);w.display!=="none"&&w.visibility!=="hidden"&&(d=v)}),!d)return;let p=s(d);if(p.length===0)return;let u=p[0],g=p[p.length-1];o.shiftKey?document.activeElement===u&&(o.preventDefault(),g.focus()):document.activeElement===g&&(o.preventDefault(),u.focus())};document[n]=l,document.addEventListener("keydown",l),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let s=()=>{let o=this.context.getWrapperElement();if(!o)return;o.querySelectorAll("[lvt-autofocus]").forEach(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",g=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,x=u&&g&&v,w=d.getAttribute("data-lvt-autofocused")==="true";x&&!w?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!x&&w&&d.removeAttribute("data-lvt-autofocused")})};s();let l=new MutationObserver(o=>{let a=!1;o.forEach(c=>{c.type==="childList"&&c.addedNodes.length>0&&c.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(a=!0)}),c.type==="attributes"&&(c.target.hasAttribute("lvt-autofocus")||c.attributeName==="hidden"||c.attributeName==="style"||c.attributeName==="class")&&(a=!0)}),a&&s()});l.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=l,this.logger.debug("Autofocus delegation set up")}};function Ce(i){try{return i.matches(":popover-open")}catch(e){return!1}}var en=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>Ce(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function K(i){return en.find(e=>e.matches(i))}var tn=new Set(["show-modal","show-popover"]);function st(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let s=document.getElementById(r);if(!s)return;let l=K(s);if(l){if(tn.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!l.isOpen(s)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function ot(i){let e=i.target;e instanceof Element&&e.id&&K(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function at(i){let e=i.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 lt(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=K(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=K(e);t&&!t.isOpen(e)&&t.open(e)}}}function He(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=K(e);t&&(t.isOpen(e)||t.open(e))}function ct(i){let e=document.getElementById(i);return e?!!K(e):!1}function dt(i){let e=document.getElementById(i);if(!e)return;let t=K(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var ce=!1;function ut(){ce||(ce=!0,document.addEventListener("click",st),document.addEventListener("close",ot,!0),document.addEventListener("toggle",at,!0),window.addEventListener("popstate",lt),He())}function pt(){ce&&(ce=!1,document.removeEventListener("click",st),document.removeEventListener("close",ot,!0),document.removeEventListener("toggle",at,!0),window.removeEventListener("popstate",lt))}var de=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null;this.currentHref=window.location.href}teardownForWrapper(e){var r;if((r=this.abortController)==null||r.abort(),this.abortController=null,!e)return;let t=`__lvt_link_intercept_${e}`,n=document[t];n&&(document.removeEventListener("click",n,!1),delete document[t])}setup(e){this.currentHref=window.location.href;let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=l=>{var c;let o=(c=l.target)==null?void 0:c.closest("a[href]");if(!o)return;let a=this.context.getWrapperElement();if(!(!a||!a.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&&ct(d)&&(l.preventDefault(),dt(d));return}l.preventDefault(),this.navigate(o.href)}};document.addEventListener("click",s),document[n]=s,this.popstateListener||(this.popstateListener=()=>{let l=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,l)},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,a,c;let r=new URL(e,window.location.origin),s=new URL(n,window.location.origin);if(r.origin===s.origin&&r.pathname===s.pathname){if(r.search===s.search){(o=this.abortController)==null||o.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&((a=this.abortController)==null||a.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}(c=this.abortController)==null||c.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 p=await d.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(p)}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;window.location.href=e}}};var J=class J{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 ${J.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},J.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()}};J.LOAD_MORE_TIMEOUT_MS=3e4;var ue=J;var pe=class{constructor(){this.bar=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.style.cssText=`
|
|
14
|
+
`,document.head.appendChild(i)}}var je="__lvtPendingProcessed";function tt(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[je]===t)return;e[je]=t;let n;try{n=JSON.parse(t)}catch(l){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",s=Yt(r);n.forEach(l=>{let o=Jt(l);s.appendChild(o),typeof l.dismissMS=="number"&&l.dismissMS>0&&setTimeout(()=>o.remove(),l.dismissMS)})})}function nt(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(s=>s.remove())};document[i]=t,document.addEventListener("click",t)}function Yt(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),Xt(e,i),document.body.appendChild(e)),e}function Xt(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function Jt(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}function X(i,e){let t=null;return function(...r){let s=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(s,r)},e)}}function ke(i,e){let t=!1;return function(...r){let s=this;t||(i.apply(s,r),t=!0,setTimeout(()=>{t=!1},e))}}function xe(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var it={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Qt=Object.keys(it),Zt=new Set(["mouseenter","mouseleave","focus","blur"]),rt=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave"],le=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of rt){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=rt,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let l=`__lvt_delegated_${s}_${n}`,o=document[l];o&&document.removeEventListener(s,o,!1);let a=c=>{var x;let d=this.context.getWrapperElement();if(!d)return;let p=c.target;if(this.logger.debug("Event listener triggered:",s,c.target),!p)return;let u=p,g=!1;for(;u;){if(u===d){g=!0;break}u=u.parentElement}if(!g)return;let v=`lvt-on:${s}`;for(u=p;u&&u!==d.parentElement;){let w=u.getAttribute(v),y=u,C=!1;if(!w&&s==="submit"&&u instanceof HTMLFormElement){let f=u.getAttribute("lvt-persist");f&&(w=`persist:${f}`,y=u)}if(!w&&s==="click"){let f=u instanceof HTMLButtonElement?u:null;f&&f.name&&!f.disabled&&f.type!=="reset"&&f.form===null&&!f.hasAttribute("commandfor")&&(w=f.name,y=f,C=!0)}if(!w&&s==="submit"&&u instanceof HTMLFormElement&&!u.hasAttribute("lvt-form:no-intercept")){let f=u.getAttribute("lvt-form:action"),H=c.submitter;f?w=f:H instanceof HTMLButtonElement&&H.name?w=H.name:u.getAttribute("name")?w=u.getAttribute("name"):w="submit",y=u,H&&(u.__lvtSubmitter=H);let k=u.closest("dialog");k&&((x=u.getAttribute("method"))==null?void 0:x.toLowerCase())==="dialog"&&(u.__lvtCloseDialog=k)}if(w!=null&&y){if(s==="submit"&&c.preventDefault(),(s==="keydown"||s==="keyup")&&y.hasAttribute("lvt-key")){let M=y.getAttribute("lvt-key");if(M&&c.key!==M){u=u.parentElement;continue}}let f=y,H=()=>{this.logger.debug("handleAction called",{action:w,eventType:s,targetElement:f});let M={action:w,data:{}};if(f instanceof HTMLFormElement){this.logger.debug("Processing form element");let A=new FormData(f),b=Array.from(f.querySelectorAll('input[type="checkbox"][name]')),T=new Map;b.forEach(h=>{let m=T.get(h.name)||[];m.push(h),T.set(h.name,m)}),T.forEach((h,m)=>{h.length===1?M.data[m]=h[0].checked:M.data[m]=h.filter(L=>L.checked).map(L=>L.value)});let N=new Set(Array.from(f.querySelectorAll('input[type="password"][name]')).map(h=>h.name)),F=f.__lvtSubmitter,U=F==null?void 0:F.name;A.forEach((h,m)=>{h instanceof File||U&&m===U||T.has(m)||(N.has(m)?M.data[m]=h:M.data[m]=this.context.parseValue(h))});let V=f.__lvtSubmitter;V&&(this.extractButtonData(V,M.data),delete f.__lvtSubmitter),this.logger.debug("Form data collected:",M.data)}else if(s==="change"||s==="input"||s==="search"){if(f instanceof HTMLInputElement){let A=f.name||"value";M.data[A]=this.context.parseValue(f.value)}else if(f instanceof HTMLSelectElement){let A=f.name||"value";M.data[A]=this.context.parseValue(f.value)}else if(f instanceof HTMLTextAreaElement){let A=f.name||"value";M.data[A]=this.context.parseValue(f.value)}}C&&this.extractButtonData(y,M.data),!(f instanceof HTMLFormElement)&&!C&&Array.from(y.attributes).forEach(A=>{if(A.name.startsWith("data-")&&A.name!=="data-key"&&A.name!=="data-lvt-id"){let b=A.name.slice(5);M.data[b]=this.context.parseValue(A.value)}});let _=null;if(s==="submit"&&f instanceof HTMLFormElement){let A=f.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(A).some(T=>T.files&&T.files.length>0)){let T=c.submitter;_=new FormData(f),T!=null&&T.name&&_.set(T.name,T.value),_.set("lvt-action",w)}}if(s==="submit"&&f instanceof HTMLFormElement){let b=c.submitter,T=null;b&&b.hasAttribute("lvt-form:disable-with")&&(T=b.textContent,b.disabled=!0,b.textContent=b.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(f,b||null,T),f.querySelectorAll('input[type="file"][lvt-upload]').forEach(F=>{let U=F.getAttribute("lvt-upload");U&&(this.logger.debug("Triggering pending uploads for:",U),this.context.triggerPendingUploads(U))}),f.dispatchEvent(new CustomEvent("lvt:pending",{detail:M})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",M),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),_!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(f,w,_);return}if(this.context.send(M),this.logger.debug("send() called"),f instanceof HTMLFormElement){let A=f.__lvtCloseDialog;A&&(A.close(),delete f.__lvtCloseDialog)}},k=y.getAttribute("lvt-mod:throttle"),O=y.getAttribute("lvt-mod:debounce");if((k||O)&&s!=="search"){r.has(y)||r.set(y,new Map);let M=r.get(y),_=`${s}:${w}`,A=`__lvt_callback_${_}`,b=y;b[A]||(b[A]={current:H}),b[A].current=H;let T=M.get(_);if(!T){let N=()=>b[A].current();if(k){let F=parseInt(k,10);T=ke(N,F)}else if(O){let F=parseInt(O,10);T=X(N,F)}T&&M.set(_,T)}T&&T()}else H();return}u=u.parentElement}};document[l]=a,document.addEventListener(s,a,!1),this.logger.debug("Registered event listener:",s,"with key:",l)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(s=>{let l=`__lvt_window_${s}_${n}`,o=window[l];o&&window.removeEventListener(s,o);let a=c=>{let d=this.context.getWrapperElement();if(!d)return;let p=`lvt-on:window:${s}`;d.querySelectorAll(xe(p)).forEach(g=>{let v=g.getAttribute(p);if(!v)return;if((s==="keydown"||s==="keyup")&&g.hasAttribute("lvt-key")){let f=g.getAttribute("lvt-key");if(f&&c.key!==f)return}let x={action:v,data:{}};Array.from(g.attributes).forEach(f=>{if(f.name.startsWith("data-")&&f.name!=="data-key"&&f.name!=="data-lvt-id"){let H=f.name.slice(5);x.data[H]=this.context.parseValue(f.value)}});let w=g.getAttribute("lvt-mod:throttle"),y=g.getAttribute("lvt-mod:debounce"),C=()=>this.context.send(x);if(w||y){r.has(g)||r.set(g,new Map);let f=r.get(g),H=`window-${s}:${v}`,k=f.get(H);if(!k){if(w){let O=parseInt(w,10);k=ke(C,O)}else if(y){let O=parseInt(y,10);k=X(C,O)}k&&f.set(H,k)}k&&k()}else C()})};window[l]=a,window.addEventListener(s,a)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=l=>{let o=this.context.getWrapperElement();if(!o)return;let a=l.target,c=Qt.map(p=>xe(`lvt-el:${p}:on:click-away`)).join(", ");o.querySelectorAll(c).forEach(p=>{p.contains(a)||Array.from(p.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let g=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!g)return;let v=it[g[1].toLowerCase()];v&&se(B(p),v,u.value)})})};document[n]=s,document.addEventListener("click",s)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,s=t[r]||new Set,l=`__lvt_el_listeners_${n}`,o=(t[l]||[]).filter(d=>d.el.isConnected),a=e||t,c=d=>{let p=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let g=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!g)continue;let v=g[1].toLowerCase();Ke(v)&&p.add(v)}for(let u of p)if(Zt.has(u)){let g=`__lvt_el_${u}`;if(d[g])continue;let v=()=>oe(d,u);d.addEventListener(u,v),d[g]=v,o.push({el:d,event:u,handler:v,guardKey:g})}else if(!s.has(u)){let g=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${g}$`,"i"),x=w=>{let y=w.target;for(;y&&y!==t;){let C=!1;for(let f of y.attributes)if(v.test(f.name)){C=!0;break}if(C){oe(y,u);return}y=y.parentElement}y===t&&oe(t,u)};t.addEventListener(u,x),s.add(u),o.push({el:t,event:u,handler:x})}};c(a),a.querySelectorAll("*").forEach(c),t[l]=o,t[r]=s}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:l,event:o,handler:a,guardKey:c})=>{l.removeEventListener(o,a),c&&delete l[c]}),delete e[n]);let s=`__lvt_el_delegated_${t}`;delete e[s]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let s=o=>{let a=["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(a)).filter(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",g=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||typeof process!="undefined"&&!1;return u&&g&&v})},l=o=>{if(o.key!=="Tab")return;let a=this.context.getWrapperElement();if(!a)return;let c=a.querySelectorAll("[lvt-focus-trap]"),d=null;if(c.forEach(v=>{v.contains(document.activeElement)&&(!d||v.contains(d))&&(d=v)}),d||c.forEach(v=>{let x=v,w=window.getComputedStyle(x);w.display!=="none"&&w.visibility!=="hidden"&&(d=v)}),!d)return;let p=s(d);if(p.length===0)return;let u=p[0],g=p[p.length-1];o.shiftKey?document.activeElement===u&&(o.preventDefault(),g.focus()):document.activeElement===g&&(o.preventDefault(),u.focus())};document[n]=l,document.addEventListener("keydown",l),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let s=()=>{let o=this.context.getWrapperElement();if(!o)return;o.querySelectorAll("[lvt-autofocus]").forEach(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",g=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,x=u&&g&&v,w=d.getAttribute("data-lvt-autofocused")==="true";x&&!w?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!x&&w&&d.removeAttribute("data-lvt-autofocused")})};s();let l=new MutationObserver(o=>{let a=!1;o.forEach(c=>{c.type==="childList"&&c.addedNodes.length>0&&c.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(a=!0)}),c.type==="attributes"&&(c.target.hasAttribute("lvt-autofocus")||c.attributeName==="hidden"||c.attributeName==="style"||c.attributeName==="class")&&(a=!0)}),a&&s()});l.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=l,this.logger.debug("Autofocus delegation set up")}};function He(i){try{return i.matches(":popover-open")}catch(e){return!1}}var en=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>He(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function K(i){return en.find(e=>e.matches(i))}var tn=new Set(["show-modal","show-popover"]);function st(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let s=document.getElementById(r);if(!s)return;let l=K(s);if(l){if(tn.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!l.isOpen(s)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function ot(i){let e=i.target;e instanceof Element&&e.id&&K(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function at(i){let e=i.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 lt(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=K(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=K(e);t&&!t.isOpen(e)&&t.open(e)}}}function Ce(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=K(e);t&&(t.isOpen(e)||t.open(e))}function ct(i){let e=document.getElementById(i);return e?!!K(e):!1}function dt(i){let e=document.getElementById(i);if(!e)return;let t=K(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var ce=!1;function ut(){ce||(ce=!0,document.addEventListener("click",st),document.addEventListener("close",ot,!0),document.addEventListener("toggle",at,!0),window.addEventListener("popstate",lt),Ce())}function pt(){ce&&(ce=!1,document.removeEventListener("click",st),document.removeEventListener("close",ot,!0),document.removeEventListener("toggle",at,!0),window.removeEventListener("popstate",lt))}var de=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null;this.currentHref=window.location.href}teardownForWrapper(e){var r;if((r=this.abortController)==null||r.abort(),this.abortController=null,!e)return;let t=`__lvt_link_intercept_${e}`,n=document[t];n&&(document.removeEventListener("click",n,!1),delete document[t])}setup(e){this.currentHref=window.location.href;let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let s=l=>{var c;let o=(c=l.target)==null?void 0:c.closest("a[href]");if(!o)return;let a=this.context.getWrapperElement();if(!(!a||!a.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&&ct(d)&&(l.preventDefault(),dt(d));return}l.preventDefault(),this.navigate(o.href)}};document.addEventListener("click",s),document[n]=s,this.popstateListener||(this.popstateListener=()=>{let l=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,l)},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,a,c;let r=new URL(e,window.location.origin),s=new URL(n,window.location.origin);if(r.origin===s.origin&&r.pathname===s.pathname){if(r.search===s.search){(o=this.abortController)==null||o.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&((a=this.abortController)==null||a.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}(c=this.abortController)==null||c.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 p=await d.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(p)}catch(d){if(d instanceof DOMException&&d.name==="AbortError")return;window.location.href=e}}};var J=class J{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 ${J.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},J.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()}};J.LOAD_MORE_TIMEOUT_MS=3e4;var ue=J;var pe=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 ge=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!1})})}};var gt=!1;function nn(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),s=document.getElementById(n);s&&(s instanceof HTMLDialogElement?r==="show-modal"&&!s.open?s.showModal():r==="close"&&s.open&&s.close():s instanceof HTMLElement&&s.hasAttribute("popover")&&(r==="show-popover"&&typeof s.showPopover=="function"?s.showPopover():r==="hide-popover"&&typeof s.hidePopover=="function"?s.hidePopover():r==="toggle-popover"&&typeof s.togglePopover=="function"&&s.togglePopover()))}function ft(){"commandForElement"in HTMLButtonElement.prototype||gt||(gt=!0,document.addEventListener("click",nn))}var z="__lvt_scroll_away",R=[];function rn(){for(let i=R.length-1;i>=0;i--){let e=R[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[z],R.splice(i,1))}}function mt(i){rn();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=B(t);if(!r||r===t){let p=t[z];p&&(p.target.removeEventListener("scroll",p.handler),ht(p),delete t[z]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let s=t[z];if(s){if(s.target===r)return;s.target.removeEventListener("scroll",s.handler),ht(s)}let l=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),o=isNaN(l)?200:l,a=!1,c=()=>{a||(a=!0,requestAnimationFrame(()=>{a=!1,r.scrollHeight-r.scrollTop-r.clientHeight>o?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",c,{passive:!0}),c();let d={trigger:t,target:r,handler:c};t[z]=d,R.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function ht(i){let e=R.indexOf(i);e!==-1&&R.splice(e,1)}function vt(i){for(let e=R.length-1;e>=0;e--){let t=R[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[z],R.splice(e,1))}}function yt(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function sn(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function _e(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(sn(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&_e(r,e+1))return!0}return!1}function on(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(_e(i)&&!_e(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var fe=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e){let t=!1;for(let[r,s]of Object.entries(e))if(Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string"){let o=this.treeState[r];o&&typeof o=="object"&&!Array.isArray(o)&&Array.isArray(o.d)&&Array.isArray(o.s)?(this.treeState[r]=yt(o),this.applyDifferentialOpsToRange(this.treeState[r],s,r)):this.treeState[r]=s,t=!0}else{let o=this.treeState[r],a=typeof s=="object"&&s!==null&&!Array.isArray(s)?this.deepMergeTreeNodes(o,s,r):s;JSON.stringify(o)!==JSON.stringify(a)&&(this.treeState[r]=a,t=!0)}return{html:this.reconstructFromTree(this.treeState,""),changed:t}}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}deepMergeTreeNodes(e,t,n=""){var s;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(on(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[l,o]of Object.entries(t)){let a=n?`${n}.${l}`:l,c=Array.isArray(o)&&o.length>0&&Array.isArray(o[0])&&typeof o[0][0]=="string",d=r[l]&&typeof r[l]=="object"&&!Array.isArray(r[l])&&Array.isArray(r[l].d)&&Array.isArray(r[l].s);c&&d?(r[l]=yt(r[l]),this.logger.debug(`[deepMerge] Applying diff ops at path ${a}`,{ops:o,rangeItems:(s=r[l].d)==null?void 0:s.length}),this.applyDifferentialOpsToRange(r[l],o,a)):typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof r[l]=="object"&&r[l]!==null&&!Array.isArray(r[l])?r[l]=this.deepMergeTreeNodes(r[l],o,a):r[l]=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 s of t){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let o=s[1],a=this.findItemIndexByKey(r,o,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${o}, index=${a}, total=${r.length}`),a>=0?(r.splice(a,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,s[1],e.s,n),a=s[2];o>=0&&a&&(r[o]=this.mergeRangeItem(r[o],a,n));break}case"a":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.push(...o),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[n]=s[3].idKey);break}case"p":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.unshift(...o);break}case"i":{let o=this.findItemIndexByKey(r,s[1],e.s,n);if(o>=0){let a=Array.isArray(s[2])?s[2]:[s[2]];r.splice(o+1,0,...a)}break}case"o":{let o=s[1],a=[],c=new Map;for(let d of r){let p=this.getItemKey(d,e.s,n);p&&c.set(p,d)}for(let d of o){let p=c.get(d);p&&a.push(p)}r.length=0,r.push(...a);break}default:break}}this.rangeState[n]={items:r,statics:e.s,staticsMap:e.sm}}reconstructFromTree(e,t){if(e.s&&Array.isArray(e.s)){let n="";for(let r=0;r<e.s.length;r++){let s=e.s[r];if(n+=s,r<e.s.length-1){let l=r.toString();if(e[l]!==void 0){let o=t?`${t}.${l}`:l;n+=this.renderValue(e[l],l,o)}}}return n=n.replace(/<root>/g,"").replace(/<\/root>/g,""),n}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 l=n||t||"";return l&&(this.rangeState[l]={items:e.d,statics:e.s,staticsMap:e.sm},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[l]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),s=r.filter(l=>/^\d+$/.test(l)).sort((l,o)=>parseInt(l)-parseInt(o));if(s.length>0&&s.length===r.length)return s.map(l=>{let o=n?`${n}.${l}`:l;return this.renderValue(e[l],l,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,s)=>{let l=s.toString(),o=n?`${n}.${l}`:l;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,o):this.renderValue(r,l,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,sm:l}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let a="else",c=n?`${n}.else`:"else";return this.renderValue(e.else,a,c)}return""}let o=l&&typeof l=="object";return s&&Array.isArray(s)?r.map((a,c)=>{let d=s;o&&a._sk&&l[a._sk]&&(d=l[a._sk]);let p="";for(let u=0;u<d.length;u++)if(p+=d[u],u<d.length-1){let g=u.toString();if(a[g]!==void 0){let v=n?`${n}.${c}.${g}`:`${c}.${g}`;p+=this.renderValue(a[g],g,v)}}return p}).join(""):r.map((a,c)=>{let d=c.toString(),p=n?`${n}.${d}`:d;return this.renderValue(a,d,p)}).join("")}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],s=n.statics;for(let o of e){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let c=this.findItemIndexByKey(r,o[1],s,t);c>=0&&r.splice(c,1);break}case"u":{let c=this.findItemIndexByKey(r,o[1],s,t),d=o[2];c>=0&&d&&(r[c]=this.mergeRangeItem(r[c],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 c=this.findItemIndexByKey(r,o[1],s,t);if(c>=0){let d=Array.isArray(o[2])?o[2]:[o[2]];r.splice(c+1,0,...d)}break}case"o":{let c=o[1],d=[],p=new Map;for(let u of r){let g=this.getItemKey(u,s,t);g&&p.set(g,u)}for(let u of c){let g=p.get(u);g&&d.push(g)}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 l=this.getCurrentRangeStructure(t);return l&&l.s?this.renderItemsWithStatics(r,l.s,l.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 s=e.map((l,o)=>{let a=t;n&&typeof n=="object"&&l._sk&&n[l._sk]&&(a=n[l._sk]);let c="";for(let d=0;d<a.length;d++)if(c+=a[d],d<a.length-1){let p=d.toString();if(l[p]!==void 0){let u=r?`${r}.${o}.${p}`:`${o}.${p}`;c+=this.renderValue(l[p],p,u)}}return c}).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:",s.substring(0,200))),s}addItemsToRange(e,t,n,r,s){if(n&&(r.statics=n),!t)return;let l=Array.isArray(t)?t:[t];s?e.unshift(...l):e.push(...l)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(s=>this.getItemKey(s,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var he=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 me=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let s=this.escapeCSSSelector(n),l=e.querySelectorAll(`[name="${s}"]`);for(let o of l){if(this.wiredElements.has(o)||o.hasAttribute("lvt-input")||o.hasAttribute("lvt-change"))continue;let a=o.closest("form");a&&(a.hasAttribute("lvt-change")||a.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 s=n.getAttribute("name");s&&(this.attachListener(n,s,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],s=this.detectBinding(n,r);s&&!this.boundFields.has(s.fieldName)&&this.boundFields.set(s.fieldName,s.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let s=r[1].toLowerCase();return s!=="checkbox"&&s!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),s=r?parseInt(r,10):NaN,l=Number.isNaN(s)||s<0?300:s,a=X(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},l),c=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(c,a),this.elementCleanups.set(e,()=>{e.removeEventListener(c,a)}),this.logger.debug(`Auto-wired ${c} listener on [name="${t}"] (debounce: ${l}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,a,c,d,p;this.clearReconnectTimer();let e=(o=this.options.maxReconnectAttempts)!=null?o:10;if(e>0&&this.reconnectAttempts>=e){(c=(a=this.options).onReconnectFailed)==null||c.call(a);return}this.reconnectAttempts++;let t=(d=this.options.reconnectDelay)!=null?d:1e3,n=(p=this.options.maxReconnectDelay)!=null?p:16e3,r=t*Math.pow(2,this.reconnectAttempts-1),s=Math.random()*1e3,l=Math.min(r+s,n);this.reconnectTimer=window.setTimeout(()=>{var u,g;(g=(u=this.options).onReconnectAttempt)==null||g.call(u,this.reconnectAttempts,l),this.connect()},l)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},ve=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 ln(e,this.config.logger))return{usingWebSocket:!1,initialState:await bt(e,this.config.logger)};let n,r,s=new Promise((p,u)=>{n=p,r=u}),l=!1,o=!1,a=null,c=p=>{l||(l=!0,a!==null&&(clearTimeout(a),a=null),p?r(p):n({usingWebSocket:!0}))};a=setTimeout(()=>{c(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(),c()},onMessage:p=>{try{let u=JSON.parse(p.data);this.config.onMessage(u,p)}catch(u){this.config.logger.error("Failed to parse WebSocket message:",u)}},onClose:()=>{o?this.config.onDisconnected():c(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(p,u)=>{var g,v;(v=(g=this.config).onReconnectAttempt)==null||v.call(g,p,u)},onReconnectFailed:()=>{var p,u;(u=(p=this.config).onReconnectFailed)==null||u.call(p)},onError:p=>{var u,g;(g=(u=this.config).onError)==null||g.call(u,p),c(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await s}catch(p){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",p),(d=this.transport)==null||d.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await bt(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 ln(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e==null||e.warn("Failed to check WebSocket availability:",t),!0}}async function bt(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e==null||e.warn("Failed to fetch initial state:",t),null}}var ye=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let s=new XMLHttpRequest;s.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",()=>{s.abort()});let l=new Promise((o,a)=>{s.addEventListener("load",()=>{s.status>=200&&s.status<300?(e.done=!0,e.progress=100,o()):a(new Error(`S3 upload failed with status ${s.status}: ${s.statusText}`))}),s.addEventListener("error",()=>{a(new Error("S3 upload failed: Network error"))}),s.addEventListener("abort",()=>{a(new Error("S3 upload cancelled"))})});if(s.open("PUT",t.url),t.headers)for(let[o,a]of Object.entries(t.headers))s.setRequestHeader(o,a);s.send(r),await l}catch(s){throw e.error=s instanceof Error?s.message:String(s),s}}};var be=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 ye)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let s=this.inputHandlers.get(n);s&&n.removeEventListener("change",s);let l=o=>{let a=o.target.files;!a||a.length===0||this.startUpload(r,Array.from(a))};n.addEventListener("change",l),this.inputHandlers.set(n,l)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(s=>({name:s.name,type:s.type||"application/octet-stream",size:s.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 s=new Map;for(let o of r)s.set(o.name,o);let l=[];for(let o of n){let a=s.get(o.client_name);if(!a){console.warn(`No file found for entry ${o.entry_id} (client_name: ${o.client_name})`);continue}let c={id:o.entry_id,file:a,uploadName:t,progress:0,bytesUploaded:0,valid:o.valid,done:!1,error:o.error,external:o.external};if(this.entries.set(c.id,c),l.push(c),!o.valid){this.onError&&o.error&&this.onError(c,o.error);continue}o.auto_upload&&(o.external?this.uploadExternal(c,o.external):this.uploadChunked(c))}}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 l=Math.min(r+this.chunkSize,t.size),o=t.slice(r,l),a=await this.fileToBase64(o),c={action:"upload_chunk",entry_id:n,chunk_base64:a,offset:r,total:t.size};this.sendMessage(c),r=l,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let s={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(s),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(s){let l=s instanceof Error?s.message:String(s);e.error=l,this.onError&&this.onError(e,l),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,s]of this.entries)e&&s.uploadName!==e||(s.done||s.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let l=r.result.split(",")[1];t(l)},r.onerror=n,r.readAsDataURL(e)})}};var Et={silent:0,error:1,warn:2,info:3,debug:4},wt="LiveTemplate",Oe=class i{constructor(e,t=[],n=console){this.state=e;this.scope=t;this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return Et[e]<=Et[this.state.level]}formatPrefix(){return this.scope.length===0?`[${wt}]`:`[${wt}:${this.scope.join(":")}]`}};function Ie(i={}){var n,r;let e={level:(n=i.level)!=null?n:"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new Oe(e,t,(r=i.sink)!=null?r:console)}async function St(i,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let s=t("fs"),l=JSON.parse(s.readFileSync(e,"utf8"));return i.applyUpdate(l)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function Tt(i,e){let t=[],n=c=>c.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(i),s=n(e);if(r===s)return{match:!0,differences:[]};let l=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 ge=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(s=>{s.disabled=!1})})}};var gt=!1;function nn(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),s=document.getElementById(n);s&&(s instanceof HTMLDialogElement?r==="show-modal"&&!s.open?s.showModal():r==="close"&&s.open&&s.close():s instanceof HTMLElement&&s.hasAttribute("popover")&&(r==="show-popover"&&typeof s.showPopover=="function"?s.showPopover():r==="hide-popover"&&typeof s.hidePopover=="function"?s.hidePopover():r==="toggle-popover"&&typeof s.togglePopover=="function"&&s.togglePopover()))}function ft(){"commandForElement"in HTMLButtonElement.prototype||gt||(gt=!0,document.addEventListener("click",nn))}var z="__lvt_scroll_away",D=[];function rn(){for(let i=D.length-1;i>=0;i--){let e=D[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[z],D.splice(i,1))}}function mt(i){rn();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 p=t[z];p&&(p.target.removeEventListener("scroll",p.handler),ht(p),delete t[z]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let s=t[z];if(s){if(s.target===r)return;s.target.removeEventListener("scroll",s.handler),ht(s)}let l=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),o=isNaN(l)?200:l,a=!1,c=()=>{a||(a=!0,requestAnimationFrame(()=>{a=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>o?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",c,{passive:!0}),c();let d={trigger:t,target:r,handler:c};t[z]=d,D.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function ht(i){let e=D.indexOf(i);e!==-1&&D.splice(e,1)}function vt(i){for(let e=D.length-1;e>=0;e--){let t=D[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[z],D.splice(e,1))}}function yt(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function sn(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function _e(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(sn(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&_e(r,e+1))return!0}return!1}function on(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(_e(i)&&!_e(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var fe=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e){let t=!1;for(let[r,s]of Object.entries(e))if(Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string"){let o=this.treeState[r];o&&typeof o=="object"&&!Array.isArray(o)&&Array.isArray(o.d)&&Array.isArray(o.s)?(this.treeState[r]=yt(o),this.applyDifferentialOpsToRange(this.treeState[r],s,r)):this.treeState[r]=s,t=!0}else{let o=this.treeState[r],a=typeof s=="object"&&s!==null&&!Array.isArray(s)?this.deepMergeTreeNodes(o,s,r):s;JSON.stringify(o)!==JSON.stringify(a)&&(this.treeState[r]=a,t=!0)}return{html:this.reconstructFromTree(this.treeState,""),changed:t}}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}deepMergeTreeNodes(e,t,n=""){var s;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(on(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[l,o]of Object.entries(t)){let a=n?`${n}.${l}`:l,c=Array.isArray(o)&&o.length>0&&Array.isArray(o[0])&&typeof o[0][0]=="string",d=r[l]&&typeof r[l]=="object"&&!Array.isArray(r[l])&&Array.isArray(r[l].d)&&Array.isArray(r[l].s);c&&d?(r[l]=yt(r[l]),this.logger.debug(`[deepMerge] Applying diff ops at path ${a}`,{ops:o,rangeItems:(s=r[l].d)==null?void 0:s.length}),this.applyDifferentialOpsToRange(r[l],o,a)):typeof o=="object"&&o!==null&&!Array.isArray(o)&&typeof r[l]=="object"&&r[l]!==null&&!Array.isArray(r[l])?r[l]=this.deepMergeTreeNodes(r[l],o,a):r[l]=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 s of t){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let o=s[1],a=this.findItemIndexByKey(r,o,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${o}, index=${a}, total=${r.length}`),a>=0?(r.splice(a,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,s[1],e.s,n),a=s[2];o>=0&&a&&(r[o]=this.mergeRangeItem(r[o],a,n));break}case"a":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.push(...o),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[n]=s[3].idKey);break}case"p":{let o=Array.isArray(s[1])?s[1]:[s[1]];s[2]&&(e.s=s[2]),r.unshift(...o);break}case"i":{let o=this.findItemIndexByKey(r,s[1],e.s,n);if(o>=0){let a=Array.isArray(s[2])?s[2]:[s[2]];r.splice(o+1,0,...a)}break}case"o":{let o=s[1],a=[],c=new Map;for(let d of r){let p=this.getItemKey(d,e.s,n);p&&c.set(p,d)}for(let d of o){let p=c.get(d);p&&a.push(p)}r.length=0,r.push(...a);break}default:break}}this.rangeState[n]={items:r,statics:e.s,staticsMap:e.sm}}reconstructFromTree(e,t){if(e.s&&Array.isArray(e.s)){let n="";for(let r=0;r<e.s.length;r++){let s=e.s[r];if(n+=s,r<e.s.length-1){let l=r.toString();if(e[l]!==void 0){let o=t?`${t}.${l}`:l;n+=this.renderValue(e[l],l,o)}}}return n=n.replace(/<root>/g,"").replace(/<\/root>/g,""),n}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 l=n||t||"";return l&&(this.rangeState[l]={items:e.d,statics:e.s,staticsMap:e.sm},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[l]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),s=r.filter(l=>/^\d+$/.test(l)).sort((l,o)=>parseInt(l)-parseInt(o));if(s.length>0&&s.length===r.length)return s.map(l=>{let o=n?`${n}.${l}`:l;return this.renderValue(e[l],l,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,s)=>{let l=s.toString(),o=n?`${n}.${l}`:l;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,o):this.renderValue(r,l,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,sm:l}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let a="else",c=n?`${n}.else`:"else";return this.renderValue(e.else,a,c)}return""}let o=l&&typeof l=="object";return s&&Array.isArray(s)?r.map((a,c)=>{let d=s;o&&a._sk&&l[a._sk]&&(d=l[a._sk]);let p="";for(let u=0;u<d.length;u++)if(p+=d[u],u<d.length-1){let g=u.toString();if(a[g]!==void 0){let v=n?`${n}.${c}.${g}`:`${c}.${g}`;p+=this.renderValue(a[g],g,v)}}return p}).join(""):r.map((a,c)=>{let d=c.toString(),p=n?`${n}.${d}`:d;return this.renderValue(a,d,p)}).join("")}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],s=n.statics;for(let o of e){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let c=this.findItemIndexByKey(r,o[1],s,t);c>=0&&r.splice(c,1);break}case"u":{let c=this.findItemIndexByKey(r,o[1],s,t),d=o[2];c>=0&&d&&(r[c]=this.mergeRangeItem(r[c],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 c=this.findItemIndexByKey(r,o[1],s,t);if(c>=0){let d=Array.isArray(o[2])?o[2]:[o[2]];r.splice(c+1,0,...d)}break}case"o":{let c=o[1],d=[],p=new Map;for(let u of r){let g=this.getItemKey(u,s,t);g&&p.set(g,u)}for(let u of c){let g=p.get(u);g&&d.push(g)}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 l=this.getCurrentRangeStructure(t);return l&&l.s?this.renderItemsWithStatics(r,l.s,l.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 s=e.map((l,o)=>{let a=t;n&&typeof n=="object"&&l._sk&&n[l._sk]&&(a=n[l._sk]);let c="";for(let d=0;d<a.length;d++)if(c+=a[d],d<a.length-1){let p=d.toString();if(l[p]!==void 0){let u=r?`${r}.${o}.${p}`:`${o}.${p}`;c+=this.renderValue(l[p],p,u)}}return c}).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:",s.substring(0,200))),s}addItemsToRange(e,t,n,r,s){if(n&&(r.statics=n),!t)return;let l=Array.isArray(t)?t:[t];s?e.unshift(...l):e.push(...l)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(s=>this.getItemKey(s,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var he=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 me=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let s=this.escapeCSSSelector(n),l=e.querySelectorAll(`[name="${s}"]`);for(let o of l){if(this.wiredElements.has(o)||o.hasAttribute("lvt-input")||o.hasAttribute("lvt-change"))continue;let a=o.closest("form");a&&(a.hasAttribute("lvt-change")||a.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 s=n.getAttribute("name");s&&(this.attachListener(n,s,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],s=this.detectBinding(n,r);s&&!this.boundFields.has(s.fieldName)&&this.boundFields.set(s.fieldName,s.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let s=r[1].toLowerCase();return s!=="checkbox"&&s!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),s=r?parseInt(r,10):NaN,l=Number.isNaN(s)||s<0?300:s,a=X(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},l),c=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(c,a),this.elementCleanups.set(e,()=>{e.removeEventListener(c,a)}),this.logger.debug(`Auto-wired ${c} listener on [name="${t}"] (debounce: ${l}ms)`)}};var Re=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,a,c,d,p;this.clearReconnectTimer();let e=(o=this.options.maxReconnectAttempts)!=null?o:10;if(e>0&&this.reconnectAttempts>=e){(c=(a=this.options).onReconnectFailed)==null||c.call(a);return}this.reconnectAttempts++;let t=(d=this.options.reconnectDelay)!=null?d:1e3,n=(p=this.options.maxReconnectDelay)!=null?p:16e3,r=t*Math.pow(2,this.reconnectAttempts-1),s=Math.random()*1e3,l=Math.min(r+s,n);this.reconnectTimer=window.setTimeout(()=>{var u,g;(g=(u=this.options).onReconnectAttempt)==null||g.call(u,this.reconnectAttempts,l),this.connect()},l)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},ve=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 ln(e,this.config.logger))return{usingWebSocket:!1,initialState:await bt(e,this.config.logger)};let n,r,s=new Promise((p,u)=>{n=p,r=u}),l=!1,o=!1,a=null,c=p=>{l||(l=!0,a!==null&&(clearTimeout(a),a=null),p?r(p):n({usingWebSocket:!0}))};a=setTimeout(()=>{c(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Re({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{o=!0,this.config.onConnected(),c()},onMessage:p=>{try{let u=JSON.parse(p.data);this.config.onMessage(u,p)}catch(u){this.config.logger.error("Failed to parse WebSocket message:",u)}},onClose:()=>{o?this.config.onDisconnected():c(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(p,u)=>{var g,v;(v=(g=this.config).onReconnectAttempt)==null||v.call(g,p,u)},onReconnectFailed:()=>{var p,u;(u=(p=this.config).onReconnectFailed)==null||u.call(p)},onError:p=>{var u,g;(g=(u=this.config).onError)==null||g.call(u,p),c(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await s}catch(p){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",p),(d=this.transport)==null||d.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await bt(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 ln(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e==null||e.warn("Failed to check WebSocket availability:",t),!0}}async function bt(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e==null||e.warn("Failed to fetch initial state:",t),null}}var ye=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let s=new XMLHttpRequest;s.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",()=>{s.abort()});let l=new Promise((o,a)=>{s.addEventListener("load",()=>{s.status>=200&&s.status<300?(e.done=!0,e.progress=100,o()):a(new Error(`S3 upload failed with status ${s.status}: ${s.statusText}`))}),s.addEventListener("error",()=>{a(new Error("S3 upload failed: Network error"))}),s.addEventListener("abort",()=>{a(new Error("S3 upload cancelled"))})});if(s.open("PUT",t.url),t.headers)for(let[o,a]of Object.entries(t.headers))s.setRequestHeader(o,a);s.send(r),await l}catch(s){throw e.error=s instanceof Error?s.message:String(s),s}}};var be=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 ye)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let s=this.inputHandlers.get(n);s&&n.removeEventListener("change",s);let l=o=>{let a=o.target.files;!a||a.length===0||this.startUpload(r,Array.from(a))};n.addEventListener("change",l),this.inputHandlers.set(n,l)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(s=>({name:s.name,type:s.type||"application/octet-stream",size:s.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 s=new Map;for(let o of r)s.set(o.name,o);let l=[];for(let o of n){let a=s.get(o.client_name);if(!a){console.warn(`No file found for entry ${o.entry_id} (client_name: ${o.client_name})`);continue}let c={id:o.entry_id,file:a,uploadName:t,progress:0,bytesUploaded:0,valid:o.valid,done:!1,error:o.error,external:o.external};if(this.entries.set(c.id,c),l.push(c),!o.valid){this.onError&&o.error&&this.onError(c,o.error);continue}o.auto_upload&&(o.external?this.uploadExternal(c,o.external):this.uploadChunked(c))}}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 l=Math.min(r+this.chunkSize,t.size),o=t.slice(r,l),a=await this.fileToBase64(o),c={action:"upload_chunk",entry_id:n,chunk_base64:a,offset:r,total:t.size};this.sendMessage(c),r=l,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let s={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(s),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(s){let l=s instanceof Error?s.message:String(s);e.error=l,this.onError&&this.onError(e,l),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,s]of this.entries)e&&s.uploadName!==e||(s.done||s.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let l=r.result.split(",")[1];t(l)},r.onerror=n,r.readAsDataURL(e)})}};var Et={silent:0,error:1,warn:2,info:3,debug:4},wt="LiveTemplate",Fe=class i{constructor(e,t=[],n=console){this.state=e;this.scope=t;this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return Et[e]<=Et[this.state.level]}formatPrefix(){return this.scope.length===0?`[${wt}]`:`[${wt}:${this.scope.join(":")}]`}};function Oe(i={}){var n,r;let e={level:(n=i.level)!=null?n:"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new Fe(e,t,(r=i.sink)!=null?r:console)}async function Tt(i,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let s=t("fs"),l=JSON.parse(s.readFileSync(e,"utf8"));return i.applyUpdate(l)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function St(i,e){let t=[],n=c=>c.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(i),s=n(e);if(r===s)return{match:!0,differences:[]};let l=r.split(`
|
|
30
30
|
`),o=s.split(`
|
|
31
|
-
`),a=Math.max(l.length,o.length);for(let c=0;c<a;c++){let d=l[c]||"",p=o[c]||"";d!==p&&(t.push(`Line ${c+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${p}`))}return{match:!1,differences:t}}var Ee=class i{constructor(e={}){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;let{logger:t,logLevel:n,debug:r,...s}=e,l=n!=null?n:r?"debug":"info",o=t!=null?t:Ie({level:l});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(l),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new fe(this.logger.child("TreeRenderer")),this.focusManager=new re(this.logger.child("FocusManager")),this.formLifecycleManager=new he,this.loadingIndicator=new pe,this.formDisabler=new ge,this.uploadHandler=new be(a=>this.send(a),{chunkSize:256*1024,onProgress:a=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:a}}))},onComplete:(a,c)=>{this.logger.info(`Upload complete: ${a}`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:a,entries:c}}))},onError:(a,c)=>{this.logger.error(`Upload error for ${a.id}:`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:a,error:c}}))}}),this.eventDelegator=new le({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:a=>this.parseValue(a),send:a=>this.send(a),sendHTTPMultipart:(a,c,d)=>this.sendHTTPMultipart(a,c,d),setActiveSubmission:(a,c,d)=>this.formLifecycleManager.setActiveSubmission(a,c,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:a=>this.uploadHandler.triggerPendingUploads(a)},this.logger.child("EventDelegator")),this.linkInterceptor=new de({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:a=>this.handleNavigationResponse(a),sendNavigate:a=>this.sendNavigate(a),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new ue({getWrapperElement:()=>this.wrapperElement,send:a=>this.send(a)},this.logger.child("ObserverManager")),this.changeAutoWirer=new me({getWrapperElement:()=>this.wrapperElement,send:a=>this.send(a)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new ve({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var a,c,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(c=(a=this.options).onConnect)==null||c.call(a),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var a,c,d;this.ws=null,this.logger.info("WebSocket disconnected"),(c=(a=this.options).onDisconnect)==null||c.call(a),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(a,c)=>{this.handleWebSocketPayload(a,c)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:a=>{var c,d;this.logger.error("WebSocket error:",a),(d=(c=this.options).onError)==null||d.call(c,a)}})}static autoInit(){let e=Ie({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new i;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(l=>{e.error("Auto-initialization connect failed:",l)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,s,l;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(a){this.logger.error("Error handling upload start response:",a)}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,He()),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:(s=e.meta)==null?void 0:s.action,success:(l=e.meta)==null?void 0:l.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(),nt(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ae(),ft(),ut(),Xe(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.eventDelegator.teardownDOMEventTriggerDelegation(),pt(),this.wrapperElement&&(Ye(this.wrapperElement),Je(this.wrapperElement),vt(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),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}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((l,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]=l});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let l=this.webSocketManager.getReadyState();return l===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:l}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:l}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let l=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,l.tree,l.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}handleNavigationResponse(e){var a;if(!this.wrapperElement)return;let n=new DOMParser().parseFromString(e,"text/html"),r=this.wrapperElement.getAttribute("data-lvt-id"),s=(a=n.querySelector("title"))==null?void 0:a.textContent;s&&(document.title=s);let l=n.querySelector("[data-lvt-id]");if(l){let c=l.getAttribute("data-lvt-id");if(!c){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",c),this.wrapperElement.replaceChildren(...Array.from(l.childNodes).map(u=>u.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="${c.replace(/[\\"]/g,"\\$&")}"]`;this.connect(g).catch(v=>{d===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",v),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(c=>c.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 c=e.match(/data-lvt-id="([^"]+)"/);c&&(this.lvtId=c[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let a=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${a}</body>`)}updateDOM(e,t,n){let r=this.applyUpdate(t),s=a=>!a||typeof a!="object"?!1:a.s&&Array.isArray(a.s)?!0:Object.values(a).some(c=>s(c));if(!r.changed&&!s(t))return;let l=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 a=e.tagName.toLowerCase(),c=a==="body"||a==="html"?"div":a,p=new DOMParser().parseFromString(`<${c}>${r.html}</${c}>`,"text/html"),u=p.body.firstElementChild;u?l.replaceChildren(...Array.from(u.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),l.replaceChildren(...Array.from(p.body.childNodes)))}else l.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",l.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",l.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",l.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",l.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!l.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}Pe(e,l,{childrenOnly:!0,getNodeKey:a=>{if(a.nodeType===1)return a.getAttribute("data-key")||a.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(a,c)=>{if(a.nodeType===Node.ELEMENT_NODE&&a.hasAttribute("lvt-ignore")&&!c.hasAttribute("data-lvt-force-update"))return!1;if(a.nodeType===Node.ELEMENT_NODE&&a.hasAttribute("lvt-ignore-attrs")&&!c.hasAttribute("data-lvt-force-update")&&c.nodeType===Node.ELEMENT_NODE){let d=a.attributes,p=c;for(let u=0;u<d.length;u++){let g=d[u];p.hasAttributeNS(g.namespaceURI,g.localName)||p.setAttributeNS(g.namespaceURI,g.name,g.value)}}if(a instanceof HTMLDataListElement&&!c.hasAttribute("data-lvt-force-update")){let d=document.activeElement;if(d instanceof HTMLInputElement&&d.list===a)return!1}return a instanceof HTMLDialogElement&&a.hasAttribute("open")&&!c.hasAttribute("data-lvt-force-update")&&c.setAttribute("open",""),!c.hasAttribute("data-lvt-force-update")&&a instanceof HTMLElement&&a.hasAttribute("popover")&&Ce(a)||(a instanceof HTMLInputElement&&c instanceof HTMLInputElement&&(a.type==="checkbox"||a.type==="radio")&&(c.hasAttribute("data-lvt-force-update")?(a.checked=c.checked,a.type==="checkbox"&&(a.indeterminate=c.indeterminate),a.removeAttribute("data-lvt-force-update")):(c.checked=a.checked,a.checked?c.setAttribute("checked",""):c.removeAttribute("checked"),a.type==="checkbox"&&(c.indeterminate=a.indeterminate))),this.focusManager.shouldSkipUpdate(a))?!1:a.isEqualNode(c)?!(!c.hasAttribute("data-lvt-force-update")&&(c.children.length===0||c.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(a,"lvt-updated"),!0)},onElUpdated:a=>{var c;a instanceof HTMLTextAreaElement&&(a.value=(c=a.textContent)!=null?c:""),a instanceof HTMLElement&&a.hasAttribute("data-lvt-force-update")&&a.removeAttribute("data-lvt-force-update")},onNodeAdded:a=>{var c;a instanceof HTMLTextAreaElement&&(a.value=(c=a.textContent)!=null?c:""),a instanceof HTMLElement&&a.hasAttribute("data-lvt-force-update")&&a.removeAttribute("data-lvt-force-update"),a.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(a,"lvt-mounted")},onBeforeNodeDiscarded:a=>(a.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(a,"lvt-destroyed"),!0)}),this.focusManager.restoreFocusedElement(),Qe(e),Ze(e),et(e),Ge(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),mt(e),tt(e),this.uploadHandler.initializeFileInputs(e),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}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"&&Ee.autoInit();return Ct(cn);})();
|
|
31
|
+
`),a=Math.max(l.length,o.length);for(let c=0;c<a;c++){let d=l[c]||"",p=o[c]||"";d!==p&&(t.push(`Line ${c+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${p}`))}return{match:!1,differences:t}}var Ee=class i{constructor(e={}){this.lvtId=null;this.ws=null;this.wrapperElement=null;this.useHTTP=!1;this.sessionCookie=null;this.rateLimitedHandlers=new WeakMap;this.isInitialized=!1;this.messageCount=0;this.navigationEpoch=0;this.liveUrlOverride=null;this.visibilityHandlerAttached=!1;this.hiddenAt=0;this.reconnecting=!1;this.visibilityHandler=null;this.pageshowHandler=null;this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...s}=e,l=n!=null?n:r?"debug":"info",o=t!=null?t:Oe({level:l});t?n?t.setLevel(n):r&&t.setLevel("debug"):o.setLevel(l),this.logger=o.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...s},this.treeRenderer=new fe(this.logger.child("TreeRenderer")),this.focusManager=new re(this.logger.child("FocusManager")),this.formLifecycleManager=new he,this.loadingIndicator=new pe,this.formDisabler=new ge,this.uploadHandler=new be(a=>this.send(a),{chunkSize:256*1024,onProgress:a=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:a}}))},onComplete:(a,c)=>{this.logger.info(`Upload complete: ${a}`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:a,entries:c}}))},onError:(a,c)=>{this.logger.error(`Upload error for ${a.id}:`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:a,error:c}}))}}),this.eventDelegator=new le({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:a=>this.parseValue(a),send:a=>this.send(a),sendHTTPMultipart:(a,c,d)=>this.sendHTTPMultipart(a,c,d),setActiveSubmission:(a,c,d)=>this.formLifecycleManager.setActiveSubmission(a,c,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:a=>this.uploadHandler.triggerPendingUploads(a)},this.logger.child("EventDelegator")),this.linkInterceptor=new de({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:a=>this.handleNavigationResponse(a),sendNavigate:a=>this.sendNavigate(a),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new ue({getWrapperElement:()=>this.wrapperElement,send:a=>this.send(a)},this.logger.child("ObserverManager")),this.changeAutoWirer=new me({getWrapperElement:()=>this.wrapperElement,send:a=>this.send(a)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new ve({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var a,c,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(c=(a=this.options).onConnect)==null||c.call(a),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var a,c,d;this.ws=null,this.logger.info("WebSocket disconnected"),(c=(a=this.options).onDisconnect)==null||c.call(a),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(a,c)=>{this.handleWebSocketPayload(a,c)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:a=>{var c,d;this.logger.error("WebSocket error:",a),(d=(c=this.options).onError)==null||d.call(c,a)}})}static autoInit(){let e=Oe({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new i;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(l=>{e.error("Auto-initialization connect failed:",l)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,s,l;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(a){this.logger.error("Error handling upload start response:",a)}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,Ce()),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:(s=e.meta)==null?void 0:s.action,success:(l=e.meta)==null?void 0:l.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(),nt(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ae(),ft(),ut(),Xe(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(),pt(),this.wrapperElement&&(Ye(this.wrapperElement),Je(this.wrapperElement),vt(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),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((l,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]=l});let s=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let l=this.webSocketManager.getReadyState();return l===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:l}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:l}),!1}return this.liveUrlOverride=s,this.webSocketManager.setLiveUrl(s),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),s=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!s.ok)throw new Error(`HTTP multipart request failed: ${s.status}`);let l=await s.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,l.tree,l.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}handleNavigationResponse(e){var a;if(!this.wrapperElement)return;let n=new DOMParser().parseFromString(e,"text/html"),r=this.wrapperElement.getAttribute("data-lvt-id"),s=(a=n.querySelector("title"))==null?void 0:a.textContent;s&&(document.title=s);let l=n.querySelector("[data-lvt-id]");if(l){let c=l.getAttribute("data-lvt-id");if(!c){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",c),this.wrapperElement.replaceChildren(...Array.from(l.childNodes).map(u=>u.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="${c.replace(/[\\"]/g,"\\$&")}"]`;this.connect(g).catch(v=>{d===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",v),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(c=>c.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 c=e.match(/data-lvt-id="([^"]+)"/);c&&(this.lvtId=c[1])}let r=n.html;if(!e.match(/<body>([\s\S]*?)<\/body>/))return e;let a=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${a}</body>`)}updateDOM(e,t,n){let r=this.applyUpdate(t),s=a=>!a||typeof a!="object"?!1:a.s&&Array.isArray(a.s)?!0:Object.values(a).some(c=>s(c));if(!r.changed&&!s(t))return;let l=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 a=e.tagName.toLowerCase(),c=a==="body"||a==="html"?"div":a,p=new DOMParser().parseFromString(`<${c}>${r.html}</${c}>`,"text/html"),u=p.body.firstElementChild;u?l.replaceChildren(...Array.from(u.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),l.replaceChildren(...Array.from(p.body.childNodes)))}else l.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",l.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",l.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",l.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",l.innerHTML.includes("<tr")));let o=document.activeElement;if(o instanceof HTMLInputElement&&o.list instanceof HTMLDataListElement&&!l.querySelector("[data-lvt-force-update]")){this.logger.debug("[updateDOM] deferred: datalist input focused"),this.focusManager.restoreFocusedElement();return}Pe(e,l,{childrenOnly:!0,getNodeKey:a=>{if(a.nodeType===1)return a.getAttribute("data-key")||a.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(a,c)=>{if(a.nodeType===Node.ELEMENT_NODE&&a.hasAttribute("lvt-ignore")&&!c.hasAttribute("data-lvt-force-update"))return!1;if(a.nodeType===Node.ELEMENT_NODE&&a.hasAttribute("lvt-ignore-attrs")&&!c.hasAttribute("data-lvt-force-update")&&c.nodeType===Node.ELEMENT_NODE){let d=a.attributes,p=c;for(let u=0;u<d.length;u++){let g=d[u];p.hasAttributeNS(g.namespaceURI,g.localName)||p.setAttributeNS(g.namespaceURI,g.name,g.value)}}if(a instanceof HTMLDataListElement&&!c.hasAttribute("data-lvt-force-update")){let d=document.activeElement;if(d instanceof HTMLInputElement&&d.list===a)return!1}return a instanceof HTMLDialogElement&&a.hasAttribute("open")&&!c.hasAttribute("data-lvt-force-update")&&c.setAttribute("open",""),!c.hasAttribute("data-lvt-force-update")&&a instanceof HTMLElement&&a.hasAttribute("popover")&&He(a)||(a instanceof HTMLInputElement&&c instanceof HTMLInputElement&&(a.type==="checkbox"||a.type==="radio")&&(c.hasAttribute("data-lvt-force-update")?(a.checked=c.checked,a.type==="checkbox"&&(a.indeterminate=c.indeterminate),a.removeAttribute("data-lvt-force-update")):(c.checked=a.checked,a.checked?c.setAttribute("checked",""):c.removeAttribute("checked"),a.type==="checkbox"&&(c.indeterminate=a.indeterminate))),this.focusManager.shouldSkipUpdate(a))?!1:a.isEqualNode(c)?!(!c.hasAttribute("data-lvt-force-update")&&(c.children.length===0||c.querySelector("[data-lvt-force-update]")===null)):(this.executeLifecycleHook(a,"lvt-updated"),!0)},onElUpdated:a=>{var c;a instanceof HTMLTextAreaElement&&(a.value=(c=a.textContent)!=null?c:""),a instanceof HTMLElement&&a.hasAttribute("data-lvt-force-update")&&a.removeAttribute("data-lvt-force-update")},onNodeAdded:a=>{var c;a instanceof HTMLTextAreaElement&&(a.value=(c=a.textContent)!=null?c:""),a instanceof HTMLElement&&a.hasAttribute("data-lvt-force-update")&&a.removeAttribute("data-lvt-force-update"),a.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(a,"lvt-mounted")},onBeforeNodeDiscarded:a=>(a.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(a,"lvt-destroyed"),!0)}),this.focusManager.restoreFocusedElement(),Qe(e),Ze(e),et(e),Ge(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),mt(e),tt(e),this.uploadHandler.initializeFileInputs(e),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}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"&&Ee.autoInit();return Ht(cn);})();
|
|
32
32
|
//# sourceMappingURL=livetemplate-client.browser.js.map
|