@livetemplate/client 0.8.25 → 0.8.27

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.
@@ -2,11 +2,19 @@ import type { Logger } from "../utils/logger";
2
2
  export interface LinkInterceptorContext {
3
3
  getWrapperElement(): Element | null;
4
4
  handleNavigationResponse(html: string): void;
5
+ sendNavigate(href: string): boolean;
6
+ canSendNavigate(): boolean;
5
7
  }
6
8
  /**
7
9
  * Intercepts <a> clicks within the LiveTemplate wrapper for SPA navigation.
8
- * Same-origin links are fetched via fetch() and the wrapper content is replaced.
9
- * External links, target="_blank", download, and lvt-nav:no-intercept are skipped.
10
+ *
11
+ * - Same pathname (query-string change only) -> sends __navigate__ over WS;
12
+ * no fetch, no DOM replace, no reconnect.
13
+ * - Different pathname (cross-handler or just different route) -> fetches
14
+ * new HTML and hands it to handleNavigationResponse, which decides
15
+ * between same-handler DOM replace and cross-handler reconnect.
16
+ * - External links, target="_blank", download, and lvt-nav:no-intercept
17
+ * are skipped.
10
18
  *
11
19
  * Uses AbortController to cancel in-flight fetches when a new navigation
12
20
  * starts (rapid clicks, back/forward during fetch).
@@ -16,6 +24,7 @@ export declare class LinkInterceptor {
16
24
  private readonly logger;
17
25
  private popstateListener;
18
26
  private abortController;
27
+ private currentHref;
19
28
  constructor(context: LinkInterceptorContext, logger: Logger);
20
29
  /**
21
30
  * Remove the click listener registered by setup() for a specific
@@ -1 +1 @@
1
- {"version":3,"file":"link-interceptor.d.ts","sourceRoot":"","sources":["../../dom/link-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,IAAI,OAAO,GAAG,IAAI,CAAC;IACpC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,eAAe,CAAgC;gBAGpC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,MAAM;IAGjC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAmBlD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAiC7B,OAAO,CAAC,UAAU;YAkBJ,QAAQ;CAiCvB"}
1
+ {"version":3,"file":"link-interceptor.d.ts","sourceRoot":"","sources":["../../dom/link-interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,WAAW,sBAAsB;IACrC,iBAAiB,IAAI,OAAO,GAAG,IAAI,CAAC;IACpC,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAO7C,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAKpC,eAAe,IAAI,OAAO,CAAC;CAC5B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,eAAe;IAaxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbzB,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,eAAe,CAAgC;IAQvD,OAAO,CAAC,WAAW,CAAgC;gBAGhC,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,MAAM;IAGjC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAmBlD,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA6C7B,OAAO,CAAC,UAAU;YAwBJ,QAAQ;CA6FvB"}
@@ -3,8 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.LinkInterceptor = void 0;
4
4
  /**
5
5
  * Intercepts <a> clicks within the LiveTemplate wrapper for SPA navigation.
6
- * Same-origin links are fetched via fetch() and the wrapper content is replaced.
7
- * External links, target="_blank", download, and lvt-nav:no-intercept are skipped.
6
+ *
7
+ * - Same pathname (query-string change only) -> sends __navigate__ over WS;
8
+ * no fetch, no DOM replace, no reconnect.
9
+ * - Different pathname (cross-handler or just different route) -> fetches
10
+ * new HTML and hands it to handleNavigationResponse, which decides
11
+ * between same-handler DOM replace and cross-handler reconnect.
12
+ * - External links, target="_blank", download, and lvt-nav:no-intercept
13
+ * are skipped.
8
14
  *
9
15
  * Uses AbortController to cancel in-flight fetches when a new navigation
10
16
  * starts (rapid clicks, back/forward during fetch).
@@ -15,6 +21,14 @@ class LinkInterceptor {
15
21
  this.logger = logger;
16
22
  this.popstateListener = null;
17
23
  this.abortController = null;
24
+ // Tracks the URL that was last successfully navigated to (or the initial
25
+ // page URL). Updated after each in-band __navigate__ push and after each
26
+ // fetch-based navigation. The popstate handler uses this to compare the
27
+ // target URL against the URL we were actually at *before* the browser
28
+ // changed window.location, because by the time popstate fires, the browser
29
+ // has already moved window.location to the target — making a naive
30
+ // window.location comparison always look like a same-URL no-op.
31
+ this.currentHref = window.location.href;
18
32
  }
19
33
  /**
20
34
  * Remove the click listener registered by setup() for a specific
@@ -44,6 +58,11 @@ class LinkInterceptor {
44
58
  }
45
59
  }
46
60
  setup(wrapper) {
61
+ // Refresh currentHref so the popstate handler compares against the URL
62
+ // that is actually showing when this setup runs, not a stale value from
63
+ // a previous navigation or from construction time (which may predate the
64
+ // first history.replaceState in tests and cross-handler nav re-setups).
65
+ this.currentHref = window.location.href;
47
66
  const wrapperId = wrapper.getAttribute("data-lvt-id");
48
67
  const listenerKey = `__lvt_link_intercept_${wrapperId}`;
49
68
  const existing = document[listenerKey];
@@ -67,7 +86,13 @@ class LinkInterceptor {
67
86
  // Handle back/forward navigation
68
87
  if (!this.popstateListener) {
69
88
  this.popstateListener = () => {
70
- this.navigate(window.location.href, false);
89
+ // Capture the URL we were at *before* the browser moved to the new
90
+ // history entry. This lets navigate() compare pathname+search against
91
+ // the previous URL rather than window.location (which already reflects
92
+ // the target after popstate fires).
93
+ const prevHref = this.currentHref;
94
+ this.currentHref = window.location.href;
95
+ this.navigate(window.location.href, false, prevHref);
71
96
  };
72
97
  window.addEventListener("popstate", this.popstateListener);
73
98
  }
@@ -94,7 +119,64 @@ class LinkInterceptor {
94
119
  return true;
95
120
  return false;
96
121
  }
97
- async navigate(href, pushState = true) {
122
+ // prevHref is the URL the client was at *before* this navigation.
123
+ // For link clicks (pushState=true) it defaults to window.location.href,
124
+ // which is correct because pushState hasn't run yet. For popstate
125
+ // (pushState=false) the popstate listener supplies the saved currentHref
126
+ // so the same-pathname comparison reflects the real previous entry, not
127
+ // window.location (which the browser already updated to the target).
128
+ async navigate(href, pushState = true, prevHref = window.location.href) {
129
+ const targetURL = new URL(href, window.location.origin);
130
+ const refURL = new URL(prevHref, window.location.origin);
131
+ const samePath = targetURL.origin === refURL.origin &&
132
+ targetURL.pathname === refURL.pathname;
133
+ if (samePath) {
134
+ const sameSearch = targetURL.search === refURL.search;
135
+ if (sameSearch) {
136
+ // Hash-only change or exact same URL — the browser handles scroll
137
+ // to the anchor; no server round-trip is needed. This also correctly
138
+ // handles popstate for hash-only back/forward because the popstate
139
+ // listener passes prevHref (the previous entry), so refURL reflects
140
+ // where we came from rather than the already-updated window.location.
141
+ //
142
+ // Still abort any in-flight cross-path fetch: if a fetch was in
143
+ // progress when the user clicked a hash anchor, we don't want it
144
+ // to resolve and call handleNavigationResponse unexpectedly.
145
+ this.abortController?.abort();
146
+ this.abortController = null;
147
+ return;
148
+ }
149
+ // __navigate__ fast path: same pathname, different search, WS mode.
150
+ // Only for explicit forward navigation (pushState=true / link clicks).
151
+ // For popstate (pushState=false) the search difference is real (it
152
+ // compares against the previous entry via prevHref), but back/forward
153
+ // must restore prior page state via a full fetch, not a WS message
154
+ // that only forwards query data to Mount.
155
+ if (pushState && this.context.canSendNavigate()) {
156
+ // Abort any in-flight fetch even on the fast path: a user could
157
+ // click a cross-path link (starting a fetch) and quickly click a
158
+ // same-pathname link. Without aborting, the earlier fetch can
159
+ // still resolve and call handleNavigationResponse, racing with the
160
+ // in-band __navigate__ update.
161
+ this.abortController?.abort();
162
+ this.abortController = null;
163
+ // sendNavigate returns true if the WS message was actually sent.
164
+ // Push history state ONLY on success to keep window.location
165
+ // consistent with what the server received.
166
+ // If sent === false (defensive path — normally unreachable since
167
+ // canSendNavigate() already checked readyState), fall through to
168
+ // the normal fetch so the navigation isn't silently dropped.
169
+ const sent = this.context.sendNavigate(href);
170
+ if (sent) {
171
+ window.history.pushState(null, "", href);
172
+ this.currentHref = href;
173
+ return;
174
+ }
175
+ // sendNavigate returned false — fall through to fetch as recovery.
176
+ }
177
+ // HTTP mode, WS not OPEN, sendNavigate returned false, or popstate:
178
+ // fall through to normal fetch. pushState is handled downstream.
179
+ }
98
180
  // Cancel any in-flight navigation fetch
99
181
  this.abortController?.abort();
100
182
  this.abortController = new AbortController();
@@ -115,6 +197,7 @@ class LinkInterceptor {
115
197
  if (pushState) {
116
198
  window.history.pushState(null, "", href);
117
199
  }
200
+ this.currentHref = href;
118
201
  this.context.handleNavigationResponse(html);
119
202
  }
120
203
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"link-interceptor.js","sourceRoot":"","sources":["../../dom/link-interceptor.ts"],"names":[],"mappings":";;;AAOA;;;;;;;GAOG;AACH,MAAa,eAAe;IAI1B,YACmB,OAA+B,EAC/B,MAAc;QADd,YAAO,GAAP,OAAO,CAAwB;QAC/B,WAAM,GAAN,MAAM,CAAQ;QALzB,qBAAgB,GAAwB,IAAI,CAAC;QAC7C,oBAAe,GAA2B,IAAI,CAAC;IAKpD,CAAC;IAEJ;;;;;;;;OAQG;IACH,kBAAkB,CAAC,SAAwB;QACzC,qEAAqE;QACrE,oEAAoE;QACpE,2DAA2D;QAC3D,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,MAAM,WAAW,GAAG,wBAAwB,SAAS,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAI,QAAgB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,qDAAqD;YACrD,yDAAyD;YACzD,uBAAuB;YACvB,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvD,OAAQ,QAAgB,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAgB;QACpB,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,wBAAwB,SAAS,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAI,QAAgB,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,CAAQ,EAAE,EAAE;YAC5B,MAAM,MAAM,GAAI,CAAC,CAAC,MAAkB,EAAE,OAAO,CAAC,SAAS,CAA6B,CAAC;YACrF,IAAI,CAAC,MAAM;gBAAE,OAAO;YAEpB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO;YAEhE,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO;YAEpC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,QAAgB,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;QAE1C,iCAAiC;QACjC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,gBAAgB,GAAG,GAAG,EAAE;gBAC3B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC7C,CAAC,CAAC;YACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,IAAuB;QACxC,iBAAiB;QACjB,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACxD,mCAAmC;QACnC,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACxD,iBAAiB;QACjB,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAC/C,0CAA0C;QAC1C,IAAI,IAAI,CAAC,YAAY,CAAC,sBAAsB,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3D,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACzE,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE/D,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,IAAY,EAAE,YAAqB,IAAI;QAC5D,wCAAwC;QACxC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE7C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE;gBACjC,WAAW,EAAE,SAAS;gBACtB,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE;gBAChC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;aACpC,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC5B,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,4DAA4D;YAC5D,0DAA0D;YAC1D,6DAA6D;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,iEAAiE;YACjE,IAAI,CAAC,YAAY,YAAY,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;gBAAE,OAAO;YACjE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AAzHD,0CAyHC"}
1
+ {"version":3,"file":"link-interceptor.js","sourceRoot":"","sources":["../../dom/link-interceptor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- "use strict";var LiveTemplateClient=(()=>{var ye=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var dt=(o,e)=>{for(var t in e)ye(o,t,{get:e[t],enumerable:!0})},ut=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of lt(e))!ct.call(o,r)&&r!==t&&ye(o,r,{get:()=>e[r],enumerable:!(n=at(e,r))||n.enumerable});return o};var pt=o=>ut(ye({},"__esModule",{value:!0}),o);var Bt={};dt(Bt,{LiveTemplateClient:()=>me,compareHTML:()=>ot,loadAndApplyUpdate:()=>st,setupReactiveAttributeListeners:()=>ie});var _e=11;function gt(o,e){var t=e.attributes,n,r,i,a,s;if(!(e.nodeType===_e||o.nodeType===_e)){for(var l=t.length-1;l>=0;l--)n=t[l],r=n.name,i=n.namespaceURI,a=n.value,i?(r=n.localName||r,s=o.getAttributeNS(i,r),s!==a&&(n.prefix==="xmlns"&&(r=n.name),o.setAttributeNS(i,r,a))):(s=o.getAttribute(r),s!==a&&o.setAttribute(r,a));for(var c=o.attributes,d=c.length-1;d>=0;d--)n=c[d],r=n.name,i=n.namespaceURI,i?(r=n.localName||r,e.hasAttributeNS(i,r)||o.removeAttributeNS(i,r)):e.hasAttribute(r)||o.removeAttribute(r)}}var J,ft="http://www.w3.org/1999/xhtml",I=typeof document=="undefined"?void 0:document,ht=!!I&&"content"in I.createElement("template"),mt=!!I&&I.createRange&&"createContextualFragment"in I.createRange();function vt(o){var e=I.createElement("template");return e.innerHTML=o,e.content.childNodes[0]}function yt(o){J||(J=I.createRange(),J.selectNode(I.body));var e=J.createContextualFragment(o);return e.childNodes[0]}function bt(o){var e=I.createElement("body");return e.innerHTML=o,e.childNodes[0]}function Et(o){return o=o.trim(),ht?vt(o):mt?yt(o):bt(o)}function Q(o,e){var t=o.nodeName,n=e.nodeName,r,i;return t===n?!0:(r=t.charCodeAt(0),i=n.charCodeAt(0),r<=90&&i>=97?t===n.toUpperCase():i<=90&&r>=97?n===t.toUpperCase():!1)}function wt(o,e){return!e||e===ft?I.createElement(o):I.createElementNS(e,o)}function Tt(o,e){for(var t=o.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function be(o,e,t){o[t]!==e[t]&&(o[t]=e[t],o[t]?o.setAttribute(t,""):o.removeAttribute(t))}var Fe={OPTION:function(o,e){var t=o.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(o.hasAttribute("selected")&&!e.selected&&(o.setAttribute("selected","selected"),o.removeAttribute("selected")),t.selectedIndex=-1)}be(o,e,"selected")},INPUT:function(o,e){be(o,e,"checked"),be(o,e,"disabled"),o.value!==e.value&&(o.value=e.value),e.hasAttribute("value")||o.removeAttribute("value")},TEXTAREA:function(o,e){var t=e.value;o.value!==t&&(o.value=t);var n=o.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==o.placeholder)return;n.nodeValue=t}},SELECT:function(o,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=o.firstChild,i,a;r;)if(a=r.nodeName&&r.nodeName.toUpperCase(),a==="OPTGROUP")i=r,r=i.firstChild,r||(r=i.nextSibling,i=null);else{if(a==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&i&&(r=i.nextSibling,i=null)}o.selectedIndex=t}}},V=1,Ie=11,He=3,Oe=8;function W(){}function St(o){if(o)return o.getAttribute&&o.getAttribute("id")||o.id}function At(o){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var i=n;n=I.createElement("html"),n.innerHTML=i}else n=Et(n);else n.nodeType===Ie&&(n=n.firstElementChild);var a=r.getNodeKey||St,s=r.onBeforeNodeAdded||W,l=r.onNodeAdded||W,c=r.onBeforeElUpdated||W,d=r.onElUpdated||W,p=r.onBeforeNodeDiscarded||W,u=r.onNodeDiscarded||W,f=r.onBeforeElChildrenUpdated||W,v=r.skipFromChildren||W,k=r.addChild||function(h,m){return h.appendChild(m)},w=r.childrenOnly===!0,y=Object.create(null),_=[];function g(h){_.push(h)}function C(h,m){if(h.nodeType===V)for(var M=h.firstChild;M;){var E=void 0;m&&(E=a(M))?g(E):(u(M),M.firstChild&&C(M,m)),M=M.nextSibling}}function x(h,m,M){p(h)!==!1&&(m&&m.removeChild(h),u(h),C(h,M))}function O(h){if(h.nodeType===V||h.nodeType===Ie)for(var m=h.firstChild;m;){var M=a(m);M&&(y[M]=m),O(m),m=m.nextSibling}}O(t);function G(h){l(h);for(var m=h.firstChild;m;){var M=m.nextSibling,E=a(m);if(E){var T=y[E];T&&Q(m,T)?(m.parentNode.replaceChild(T,m),F(T,m)):G(m)}else G(m);m=M}}function L(h,m,M){for(;m;){var E=m.nextSibling;(M=a(m))?g(M):x(m,h,!0),m=E}}function F(h,m,M){var E=a(m);if(E&&delete y[E],!M){var T=c(h,m);if(T===!1||(T instanceof HTMLElement&&(h=T,O(h)),o(h,m),d(h),f(h,m)===!1))return}h.nodeName!=="TEXTAREA"?A(h,m):Fe.TEXTAREA(h,m)}function A(h,m){var M=v(h,m),E=m.firstChild,T=h.firstChild,B,D,K,X,U;e:for(;E;){for(X=E.nextSibling,B=a(E);!M&&T;){if(K=T.nextSibling,E.isSameNode&&E.isSameNode(T)){E=X,T=K;continue e}D=a(T);var Y=T.nodeType,$=void 0;if(Y===E.nodeType&&(Y===V?(B?B!==D&&((U=y[B])?K===U?$=!1:(h.insertBefore(U,T),D?g(D):x(T,h,!0),T=U,D=a(T)):$=!1):D&&($=!1),$=$!==!1&&Q(T,E),$&&F(T,E)):(Y===He||Y==Oe)&&($=!0,T.nodeValue!==E.nodeValue&&(T.nodeValue=E.nodeValue))),$){E=X,T=K;continue e}D?g(D):x(T,h,!0),T=K}if(B&&(U=y[B])&&Q(U,E))M||k(h,U),F(U,E);else{var ve=s(E);ve!==!1&&(ve&&(E=ve),E.actualize&&(E=E.actualize(h.ownerDocument||I)),k(h,E),G(E))}E=X,T=K}L(h,T,D);var Ce=Fe[h.nodeName];Ce&&Ce(h,m)}var b=t,S=b.nodeType,R=n.nodeType;if(!w){if(S===V)R===V?Q(t,n)||(u(t),b=Tt(t,wt(n.nodeName,n.namespaceURI))):b=n;else if(S===He||S===Oe){if(R===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(F(b,n,w),_)for(var H=0,N=_.length;H<N;H++){var P=y[_[H]];P&&x(P,P.parentNode,!1)}}return!w&&b!==t&&t.parentNode&&(b.actualize&&(b=b.actualize(t.ownerDocument||I)),t.parentNode.replaceChild(b,t)),b}}var Lt=At(gt),De=Lt;var Ee=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var Z=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=`${Ee.map(r=>r==="textarea"?"textarea:not([disabled])":`input[type="${r}"]:not([disabled])`).join(", ")}, select:not([disabled]), button:not([disabled]), [contenteditable="true"], [tabindex]:not([tabindex="-1"])`;this.focusableElements=Array.from(this.wrapperElement.querySelectorAll(n))}setupFocusTracking(){if(!this.wrapperElement)return;let e=this.wrapperElement.getAttribute("data-lvt-id"),t=`__lvt_focus_tracker_${e}`,n=`__lvt_blur_tracker_${e}`,r=a=>{var l;let s=a.target;!s||!((l=this.wrapperElement)!=null&&l.contains(s))||(this.isTextualInput(s)||s instanceof HTMLSelectElement)&&(this.lastFocusedElement=s,this.logger.debug("[Focus] Tracked focus on:",s.tagName,s.id||s.getAttribute("name")),this.isTextualInput(s)&&(this.lastFocusedSelectionStart=s.selectionStart,this.lastFocusedSelectionEnd=s.selectionEnd))},i=a=>{var l;let s=a.target;!s||!((l=this.wrapperElement)!=null&&l.contains(s))||this.isTextualInput(s)&&s===this.lastFocusedElement&&(this.lastFocusedSelectionStart=s.selectionStart,this.lastFocusedSelectionEnd=s.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=i,document.addEventListener("focus",r,!0),document.addEventListener("blur",i,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var a,s,l;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(a=this.lastFocusedElement)==null?void 0:a.tagName,((s=this.lastFocusedElement)==null?void 0:s.id)||((l=this.lastFocusedElement)==null?void 0:l.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,i=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&i!==null&&(t.setSelectionRange(r,i),this.logger.debug("[Focus] Restored cursor:",r,"-",i))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?Ee.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 Re=["pending","success","error","done"],we=new Set(Re),ee=new Set(["click-away"]),Te={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Mt(o,e){let n=o.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],i=Te[r];if(!i)return null;let a=n[2];if(ee.has(a)||!we.has(a)&&!a.includes(":"))return null;let s=a.split(":"),l=s[s.length-1];if(!we.has(l))return null;let c=l,d=s.length>1?s.slice(0,-1).join(":"):void 0;return{action:i,lifecycle:c,actionName:d||void 0,param:e||void 0}}return null}function te(o){let e=o.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||o:e.startsWith("closest:")&&o.closest(e.slice(8))||o:o}function ne(o,e,t){switch(e){case"reset":o instanceof HTMLFormElement&&o.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);o.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);o.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>o.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),i=t.substring(n+1);o.setAttribute(r,i)}}break;case"toggleAttr":t&&o.toggleAttribute(t);break}}function kt(o,e,t){return o.lifecycle!==e?!1:o.actionName?o.actionName===t:!0}function xt(o,e){let t=Object.keys(Te),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let s of t)n.push(`[lvt-el\\:${s}\\:on\\:${o}]`),r&&n.push(`[lvt-el\\:${s}\\:on\\:${r}\\:${o}]`);let i=n.join(", "),a;try{a=document.querySelectorAll(i)}catch(s){let l=t.map(c=>`[lvt-el\\:${c}\\:on\\:${o}]`);try{a=document.querySelectorAll(l.join(", "))}catch(c){return}}a.forEach(s=>{Array.from(s.attributes).forEach(l=>{if(!l.name.startsWith("lvt-el:")||!l.name.includes(":on:"))return;let c=Mt(l.name,l.value);c&&kt(c,o,e)&&ne(te(s),c.action,c.param)})})}function re(o,e){for(let t of o.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),i=Te[r];i&&ne(te(o),i,t.value)}}function Ne(o){return!we.has(o)&&!ee.has(o)}function ie(){Re.forEach(o=>{document.addEventListener(`lvt:${o}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;xt(o,n)},!0)})}var We=new Set(["pending","success","error","done"]),Ue=new WeakSet;function Pe(o){let e=o.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 Be(o,e){let t=e||o,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(a=>a.el.isConnected),i=a=>{var s;for(let l of a.attributes){if(!l.name.startsWith("lvt-fx:"))continue;let c=Pe(l.name);if(!c.trigger||We.has(c.trigger)||ee.has(c.trigger))continue;let d=`__lvt_fx_${l.name}`;if(a[d])continue;let p=(s=l.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];if(!p)continue;let u=l.name,f=()=>{if(!a.hasAttribute(u))return;let v=a.getAttribute(u)||"";j(a,p,v)};a.addEventListener(c.trigger,f),a[d]=f,r.push({el:a,event:c.trigger,handler:f,guardKey:d})}};i(o),o.querySelectorAll("*").forEach(i),t[n]=r}function Ke(o){let e="__lvtFxDirectListeners",t=o[e];t&&(t.forEach(({el:n,event:r,handler:i,guardKey:a})=>{n.removeEventListener(r,i),delete n[a]}),delete o[e])}function Ct(o,e,t){let n=r=>{var i;for(let a of r.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let s=Pe(a.name);if(!s.trigger||!We.has(s.trigger)||s.trigger!==e||s.actionName&&s.actionName!==t)continue;let l=(i=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:i[1];l&&j(r,l,a.value)}};n(o),o.querySelectorAll("*").forEach(n)}function j(o,e,t){let n=getComputedStyle(o);switch(e){case"highlight":{if(o.__lvtHighlighting)break;o.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),i=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",a=o.style.backgroundColor,s=o.style.transition;o.style.transition=`background-color ${r}ms ease-out`,o.style.backgroundColor=i,setTimeout(()=>{if(!o.isConnected){o.style.backgroundColor=a,o.style.transition=s,o.__lvtHighlighting=!1;return}o.style.backgroundColor=a,setTimeout(()=>{o.isConnected&&(o.style.transition=s),o.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ue.has(o))break;Ue.add(o);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),i=t||"fade",a="";switch(i){case"fade":a=`lvt-fade-in ${r}ms ease-out`;break;case"slide":a=`lvt-slide-in ${r}ms ease-out`;break;case"scale":a=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${i}`)}if(!a)break;o.style.animation=a,o.addEventListener("animationend",()=>{o.style.removeProperty("animation"),o.style.length===0&&o.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),i=_t.has(r)?r:"auto",a=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),s=t||"bottom";switch(s){case"bottom":o.scrollTo({top:o.scrollHeight,behavior:i});break;case"bottom-sticky":{o.scrollHeight-o.scrollTop-o.clientHeight<=a&&o.scrollTo({top:o.scrollHeight,behavior:i});break}case"top":o.scrollTo({top:0,behavior:i});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${s}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function Ve(o){let e="__lvtFxLifecycleSetup";if(o[e])return;o[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let i=a=>{var c;let l=(c=a.detail)==null?void 0:c.action;Ct(o,r,l)};document.addEventListener(`lvt:${r}`,i,!0),t.push({event:`lvt:${r}`,handler:i})}),o.__lvtFxLifecycleListeners=t}function je(o){let e=o.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete o.__lvtFxLifecycleListeners),delete o.__lvtFxLifecycleSetup}var _t=new Set(["auto","smooth","instant"]);function qe(o){o.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&j(e,"scroll",t)})}function ze(o){o.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&j(e,"highlight",t)})}function Ge(o){o.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&j(e,"animate",t)}),Ft()}function Ft(){if(!document.getElementById("lvt-animate-styles")){let o=document.createElement("style");o.id="lvt-animate-styles",o.textContent=`
1
+ "use strict";var LiveTemplateClient=(()=>{var ye=Object.defineProperty;var at=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var ct=Object.prototype.hasOwnProperty;var dt=(o,e)=>{for(var t in e)ye(o,t,{get:e[t],enumerable:!0})},ut=(o,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of lt(e))!ct.call(o,r)&&r!==t&&ye(o,r,{get:()=>e[r],enumerable:!(n=at(e,r))||n.enumerable});return o};var pt=o=>ut(ye({},"__esModule",{value:!0}),o);var Bt={};dt(Bt,{LiveTemplateClient:()=>me,compareHTML:()=>ot,loadAndApplyUpdate:()=>st,setupReactiveAttributeListeners:()=>ie});var _e=11;function gt(o,e){var t=e.attributes,n,r,i,a,s;if(!(e.nodeType===_e||o.nodeType===_e)){for(var l=t.length-1;l>=0;l--)n=t[l],r=n.name,i=n.namespaceURI,a=n.value,i?(r=n.localName||r,s=o.getAttributeNS(i,r),s!==a&&(n.prefix==="xmlns"&&(r=n.name),o.setAttributeNS(i,r,a))):(s=o.getAttribute(r),s!==a&&o.setAttribute(r,a));for(var c=o.attributes,d=c.length-1;d>=0;d--)n=c[d],r=n.name,i=n.namespaceURI,i?(r=n.localName||r,e.hasAttributeNS(i,r)||o.removeAttributeNS(i,r)):e.hasAttribute(r)||o.removeAttribute(r)}}var J,ft="http://www.w3.org/1999/xhtml",H=typeof document=="undefined"?void 0:document,ht=!!H&&"content"in H.createElement("template"),mt=!!H&&H.createRange&&"createContextualFragment"in H.createRange();function vt(o){var e=H.createElement("template");return e.innerHTML=o,e.content.childNodes[0]}function yt(o){J||(J=H.createRange(),J.selectNode(H.body));var e=J.createContextualFragment(o);return e.childNodes[0]}function bt(o){var e=H.createElement("body");return e.innerHTML=o,e.childNodes[0]}function Et(o){return o=o.trim(),ht?vt(o):mt?yt(o):bt(o)}function Q(o,e){var t=o.nodeName,n=e.nodeName,r,i;return t===n?!0:(r=t.charCodeAt(0),i=n.charCodeAt(0),r<=90&&i>=97?t===n.toUpperCase():i<=90&&r>=97?n===t.toUpperCase():!1)}function wt(o,e){return!e||e===ft?H.createElement(o):H.createElementNS(e,o)}function St(o,e){for(var t=o.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function be(o,e,t){o[t]!==e[t]&&(o[t]=e[t],o[t]?o.setAttribute(t,""):o.removeAttribute(t))}var Fe={OPTION:function(o,e){var t=o.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(o.hasAttribute("selected")&&!e.selected&&(o.setAttribute("selected","selected"),o.removeAttribute("selected")),t.selectedIndex=-1)}be(o,e,"selected")},INPUT:function(o,e){be(o,e,"checked"),be(o,e,"disabled"),o.value!==e.value&&(o.value=e.value),e.hasAttribute("value")||o.removeAttribute("value")},TEXTAREA:function(o,e){var t=e.value;o.value!==t&&(o.value=t);var n=o.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==o.placeholder)return;n.nodeValue=t}},SELECT:function(o,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=o.firstChild,i,a;r;)if(a=r.nodeName&&r.nodeName.toUpperCase(),a==="OPTGROUP")i=r,r=i.firstChild,r||(r=i.nextSibling,i=null);else{if(a==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&i&&(r=i.nextSibling,i=null)}o.selectedIndex=t}}},V=1,He=11,Re=3,Ie=8;function W(){}function Tt(o){if(o)return o.getAttribute&&o.getAttribute("id")||o.id}function At(o){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var i=n;n=H.createElement("html"),n.innerHTML=i}else n=Et(n);else n.nodeType===He&&(n=n.firstElementChild);var a=r.getNodeKey||Tt,s=r.onBeforeNodeAdded||W,l=r.onNodeAdded||W,c=r.onBeforeElUpdated||W,d=r.onElUpdated||W,p=r.onBeforeNodeDiscarded||W,u=r.onNodeDiscarded||W,f=r.onBeforeElChildrenUpdated||W,v=r.skipFromChildren||W,C=r.addChild||function(h,m){return h.appendChild(m)},w=r.childrenOnly===!0,y=Object.create(null),_=[];function g(h){_.push(h)}function x(h,m){if(h.nodeType===V)for(var M=h.firstChild;M;){var E=void 0;m&&(E=a(M))?g(E):(u(M),M.firstChild&&x(M,m)),M=M.nextSibling}}function k(h,m,M){p(h)!==!1&&(m&&m.removeChild(h),u(h),x(h,M))}function I(h){if(h.nodeType===V||h.nodeType===He)for(var m=h.firstChild;m;){var M=a(m);M&&(y[M]=m),I(m),m=m.nextSibling}}I(t);function G(h){l(h);for(var m=h.firstChild;m;){var M=m.nextSibling,E=a(m);if(E){var S=y[E];S&&Q(m,S)?(m.parentNode.replaceChild(S,m),F(S,m)):G(m)}else G(m);m=M}}function L(h,m,M){for(;m;){var E=m.nextSibling;(M=a(m))?g(M):k(m,h,!0),m=E}}function F(h,m,M){var E=a(m);if(E&&delete y[E],!M){var S=c(h,m);if(S===!1||(S instanceof HTMLElement&&(h=S,I(h)),o(h,m),d(h),f(h,m)===!1))return}h.nodeName!=="TEXTAREA"?A(h,m):Fe.TEXTAREA(h,m)}function A(h,m){var M=v(h,m),E=m.firstChild,S=h.firstChild,B,N,K,X,U;e:for(;E;){for(X=E.nextSibling,B=a(E);!M&&S;){if(K=S.nextSibling,E.isSameNode&&E.isSameNode(S)){E=X,S=K;continue e}N=a(S);var Y=S.nodeType,$=void 0;if(Y===E.nodeType&&(Y===V?(B?B!==N&&((U=y[B])?K===U?$=!1:(h.insertBefore(U,S),N?g(N):k(S,h,!0),S=U,N=a(S)):$=!1):N&&($=!1),$=$!==!1&&Q(S,E),$&&F(S,E)):(Y===Re||Y==Ie)&&($=!0,S.nodeValue!==E.nodeValue&&(S.nodeValue=E.nodeValue))),$){E=X,S=K;continue e}N?g(N):k(S,h,!0),S=K}if(B&&(U=y[B])&&Q(U,E))M||C(h,U),F(U,E);else{var ve=s(E);ve!==!1&&(ve&&(E=ve),E.actualize&&(E=E.actualize(h.ownerDocument||H)),C(h,E),G(E))}E=X,S=K}L(h,S,N);var Ce=Fe[h.nodeName];Ce&&Ce(h,m)}var b=t,T=b.nodeType,O=n.nodeType;if(!w){if(T===V)O===V?Q(t,n)||(u(t),b=St(t,wt(n.nodeName,n.namespaceURI))):b=n;else if(T===Re||T===Ie){if(O===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(F(b,n,w),_)for(var R=0,D=_.length;R<D;R++){var P=y[_[R]];P&&k(P,P.parentNode,!1)}}return!w&&b!==t&&t.parentNode&&(b.actualize&&(b=b.actualize(t.ownerDocument||H)),t.parentNode.replaceChild(b,t)),b}}var Lt=At(gt),Ne=Lt;var Ee=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"];var Z=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=`${Ee.map(r=>r==="textarea"?"textarea:not([disabled])":`input[type="${r}"]:not([disabled])`).join(", ")}, select:not([disabled]), button:not([disabled]), [contenteditable="true"], [tabindex]:not([tabindex="-1"])`;this.focusableElements=Array.from(this.wrapperElement.querySelectorAll(n))}setupFocusTracking(){if(!this.wrapperElement)return;let e=this.wrapperElement.getAttribute("data-lvt-id"),t=`__lvt_focus_tracker_${e}`,n=`__lvt_blur_tracker_${e}`,r=a=>{var l;let s=a.target;!s||!((l=this.wrapperElement)!=null&&l.contains(s))||(this.isTextualInput(s)||s instanceof HTMLSelectElement)&&(this.lastFocusedElement=s,this.logger.debug("[Focus] Tracked focus on:",s.tagName,s.id||s.getAttribute("name")),this.isTextualInput(s)&&(this.lastFocusedSelectionStart=s.selectionStart,this.lastFocusedSelectionEnd=s.selectionEnd))},i=a=>{var l;let s=a.target;!s||!((l=this.wrapperElement)!=null&&l.contains(s))||this.isTextualInput(s)&&s===this.lastFocusedElement&&(this.lastFocusedSelectionStart=s.selectionStart,this.lastFocusedSelectionEnd=s.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=i,document.addEventListener("focus",r,!0),document.addEventListener("blur",i,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){var a,s,l;if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",(a=this.lastFocusedElement)==null?void 0:a.tagName,((s=this.lastFocusedElement)==null?void 0:s.id)||((l=this.lastFocusedElement)==null?void 0:l.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,i=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&i!==null&&(t.setSelectionRange(r,i),this.logger.debug("[Focus] Restored cursor:",r,"-",i))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?Ee.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 Oe=["pending","success","error","done"],we=new Set(Oe),ee=new Set(["click-away"]),Se={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function Mt(o,e){let n=o.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],i=Se[r];if(!i)return null;let a=n[2];if(ee.has(a)||!we.has(a)&&!a.includes(":"))return null;let s=a.split(":"),l=s[s.length-1];if(!we.has(l))return null;let c=l,d=s.length>1?s.slice(0,-1).join(":"):void 0;return{action:i,lifecycle:c,actionName:d||void 0,param:e||void 0}}return null}function te(o){let e=o.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||o:e.startsWith("closest:")&&o.closest(e.slice(8))||o:o}function ne(o,e,t){switch(e){case"reset":o instanceof HTMLFormElement&&o.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);o.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);o.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>o.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),i=t.substring(n+1);o.setAttribute(r,i)}}break;case"toggleAttr":t&&o.toggleAttribute(t);break}}function kt(o,e,t){return o.lifecycle!==e?!1:o.actionName?o.actionName===t:!0}function xt(o,e){let t=Object.keys(Se),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let s of t)n.push(`[lvt-el\\:${s}\\:on\\:${o}]`),r&&n.push(`[lvt-el\\:${s}\\:on\\:${r}\\:${o}]`);let i=n.join(", "),a;try{a=document.querySelectorAll(i)}catch(s){let l=t.map(c=>`[lvt-el\\:${c}\\:on\\:${o}]`);try{a=document.querySelectorAll(l.join(", "))}catch(c){return}}a.forEach(s=>{Array.from(s.attributes).forEach(l=>{if(!l.name.startsWith("lvt-el:")||!l.name.includes(":on:"))return;let c=Mt(l.name,l.value);c&&kt(c,o,e)&&ne(te(s),c.action,c.param)})})}function re(o,e){for(let t of o.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),i=Se[r];i&&ne(te(o),i,t.value)}}function De(o){return!we.has(o)&&!ee.has(o)}function ie(){Oe.forEach(o=>{document.addEventListener(`lvt:${o}`,e=>{var r;let n=(r=e.detail)==null?void 0:r.action;xt(o,n)},!0)})}var We=new Set(["pending","success","error","done"]),Ue=new WeakSet;function Pe(o){let e=o.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 Be(o,e){let t=e||o,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(a=>a.el.isConnected),i=a=>{var s;for(let l of a.attributes){if(!l.name.startsWith("lvt-fx:"))continue;let c=Pe(l.name);if(!c.trigger||We.has(c.trigger)||ee.has(c.trigger))continue;let d=`__lvt_fx_${l.name}`;if(a[d])continue;let p=(s=l.name.match(/^lvt-fx:(\w+)/i))==null?void 0:s[1];if(!p)continue;let u=l.name,f=()=>{if(!a.hasAttribute(u))return;let v=a.getAttribute(u)||"";j(a,p,v)};a.addEventListener(c.trigger,f),a[d]=f,r.push({el:a,event:c.trigger,handler:f,guardKey:d})}};i(o),o.querySelectorAll("*").forEach(i),t[n]=r}function Ke(o){let e="__lvtFxDirectListeners",t=o[e];t&&(t.forEach(({el:n,event:r,handler:i,guardKey:a})=>{n.removeEventListener(r,i),delete n[a]}),delete o[e])}function Ct(o,e,t){let n=r=>{var i;for(let a of r.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let s=Pe(a.name);if(!s.trigger||!We.has(s.trigger)||s.trigger!==e||s.actionName&&s.actionName!==t)continue;let l=(i=a.name.match(/^lvt-fx:(\w+)/i))==null?void 0:i[1];l&&j(r,l,a.value)}};n(o),o.querySelectorAll("*").forEach(n)}function j(o,e,t){let n=getComputedStyle(o);switch(e){case"highlight":{if(o.__lvtHighlighting)break;o.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),i=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",a=o.style.backgroundColor,s=o.style.transition;o.style.transition=`background-color ${r}ms ease-out`,o.style.backgroundColor=i,setTimeout(()=>{if(!o.isConnected){o.style.backgroundColor=a,o.style.transition=s,o.__lvtHighlighting=!1;return}o.style.backgroundColor=a,setTimeout(()=>{o.isConnected&&(o.style.transition=s),o.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Ue.has(o))break;Ue.add(o);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),i=t||"fade",a="";switch(i){case"fade":a=`lvt-fade-in ${r}ms ease-out`;break;case"slide":a=`lvt-slide-in ${r}ms ease-out`;break;case"scale":a=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${i}`)}if(!a)break;o.style.animation=a,o.addEventListener("animationend",()=>{o.style.removeProperty("animation"),o.style.length===0&&o.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),i=_t.has(r)?r:"auto",a=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),s=t||"bottom";switch(s){case"bottom":o.scrollTo({top:o.scrollHeight,behavior:i});break;case"bottom-sticky":{o.scrollHeight-o.scrollTop-o.clientHeight<=a&&o.scrollTo({top:o.scrollHeight,behavior:i});break}case"top":o.scrollTo({top:0,behavior:i});break;case"preserve":break;default:console.warn(`Unknown lvt-fx:scroll mode: ${s}`)}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function Ve(o){let e="__lvtFxLifecycleSetup";if(o[e])return;o[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let i=a=>{var c;let l=(c=a.detail)==null?void 0:c.action;Ct(o,r,l)};document.addEventListener(`lvt:${r}`,i,!0),t.push({event:`lvt:${r}`,handler:i})}),o.__lvtFxLifecycleListeners=t}function je(o){let e=o.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete o.__lvtFxLifecycleListeners),delete o.__lvtFxLifecycleSetup}var _t=new Set(["auto","smooth","instant"]);function qe(o){o.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&j(e,"scroll",t)})}function ze(o){o.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&j(e,"highlight",t)})}function Ge(o){o.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&j(e,"animate",t)}),Ft()}function Ft(){if(!document.getElementById("lvt-animate-styles")){let o=document.createElement("style");o.id="lvt-animate-styles",o.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(o)}}var $e="__lvtPendingProcessed";function Xe(o){o.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[$e]===t)return;e[$e]=t;let n;try{n=JSON.parse(t)}catch(a){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",i=It(r);n.forEach(a=>{let s=Ot(a);i.appendChild(s),typeof a.dismissMS=="number"&&a.dismissMS>0&&setTimeout(()=>s.remove(),a.dismissMS)})})}function Ye(){let o="__lvt_toast_click_outside",e=document[o];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(i=>i.remove())};document[o]=t,document.addEventListener("click",t)}function It(o){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"),Ht(e,o),document.body.appendChild(e)),e}function Ht(o,e){let t=o.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 Ot(o){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",o.id),o.type&&e.setAttribute("data-type",o.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),o.title){let n=document.createElement("strong");n.textContent=o.title,t.appendChild(n)}if(o.body){let n=document.createElement("p");n.textContent=o.body,t.appendChild(n)}if(e.appendChild(t),o.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}function q(o,e){let t=null;return function(...r){let i=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{o.apply(i,r)},e)}}function Se(o,e){let t=!1;return function(...r){let i=this;t||(o.apply(i,r),t=!0,setTimeout(()=>{t=!1},e))}}function Ae(o,e){let t=o.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var Qe={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Dt=Object.keys(Qe),Rt=new Set(["mouseenter","mouseleave","focus","blur"]),Je=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave"],se=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of Je){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=Je,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_delegated_${i}_${n}`,s=document[a];s&&document.removeEventListener(i,s,!1);let l=c=>{var k;let d=this.context.getWrapperElement();if(!d)return;let p=c.target;if(this.logger.debug("Event listener triggered:",i,c.target),!p)return;let u=p,f=!1;for(;u;){if(u===d){f=!0;break}u=u.parentElement}if(!f)return;let v=`lvt-on:${i}`;for(u=p;u&&u!==d.parentElement;){let w=u.getAttribute(v),y=u,_=!1;if(!w&&i==="submit"&&u instanceof HTMLFormElement){let g=u.getAttribute("lvt-persist");g&&(w=`persist:${g}`,y=u)}if(!w&&i==="click"){let g=u instanceof HTMLButtonElement?u:null;g&&g.name&&!g.disabled&&g.type!=="reset"&&g.form===null&&!g.hasAttribute("commandfor")&&(w=g.name,y=g,_=!0)}if(!w&&i==="submit"&&u instanceof HTMLFormElement&&!u.hasAttribute("lvt-form:no-intercept")){let g=u.getAttribute("lvt-form:action"),C=c.submitter;g?w=g:C instanceof HTMLButtonElement&&C.name?w=C.name:u.getAttribute("name")?w=u.getAttribute("name"):w="submit",y=u,C&&(u.__lvtSubmitter=C);let x=u.closest("dialog");x&&((k=u.getAttribute("method"))==null?void 0:k.toLowerCase())==="dialog"&&(u.__lvtCloseDialog=x)}if(w!=null&&y){if(i==="submit"&&c.preventDefault(),(i==="keydown"||i==="keyup")&&y.hasAttribute("lvt-key")){let L=y.getAttribute("lvt-key");if(L&&c.key!==L){u=u.parentElement;continue}}let g=y,C=()=>{this.logger.debug("handleAction called",{action:w,eventType:i,targetElement:g});let L={action:w,data:{}};if(g instanceof HTMLFormElement){this.logger.debug("Processing form element");let A=new FormData(g),b=Array.from(g.querySelectorAll('input[type="checkbox"][name]')),S=new Set(b.map(h=>h.name));S.forEach(h=>{L.data[h]=!1});let R=new Set(Array.from(g.querySelectorAll('input[type="password"][name]')).map(h=>h.name)),H=g.__lvtSubmitter,N=H==null?void 0:H.name;A.forEach((h,m)=>{h instanceof File||N&&m===N||(S.has(m)?(L.data[m]=!0,this.logger.debug("Converted checkbox",m,"to true")):R.has(m)?L.data[m]=h:L.data[m]=this.context.parseValue(h))});let P=g.__lvtSubmitter;P&&(this.extractButtonData(P,L.data),delete g.__lvtSubmitter),this.logger.debug("Form data collected:",L.data)}else if(i==="change"||i==="input"||i==="search"){if(g instanceof HTMLInputElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}else if(g instanceof HTMLSelectElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}else if(g instanceof HTMLTextAreaElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}}_&&this.extractButtonData(y,L.data),!(g instanceof HTMLFormElement)&&!_&&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);L.data[b]=this.context.parseValue(A.value)}});let F=null;if(i==="submit"&&g instanceof HTMLFormElement){let A=g.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(A).some(S=>S.files&&S.files.length>0)){let S=c.submitter;F=new FormData(g),S!=null&&S.name&&F.set(S.name,S.value),F.set("lvt-action",w)}}if(i==="submit"&&g 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(g,b||null,S),g.querySelectorAll('input[type="file"][lvt-upload]').forEach(H=>{let N=H.getAttribute("lvt-upload");N&&(this.logger.debug("Triggering pending uploads for:",N),this.context.triggerPendingUploads(N))}),g.dispatchEvent(new CustomEvent("lvt:pending",{detail:L})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",L),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),F!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(g,w,F);return}if(this.context.send(L),this.logger.debug("send() called"),g instanceof HTMLFormElement){let A=g.__lvtCloseDialog;A&&(A.close(),delete g.__lvtCloseDialog)}},x=y.getAttribute("lvt-mod:throttle"),O=y.getAttribute("lvt-mod:debounce");if((x||O)&&i!=="search"){r.has(y)||r.set(y,new Map);let L=r.get(y),F=`${i}:${w}`,A=`__lvt_callback_${F}`,b=y;b[A]||(b[A]={current:C}),b[A].current=C;let S=L.get(F);if(!S){let R=()=>b[A].current();if(x){let H=parseInt(x,10);S=Se(R,H)}else if(O){let H=parseInt(O,10);S=q(R,H)}S&&L.set(F,S)}S&&S()}else C();return}u=u.parentElement}};document[a]=l,document.addEventListener(i,l,!1),this.logger.debug("Registered event listener:",i,"with key:",a)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_window_${i}_${n}`,s=window[a];s&&window.removeEventListener(i,s);let l=c=>{let d=this.context.getWrapperElement();if(!d)return;let p=`lvt-on:window:${i}`;d.querySelectorAll(Ae(p)).forEach(f=>{let v=f.getAttribute(p);if(!v)return;if((i==="keydown"||i==="keyup")&&f.hasAttribute("lvt-key")){let g=f.getAttribute("lvt-key");if(g&&c.key!==g)return}let k={action:v,data:{}};Array.from(f.attributes).forEach(g=>{if(g.name.startsWith("data-")&&g.name!=="data-key"&&g.name!=="data-lvt-id"){let C=g.name.slice(5);k.data[C]=this.context.parseValue(g.value)}});let w=f.getAttribute("lvt-mod:throttle"),y=f.getAttribute("lvt-mod:debounce"),_=()=>this.context.send(k);if(w||y){r.has(f)||r.set(f,new Map);let g=r.get(f),C=`window-${i}:${v}`,x=g.get(C);if(!x){if(w){let O=parseInt(w,10);x=Se(_,O)}else if(y){let O=parseInt(y,10);x=q(_,O)}x&&g.set(C,x)}x&&x()}else _()})};window[a]=l,window.addEventListener(i,l)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let i=a=>{let s=this.context.getWrapperElement();if(!s)return;let l=a.target,c=Dt.map(p=>Ae(`lvt-el:${p}:on:click-away`)).join(", ");s.querySelectorAll(c).forEach(p=>{p.contains(l)||Array.from(p.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let f=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!f)return;let v=Qe[f[1].toLowerCase()];v&&ne(te(p),v,u.value)})})};document[n]=i,document.addEventListener("click",i)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,i=t[r]||new Set,a=`__lvt_el_listeners_${n}`,s=(t[a]||[]).filter(d=>d.el.isConnected),l=e||t,c=d=>{let p=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let f=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!f)continue;let v=f[1].toLowerCase();Ne(v)&&p.add(v)}for(let u of p)if(Rt.has(u)){let f=`__lvt_el_${u}`;if(d[f])continue;let v=()=>re(d,u);d.addEventListener(u,v),d[f]=v,s.push({el:d,event:u,handler:v,guardKey:f})}else if(!i.has(u)){let f=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${f}$`,"i"),k=w=>{let y=w.target;for(;y&&y!==t;){let _=!1;for(let g of y.attributes)if(v.test(g.name)){_=!0;break}if(_){re(y,u);return}y=y.parentElement}y===t&&re(t,u)};t.addEventListener(u,k),i.add(u),s.push({el:t,event:u,handler:k})}};c(l),l.querySelectorAll("*").forEach(c),t[a]=s,t[r]=i}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:a,event:s,handler:l,guardKey:c})=>{a.removeEventListener(s,l),c&&delete a[c]}),delete e[n]);let i=`__lvt_el_delegated_${t}`;delete e[i]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let i=s=>{let l=["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(s.querySelectorAll(l)).filter(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",f=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||typeof process!="undefined"&&!1;return u&&f&&v})},a=s=>{if(s.key!=="Tab")return;let l=this.context.getWrapperElement();if(!l)return;let c=l.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 k=v,w=window.getComputedStyle(k);w.display!=="none"&&w.visibility!=="hidden"&&(d=v)}),!d)return;let p=i(d);if(p.length===0)return;let u=p[0],f=p[p.length-1];s.shiftKey?document.activeElement===u&&(s.preventDefault(),f.focus()):document.activeElement===f&&(s.preventDefault(),u.focus())};document[n]=a,document.addEventListener("keydown",a),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let i=()=>{let s=this.context.getWrapperElement();if(!s)return;s.querySelectorAll("[lvt-autofocus]").forEach(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",f=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,k=u&&f&&v,w=d.getAttribute("data-lvt-autofocused")==="true";k&&!w?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!k&&w&&d.removeAttribute("data-lvt-autofocused")})};i();let a=new MutationObserver(s=>{let l=!1;s.forEach(c=>{c.type==="childList"&&c.addedNodes.length>0&&c.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(l=!0)}),c.type==="attributes"&&(c.target.hasAttribute("lvt-autofocus")||c.attributeName==="hidden"||c.attributeName==="style"||c.attributeName==="class")&&(l=!0)}),l&&i()});a.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=a,this.logger.debug("Autofocus delegation set up")}};var oe=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null}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){let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let i=a=>{var c;let s=(c=a.target)==null?void 0:c.closest("a[href]");if(!s)return;let l=this.context.getWrapperElement();!l||!l.contains(s)||this.shouldSkip(s)||(a.preventDefault(),this.navigate(s.href))};document.addEventListener("click",i),document[n]=i,this.popstateListener||(this.popstateListener=()=>{this.navigate(window.location.href,!1)},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")||e.pathname===window.location.pathname&&e.hash)return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0){var n;(n=this.abortController)==null||n.abort(),this.abortController=new AbortController;try{let r=await fetch(e,{credentials:"include",headers:{Accept:"text/html"},signal:this.abortController.signal});if(!r.ok){window.location.href=e;return}let i=await r.text();t&&window.history.pushState(null,"",e),this.context.handleNavigationResponse(i)}catch(r){if(r instanceof DOMException&&r.name==="AbortError")return;window.location.href=e}}};var z=class z{constructor(e,t){this.context=e;this.logger=t;this.infiniteScrollObserver=null;this.mutationObserver=null;this.observedSentinel=null;this.updatedListener=null;this.updatedListenerWrapper=null;this.loadMorePending=!1;this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=document.getElementById("scroll-sentinel");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{let n=t.detail;(n==null?void 0:n.action)==="load_more"&&(this.releaseLoadMore(),this.observedSentinel=null,this.setupInfiniteScrollObserver())},e.addEventListener("lvt:updated",this.updatedListener),this.updatedListenerWrapper=e)}armLoadMoreTimeout(){this.clearLoadMoreTimeout(),this.loadMoreTimeoutId=window.setTimeout(()=>{this.logger.warn(`load_more response not received within ${z.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},z.LOAD_MORE_TIMEOUT_MS)}releaseLoadMore(){this.loadMorePending=!1,this.clearLoadMoreTimeout()}clearLoadMoreTimeout(){this.loadMoreTimeoutId!==null&&(clearTimeout(this.loadMoreTimeoutId),this.loadMoreTimeoutId=null)}setupInfiniteScrollMutationObserver(){let e=this.context.getWrapperElement();e&&(this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver(()=>{this.setupInfiniteScrollObserver()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0}),this.logger.debug("MutationObserver set up successfully"))}teardown(){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=null,this.updatedListenerWrapper=null,this.observedSentinel=null,this.releaseLoadMore()}};z.LOAD_MORE_TIMEOUT_MS=3e4;var ae=z;var le=class{constructor(){this.bar=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.style.cssText=`
14
+ `,document.head.appendChild(o)}}var $e="__lvtPendingProcessed";function Xe(o){o.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[$e]===t)return;e[$e]=t;let n;try{n=JSON.parse(t)}catch(a){return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",i=Ht(r);n.forEach(a=>{let s=It(a);i.appendChild(s),typeof a.dismissMS=="number"&&a.dismissMS>0&&setTimeout(()=>s.remove(),a.dismissMS)})})}function Ye(){let o="__lvt_toast_click_outside",e=document[o];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(i=>i.remove())};document[o]=t,document.addEventListener("click",t)}function Ht(o){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"),Rt(e,o),document.body.appendChild(e)),e}function Rt(o,e){let t=o.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 It(o){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",o.id),o.type&&e.setAttribute("data-type",o.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),o.title){let n=document.createElement("strong");n.textContent=o.title,t.appendChild(n)}if(o.body){let n=document.createElement("p");n.textContent=o.body,t.appendChild(n)}if(e.appendChild(t),o.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}function q(o,e){let t=null;return function(...r){let i=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{o.apply(i,r)},e)}}function Te(o,e){let t=!1;return function(...r){let i=this;t||(o.apply(i,r),t=!0,setTimeout(()=>{t=!1},e))}}function Ae(o,e){let t=o.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}var Qe={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Nt=Object.keys(Qe),Ot=new Set(["mouseenter","mouseleave","focus","blur"]),Je=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave"],se=class{constructor(e,t){this.context=e;this.logger=t}teardownForWrapper(e){if(e)for(let t of Je){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=Je,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_delegated_${i}_${n}`,s=document[a];s&&document.removeEventListener(i,s,!1);let l=c=>{var C;let d=this.context.getWrapperElement();if(!d)return;let p=c.target;if(this.logger.debug("Event listener triggered:",i,c.target),!p)return;let u=p,f=!1;for(;u;){if(u===d){f=!0;break}u=u.parentElement}if(!f)return;let v=`lvt-on:${i}`;for(u=p;u&&u!==d.parentElement;){let w=u.getAttribute(v),y=u,_=!1;if(!w&&i==="submit"&&u instanceof HTMLFormElement){let g=u.getAttribute("lvt-persist");g&&(w=`persist:${g}`,y=u)}if(!w&&i==="click"){let g=u instanceof HTMLButtonElement?u:null;g&&g.name&&!g.disabled&&g.type!=="reset"&&g.form===null&&!g.hasAttribute("commandfor")&&(w=g.name,y=g,_=!0)}if(!w&&i==="submit"&&u instanceof HTMLFormElement&&!u.hasAttribute("lvt-form:no-intercept")){let g=u.getAttribute("lvt-form:action"),x=c.submitter;g?w=g:x instanceof HTMLButtonElement&&x.name?w=x.name:u.getAttribute("name")?w=u.getAttribute("name"):w="submit",y=u,x&&(u.__lvtSubmitter=x);let k=u.closest("dialog");k&&((C=u.getAttribute("method"))==null?void 0:C.toLowerCase())==="dialog"&&(u.__lvtCloseDialog=k)}if(w!=null&&y){if(i==="submit"&&c.preventDefault(),(i==="keydown"||i==="keyup")&&y.hasAttribute("lvt-key")){let L=y.getAttribute("lvt-key");if(L&&c.key!==L){u=u.parentElement;continue}}let g=y,x=()=>{this.logger.debug("handleAction called",{action:w,eventType:i,targetElement:g});let L={action:w,data:{}};if(g instanceof HTMLFormElement){this.logger.debug("Processing form element");let A=new FormData(g),b=Array.from(g.querySelectorAll('input[type="checkbox"][name]')),T=new Set(b.map(h=>h.name));T.forEach(h=>{L.data[h]=!1});let O=new Set(Array.from(g.querySelectorAll('input[type="password"][name]')).map(h=>h.name)),R=g.__lvtSubmitter,D=R==null?void 0:R.name;A.forEach((h,m)=>{h instanceof File||D&&m===D||(T.has(m)?(L.data[m]=!0,this.logger.debug("Converted checkbox",m,"to true")):O.has(m)?L.data[m]=h:L.data[m]=this.context.parseValue(h))});let P=g.__lvtSubmitter;P&&(this.extractButtonData(P,L.data),delete g.__lvtSubmitter),this.logger.debug("Form data collected:",L.data)}else if(i==="change"||i==="input"||i==="search"){if(g instanceof HTMLInputElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}else if(g instanceof HTMLSelectElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}else if(g instanceof HTMLTextAreaElement){let A=g.name||"value";L.data[A]=this.context.parseValue(g.value)}}_&&this.extractButtonData(y,L.data),!(g instanceof HTMLFormElement)&&!_&&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);L.data[b]=this.context.parseValue(A.value)}});let F=null;if(i==="submit"&&g instanceof HTMLFormElement){let A=g.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(A).some(T=>T.files&&T.files.length>0)){let T=c.submitter;F=new FormData(g),T!=null&&T.name&&F.set(T.name,T.value),F.set("lvt-action",w)}}if(i==="submit"&&g 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(g,b||null,T),g.querySelectorAll('input[type="file"][lvt-upload]').forEach(R=>{let D=R.getAttribute("lvt-upload");D&&(this.logger.debug("Triggering pending uploads for:",D),this.context.triggerPendingUploads(D))}),g.dispatchEvent(new CustomEvent("lvt:pending",{detail:L})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",L),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),F!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),this.context.sendHTTPMultipart(g,w,F);return}if(this.context.send(L),this.logger.debug("send() called"),g instanceof HTMLFormElement){let A=g.__lvtCloseDialog;A&&(A.close(),delete g.__lvtCloseDialog)}},k=y.getAttribute("lvt-mod:throttle"),I=y.getAttribute("lvt-mod:debounce");if((k||I)&&i!=="search"){r.has(y)||r.set(y,new Map);let L=r.get(y),F=`${i}:${w}`,A=`__lvt_callback_${F}`,b=y;b[A]||(b[A]={current:x}),b[A].current=x;let T=L.get(F);if(!T){let O=()=>b[A].current();if(k){let R=parseInt(k,10);T=Te(O,R)}else if(I){let R=parseInt(I,10);T=q(O,R)}T&&L.set(F,T)}T&&T()}else x();return}u=u.parentElement}};document[a]=l,document.addEventListener(i,l,!1),this.logger.debug("Registered event listener:",i,"with key:",a)})}setupWindowEventDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=["keydown","keyup","scroll","resize","focus","blur"],n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(i=>{let a=`__lvt_window_${i}_${n}`,s=window[a];s&&window.removeEventListener(i,s);let l=c=>{let d=this.context.getWrapperElement();if(!d)return;let p=`lvt-on:window:${i}`;d.querySelectorAll(Ae(p)).forEach(f=>{let v=f.getAttribute(p);if(!v)return;if((i==="keydown"||i==="keyup")&&f.hasAttribute("lvt-key")){let g=f.getAttribute("lvt-key");if(g&&c.key!==g)return}let C={action:v,data:{}};Array.from(f.attributes).forEach(g=>{if(g.name.startsWith("data-")&&g.name!=="data-key"&&g.name!=="data-lvt-id"){let x=g.name.slice(5);C.data[x]=this.context.parseValue(g.value)}});let w=f.getAttribute("lvt-mod:throttle"),y=f.getAttribute("lvt-mod:debounce"),_=()=>this.context.send(C);if(w||y){r.has(f)||r.set(f,new Map);let g=r.get(f),x=`window-${i}:${v}`,k=g.get(x);if(!k){if(w){let I=parseInt(w,10);k=Te(_,I)}else if(y){let I=parseInt(y,10);k=q(_,I)}k&&g.set(x,k)}k&&k()}else _()})};window[a]=l,window.addEventListener(i,l)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let i=a=>{let s=this.context.getWrapperElement();if(!s)return;let l=a.target,c=Nt.map(p=>Ae(`lvt-el:${p}:on:click-away`)).join(", ");s.querySelectorAll(c).forEach(p=>{p.contains(l)||Array.from(p.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let f=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!f)return;let v=Qe[f[1].toLowerCase()];v&&ne(te(p),v,u.value)})})};document[n]=i,document.addEventListener("click",i)}setupDOMEventTriggerDelegation(e){let t=this.context.getWrapperElement();if(!t)return;let n=t.getAttribute("data-lvt-id");if(!n)return;let r=`__lvt_el_delegated_${n}`,i=t[r]||new Set,a=`__lvt_el_listeners_${n}`,s=(t[a]||[]).filter(d=>d.el.isConnected),l=e||t,c=d=>{let p=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let f=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!f)continue;let v=f[1].toLowerCase();De(v)&&p.add(v)}for(let u of p)if(Ot.has(u)){let f=`__lvt_el_${u}`;if(d[f])continue;let v=()=>re(d,u);d.addEventListener(u,v),d[f]=v,s.push({el:d,event:u,handler:v,guardKey:f})}else if(!i.has(u)){let f=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${f}$`,"i"),C=w=>{let y=w.target;for(;y&&y!==t;){let _=!1;for(let g of y.attributes)if(v.test(g.name)){_=!0;break}if(_){re(y,u);return}y=y.parentElement}y===t&&re(t,u)};t.addEventListener(u,C),i.add(u),s.push({el:t,event:u,handler:C})}};c(l),l.querySelectorAll("*").forEach(c),t[a]=s,t[r]=i}teardownDOMEventTriggerDelegation(){let e=this.context.getWrapperElement();if(!e)return;let t=e.getAttribute("data-lvt-id");if(!t)return;let n=`__lvt_el_listeners_${t}`,r=e[n];r&&(r.forEach(({el:a,event:s,handler:l,guardKey:c})=>{a.removeEventListener(s,l),c&&delete a[c]}),delete e[n]);let i=`__lvt_el_delegated_${t}`;delete e[i]}setupFocusTrapDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_focus_trap_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("keydown",r);let i=s=>{let l=["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(s.querySelectorAll(l)).filter(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",f=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||typeof process!="undefined"&&!1;return u&&f&&v})},a=s=>{if(s.key!=="Tab")return;let l=this.context.getWrapperElement();if(!l)return;let c=l.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 C=v,w=window.getComputedStyle(C);w.display!=="none"&&w.visibility!=="hidden"&&(d=v)}),!d)return;let p=i(d);if(p.length===0)return;let u=p[0],f=p[p.length-1];s.shiftKey?document.activeElement===u&&(s.preventDefault(),f.focus()):document.activeElement===f&&(s.preventDefault(),u.focus())};document[n]=a,document.addEventListener("keydown",a),this.logger.debug("Focus trap delegation set up")}setupAutofocusDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_autofocus_observer_${e.getAttribute("data-lvt-id")}`,r=e[n];r&&r.disconnect();let i=()=>{let s=this.context.getWrapperElement();if(!s)return;s.querySelectorAll("[lvt-autofocus]").forEach(c=>{let d=c,p=window.getComputedStyle(d),u=p.display!=="none",f=p.visibility!=="hidden",v=d.offsetParent!==null||p.position==="fixed"||p.position==="absolute"||d.tagName==="BODY"||typeof process!="undefined"&&!1,C=u&&f&&v,w=d.getAttribute("data-lvt-autofocused")==="true";C&&!w?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!C&&w&&d.removeAttribute("data-lvt-autofocused")})};i();let a=new MutationObserver(s=>{let l=!1;s.forEach(c=>{c.type==="childList"&&c.addedNodes.length>0&&c.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(l=!0)}),c.type==="attributes"&&(c.target.hasAttribute("lvt-autofocus")||c.attributeName==="hidden"||c.attributeName==="style"||c.attributeName==="class")&&(l=!0)}),l&&i()});a.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=a,this.logger.debug("Autofocus delegation set up")}};var oe=class{constructor(e,t){this.context=e;this.logger=t;this.popstateListener=null;this.abortController=null;this.currentHref=window.location.href}teardownForWrapper(e){var r;if((r=this.abortController)==null||r.abort(),this.abortController=null,!e)return;let t=`__lvt_link_intercept_${e}`,n=document[t];n&&(document.removeEventListener("click",n,!1),delete document[t])}setup(e){this.currentHref=window.location.href;let n=`__lvt_link_intercept_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let i=a=>{var c;let s=(c=a.target)==null?void 0:c.closest("a[href]");if(!s)return;let l=this.context.getWrapperElement();!l||!l.contains(s)||this.shouldSkip(s)||(a.preventDefault(),this.navigate(s.href))};document.addEventListener("click",i),document[n]=i,this.popstateListener||(this.popstateListener=()=>{let a=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,a)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||e.hasAttribute("lvt-nav:no-intercept")||e.pathname===window.location.pathname&&e.hash)return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){var s,l,c;let r=new URL(e,window.location.origin),i=new URL(n,window.location.origin);if(r.origin===i.origin&&r.pathname===i.pathname){if(r.search===i.search){(s=this.abortController)==null||s.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&((l=this.abortController)==null||l.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 z=class z{constructor(e,t){this.context=e;this.logger=t;this.infiniteScrollObserver=null;this.mutationObserver=null;this.observedSentinel=null;this.updatedListener=null;this.updatedListenerWrapper=null;this.loadMorePending=!1;this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=document.getElementById("scroll-sentinel");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{let n=t.detail;(n==null?void 0:n.action)==="load_more"&&(this.releaseLoadMore(),this.observedSentinel=null,this.setupInfiniteScrollObserver())},e.addEventListener("lvt:updated",this.updatedListener),this.updatedListenerWrapper=e)}armLoadMoreTimeout(){this.clearLoadMoreTimeout(),this.loadMoreTimeoutId=window.setTimeout(()=>{this.logger.warn(`load_more response not received within ${z.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},z.LOAD_MORE_TIMEOUT_MS)}releaseLoadMore(){this.loadMorePending=!1,this.clearLoadMoreTimeout()}clearLoadMoreTimeout(){this.loadMoreTimeoutId!==null&&(clearTimeout(this.loadMoreTimeoutId),this.loadMoreTimeoutId=null)}setupInfiniteScrollMutationObserver(){let e=this.context.getWrapperElement();e&&(this.mutationObserver&&this.mutationObserver.disconnect(),this.mutationObserver=new MutationObserver(()=>{this.setupInfiniteScrollObserver()}),this.mutationObserver.observe(e,{childList:!0,subtree:!0}),this.logger.debug("MutationObserver set up successfully"))}teardown(){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null),this.mutationObserver&&(this.mutationObserver.disconnect(),this.mutationObserver=null),this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=null,this.updatedListenerWrapper=null,this.observedSentinel=null,this.releaseLoadMore()}};z.LOAD_MORE_TIMEOUT_MS=3e4;var ae=z;var le=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 ce=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!1})})}};var Ze=!1;function Nt(o){let e=o.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),i=document.getElementById(n);!i||!(i instanceof HTMLDialogElement)||(r==="show-modal"&&!i.open?i.showModal():r==="close"&&i.open&&i.close())}function et(){"commandForElement"in HTMLButtonElement.prototype||Ze||(Ze=!0,document.addEventListener("click",Nt))}function tt(o){return typeof structuredClone=="function"?structuredClone(o):JSON.parse(JSON.stringify(o))}function Ut(o){return o!=null&&typeof o=="object"&&Array.isArray(o.d)&&Array.isArray(o.s)}function Le(o,e=0){if(e>50||o==null||typeof o!="object"||Array.isArray(o))return!1;if(Ut(o))return!0;for(let n of Object.keys(o))if(/^\d+$/.test(n)){let r=o[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Le(r,e+1))return!0}return!1}function $t(o,e){if(!e.s||!Array.isArray(e.s))return!1;if(Le(o)&&!Le(e))return!0;for(let t of Object.keys(o))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var de=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e){let t=!1;for(let[r,i]of Object.entries(e))if(Array.isArray(i)&&i.length>0&&Array.isArray(i[0])&&typeof i[0][0]=="string"){let s=this.treeState[r];s&&typeof s=="object"&&!Array.isArray(s)&&Array.isArray(s.d)&&Array.isArray(s.s)?(this.treeState[r]=tt(s),this.applyDifferentialOpsToRange(this.treeState[r],i,r)):this.treeState[r]=i,t=!0}else{let s=this.treeState[r],l=typeof i=="object"&&i!==null&&!Array.isArray(i)?this.deepMergeTreeNodes(s,i,r):i;JSON.stringify(s)!==JSON.stringify(l)&&(this.treeState[r]=l,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 i;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if($t(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[a,s]of Object.entries(t)){let l=n?`${n}.${a}`:a,c=Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string",d=r[a]&&typeof r[a]=="object"&&!Array.isArray(r[a])&&Array.isArray(r[a].d)&&Array.isArray(r[a].s);c&&d?(r[a]=tt(r[a]),this.logger.debug(`[deepMerge] Applying diff ops at path ${l}`,{ops:s,rangeItems:(i=r[a].d)==null?void 0:i.length}),this.applyDifferentialOpsToRange(r[a],s,l)):typeof s=="object"&&s!==null&&!Array.isArray(s)&&typeof r[a]=="object"&&r[a]!==null&&!Array.isArray(r[a])?r[a]=this.deepMergeTreeNodes(r[a],s,l):r[a]=s}return r}applyDifferentialOpsToRange(e,t,n){if(!e||typeof e!="object"||!Array.isArray(e.d)||!Array.isArray(e.s)){this.logger.error(`[applyDiffOpsToRange] Invalid rangeStructure at path ${n}`,{rangeStructure:e});return}let r=e.d;this.rangeState[n]||(this.rangeState[n]={items:r,statics:e.s,staticsMap:e.sm}),e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[n]=e.m.idKey),this.logger.debug(`[applyDiffOpsToRange] path=${n}, idKey=${this.rangeIdKeys[n]}, items=${r.length}, ops=${t.length}`);for(let i of t){if(!Array.isArray(i)||i.length<2)continue;switch(i[0]){case"r":{let s=i[1],l=this.findItemIndexByKey(r,s,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${s}, index=${l}, total=${r.length}`),l>=0?(r.splice(l,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${s} not found`);break}case"u":{let s=this.findItemIndexByKey(r,i[1],e.s,n),l=i[2];s>=0&&l&&(r[s]=this.mergeRangeItem(r[s],l,n));break}case"a":{let s=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.push(...s),i[3]&&typeof i[3]=="object"&&i[3].idKey&&(this.rangeIdKeys[n]=i[3].idKey);break}case"p":{let s=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.unshift(...s);break}case"i":{let s=this.findItemIndexByKey(r,i[1],e.s,n);if(s>=0){let l=Array.isArray(i[2])?i[2]:[i[2]];r.splice(s+1,0,...l)}break}case"o":{let s=i[1],l=[],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 s){let p=c.get(d);p&&l.push(p)}r.length=0,r.push(...l);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 i=e.s[r];if(n+=i,r<e.s.length-1){let a=r.toString();if(e[a]!==void 0){let s=t?`${t}.${a}`:a;n+=this.renderValue(e[a],a,s)}}}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 a=n||t||"";return a&&(this.rangeState[a]={items:e.d,statics:e.s,staticsMap:e.sm},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[a]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),i=r.filter(a=>/^\d+$/.test(a)).sort((a,s)=>parseInt(a)-parseInt(s));if(i.length>0&&i.length===r.length)return i.map(a=>{let s=n?`${n}.${a}`:a;return this.renderValue(e[a],a,s)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,i)=>{let a=i.toString(),s=n?`${n}.${a}`:a;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,s):this.renderValue(r,a,s)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s:i,sm:a}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let l="else",c=n?`${n}.else`:"else";return this.renderValue(e.else,l,c)}return""}let s=a&&typeof a=="object";return i&&Array.isArray(i)?r.map((l,c)=>{let d=i;s&&l._sk&&a[l._sk]&&(d=a[l._sk]);let p="";for(let u=0;u<d.length;u++)if(p+=d[u],u<d.length-1){let f=u.toString();if(l[f]!==void 0){let v=n?`${n}.${c}.${f}`:`${c}.${f}`;p+=this.renderValue(l[f],f,v)}}return p}).join(""):r.map((l,c)=>{let d=c.toString(),p=n?`${n}.${d}`:d;return this.renderValue(l,d,p)}).join("")}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],i=n.statics;for(let s of e){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let c=this.findItemIndexByKey(r,s[1],i,t);c>=0&&r.splice(c,1);break}case"u":{let c=this.findItemIndexByKey(r,s[1],i,t),d=s[2];c>=0&&d&&(r[c]=this.mergeRangeItem(r[c],d,t||""));break}case"a":{this.addItemsToRange(r,s[1],s[2],n,!1),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[t||""]=s[3].idKey);break}case"p":{this.addItemsToRange(r,s[1],s[2],n,!0);break}case"i":{let c=this.findItemIndexByKey(r,s[1],i,t);if(c>=0){let d=Array.isArray(s[2])?s[2]:[s[2]];r.splice(c+1,0,...d)}break}case"o":{let c=s[1],d=[],p=new Map;for(let u of r){let f=this.getItemKey(u,i,t);f&&p.set(f,u)}for(let u of c){let f=p.get(u);f&&d.push(f)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics,staticsMap:n.staticsMap},this.treeState[t]={d:r,s:n.statics,sm:n.staticsMap};let a=this.getCurrentRangeStructure(t);return a&&a.s?this.renderItemsWithStatics(r,a.s,a.sm,t):r.map(s=>this.renderValue(s)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics,sm:this.rangeState[e].staticsMap};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n,r){let i=e.map((a,s)=>{let l=t;n&&typeof n=="object"&&a._sk&&n[a._sk]&&(l=n[a._sk]);let c="";for(let d=0;d<l.length;d++)if(c+=l[d],d<l.length-1){let p=d.toString();if(a[p]!==void 0){let u=r?`${r}.${s}.${p}`:`${s}.${p}`;c+=this.renderValue(a[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:",i.substring(0,200))),i}addItemsToRange(e,t,n,r,i){if(n&&(r.statics=n),!t)return;let a=Array.isArray(t)?t:[t];i?e.unshift(...a):e.push(...a)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(i=>this.getItemKey(i,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var ue=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 pe=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let i=this.escapeCSSSelector(n),a=e.querySelectorAll(`[name="${i}"]`);for(let s of a){if(this.wiredElements.has(s)||s.hasAttribute("lvt-input")||s.hasAttribute("lvt-change"))continue;let l=s.closest("form");l&&(l.hasAttribute("lvt-change")||l.hasAttribute("lvt-form:no-intercept"))||s instanceof HTMLInputElement&&(s.type==="hidden"||s.type==="submit"||s.type==="button")||s instanceof HTMLButtonElement||(this.attachListener(s,n,r),this.wiredElements.add(s))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let i=n.getAttribute("name");i&&(this.attachListener(n,i,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],i=this.detectBinding(n,r);i&&!this.boundFields.has(i.fieldName)&&this.boundFields.set(i.fieldName,i.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let i=r[1].toLowerCase();return i!=="checkbox"&&i!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),i=r?parseInt(r,10):NaN,a=Number.isNaN(i)||i<0?300:i,l=q(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},a),c=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(c,l),this.elementCleanups.set(e,()=>{e.removeEventListener(c,l)}),this.logger.debug(`Auto-wired ${c} listener on [name="${t}"] (debounce: ${a}ms)`)}};var Me=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===1&&this.socket.send(e)}disconnect(){this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){var s,l,c,d,p;this.clearReconnectTimer();let e=(s=this.options.maxReconnectAttempts)!=null?s:10;if(e>0&&this.reconnectAttempts>=e){(c=(l=this.options).onReconnectFailed)==null||c.call(l);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),i=Math.random()*1e3,a=Math.min(r+i,n);this.reconnectTimer=window.setTimeout(()=>{var u,f;(f=(u=this.options).onReconnectAttempt)==null||f.call(u,this.reconnectAttempts,a),this.connect()},a)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},ge=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 Pt(e,this.config.logger))return{usingWebSocket:!1,initialState:await nt(e,this.config.logger)};let n,r,i=new Promise((p,u)=>{n=p,r=u}),a=!1,s=!1,l=null,c=p=>{a||(a=!0,l!==null&&(clearTimeout(l),l=null),p?r(p):n({usingWebSocket:!0}))};l=setTimeout(()=>{c(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Me({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{s=!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:()=>{s?this.config.onDisconnected():c(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(p,u)=>{var f,v;(v=(f=this.config).onReconnectAttempt)==null||v.call(f,p,u)},onReconnectFailed:()=>{var p,u;(u=(p=this.config).onReconnectFailed)==null||u.call(p)},onError:p=>{var u,f;(f=(u=this.config).onError)==null||f.call(u,p),c(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await i}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 nt(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 Pt(o,e){try{let n=(await fetch(o,{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 nt(o,e){try{let t=await fetch(o,{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 fe=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let i=new XMLHttpRequest;i.upload.addEventListener("progress",s=>{s.lengthComputable&&(e.bytesUploaded=s.loaded,e.progress=Math.round(s.loaded/s.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{i.abort()});let a=new Promise((s,l)=>{i.addEventListener("load",()=>{i.status>=200&&i.status<300?(e.done=!0,e.progress=100,s()):l(new Error(`S3 upload failed with status ${i.status}: ${i.statusText}`))}),i.addEventListener("error",()=>{l(new Error("S3 upload failed: Network error"))}),i.addEventListener("abort",()=>{l(new Error("S3 upload cancelled"))})});if(i.open("PUT",t.url),t.headers)for(let[s,l]of Object.entries(t.headers))i.setRequestHeader(s,l);i.send(r),await a}catch(i){throw e.error=i instanceof Error?i.message:String(i),i}}};var he=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 fe)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let i=this.inputHandlers.get(n);i&&n.removeEventListener("change",i);let a=s=>{let l=s.target.files;!l||l.length===0||this.startUpload(r,Array.from(l))};n.addEventListener("change",a),this.inputHandlers.set(n,a)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(i=>({name:i.name,type:i.type||"application/octet-stream",size:i.size})),r={action:"upload_start",upload_name:e,files:n};this.sendMessage(r)}async handleUploadStartResponse(e){let{upload_name:t,entries:n}=e;n.length>0&&this.autoUploadConfig.set(t,n[0].auto_upload);let r=this.pendingFiles.get(t);if(!r){console.error(`No pending files found for upload: ${t}`);return}this.pendingFiles.delete(t);let i=new Map;for(let s of r)i.set(s.name,s);let a=[];for(let s of n){let l=i.get(s.client_name);if(!l){console.warn(`No file found for entry ${s.entry_id} (client_name: ${s.client_name})`);continue}let c={id:s.entry_id,file:l,uploadName:t,progress:0,bytesUploaded:0,valid:s.valid,done:!1,error:s.error,external:s.external};if(this.entries.set(c.id,c),a.push(c),!s.valid){this.onError&&s.error&&this.onError(c,s.error);continue}s.auto_upload&&(s.external?this.uploadExternal(c,s.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 a=Math.min(r+this.chunkSize,t.size),s=t.slice(r,a),l=await this.fileToBase64(s),c={action:"upload_chunk",entry_id:n,chunk_base64:l,offset:r,total:t.size};this.sendMessage(c),r=a,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let i={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(i),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(i){let a=i instanceof Error?i.message:String(i);e.error=a,this.onError&&this.onError(e,a),this.cleanupEntries(e.uploadName)}}handleProgressMessage(e){let t=this.entries.get(e.entry_id);t&&(t.progress=e.progress,t.bytesUploaded=e.bytes_recv,this.onProgress&&this.onProgress(t))}cancelUpload(e){let t=this.entries.get(e);t&&(t.abortController&&t.abortController.abort(),this.sendMessage({action:"cancel_upload",entry_id:e}),this.entries.delete(e))}getEntries(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&t.push(n);return t}triggerPendingUploads(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&n.progress===0&&!n.done&&!n.error&&t.push(n);for(let n of t)n.external?this.uploadExternal(n,n.external):this.uploadChunked(n)}registerUploader(e,t){this.uploaders.set(e,t)}clearFileInput(e){document.querySelectorAll(`input[type="file"][lvt-upload="${e}"]`).forEach(n=>{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,i]of this.entries)e&&i.uploadName!==e||(i.done||i.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let a=r.result.split(",")[1];t(a)},r.onerror=n,r.readAsDataURL(e)})}};var rt={silent:0,error:1,warn:2,info:3,debug:4},it="LiveTemplate",ke=class o{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 o(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 rt[e]<=rt[this.state.level]}formatPrefix(){return this.scope.length===0?`[${it}]`:`[${it}:${this.scope.join(":")}]`}};function xe(o={}){var n,r;let e={level:(n=o.level)!=null?n:"info"},t=Array.isArray(o.scope)?o.scope:o.scope?[o.scope]:[];return new ke(e,t,(r=o.sink)!=null?r:console)}async function st(o,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let i=t("fs"),a=JSON.parse(i.readFileSync(e,"utf8"));return o.applyUpdate(a)}let r=await(await fetch(e)).json();return o.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function ot(o,e){let t=[],n=c=>c.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(o),i=n(e);if(r===i)return{match:!0,differences:[]};let a=r.split(`
29
+ `,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}};var ce=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(i=>{i.disabled=!1})})}};var Ze=!1;function Dt(o){let e=o.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),i=document.getElementById(n);!i||!(i instanceof HTMLDialogElement)||(r==="show-modal"&&!i.open?i.showModal():r==="close"&&i.open&&i.close())}function et(){"commandForElement"in HTMLButtonElement.prototype||Ze||(Ze=!0,document.addEventListener("click",Dt))}function tt(o){return typeof structuredClone=="function"?structuredClone(o):JSON.parse(JSON.stringify(o))}function Ut(o){return o!=null&&typeof o=="object"&&Array.isArray(o.d)&&Array.isArray(o.s)}function Le(o,e=0){if(e>50||o==null||typeof o!="object"||Array.isArray(o))return!1;if(Ut(o))return!0;for(let n of Object.keys(o))if(/^\d+$/.test(n)){let r=o[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Le(r,e+1))return!0}return!1}function $t(o,e){if(!e.s||!Array.isArray(e.s))return!1;if(Le(o)&&!Le(e))return!0;for(let t of Object.keys(o))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var de=class{constructor(e){this.logger=e;this.treeState={};this.rangeState={};this.rangeIdKeys={}}applyUpdate(e){let t=!1;for(let[r,i]of Object.entries(e))if(Array.isArray(i)&&i.length>0&&Array.isArray(i[0])&&typeof i[0][0]=="string"){let s=this.treeState[r];s&&typeof s=="object"&&!Array.isArray(s)&&Array.isArray(s.d)&&Array.isArray(s.s)?(this.treeState[r]=tt(s),this.applyDifferentialOpsToRange(this.treeState[r],i,r)):this.treeState[r]=i,t=!0}else{let s=this.treeState[r],l=typeof i=="object"&&i!==null&&!Array.isArray(i)?this.deepMergeTreeNodes(s,i,r):i;JSON.stringify(s)!==JSON.stringify(l)&&(this.treeState[r]=l,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 i;if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if($t(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[a,s]of Object.entries(t)){let l=n?`${n}.${a}`:a,c=Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string",d=r[a]&&typeof r[a]=="object"&&!Array.isArray(r[a])&&Array.isArray(r[a].d)&&Array.isArray(r[a].s);c&&d?(r[a]=tt(r[a]),this.logger.debug(`[deepMerge] Applying diff ops at path ${l}`,{ops:s,rangeItems:(i=r[a].d)==null?void 0:i.length}),this.applyDifferentialOpsToRange(r[a],s,l)):typeof s=="object"&&s!==null&&!Array.isArray(s)&&typeof r[a]=="object"&&r[a]!==null&&!Array.isArray(r[a])?r[a]=this.deepMergeTreeNodes(r[a],s,l):r[a]=s}return r}applyDifferentialOpsToRange(e,t,n){if(!e||typeof e!="object"||!Array.isArray(e.d)||!Array.isArray(e.s)){this.logger.error(`[applyDiffOpsToRange] Invalid rangeStructure at path ${n}`,{rangeStructure:e});return}let r=e.d;this.rangeState[n]||(this.rangeState[n]={items:r,statics:e.s,staticsMap:e.sm}),e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[n]=e.m.idKey),this.logger.debug(`[applyDiffOpsToRange] path=${n}, idKey=${this.rangeIdKeys[n]}, items=${r.length}, ops=${t.length}`);for(let i of t){if(!Array.isArray(i)||i.length<2)continue;switch(i[0]){case"r":{let s=i[1],l=this.findItemIndexByKey(r,s,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${s}, index=${l}, total=${r.length}`),l>=0?(r.splice(l,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${s} not found`);break}case"u":{let s=this.findItemIndexByKey(r,i[1],e.s,n),l=i[2];s>=0&&l&&(r[s]=this.mergeRangeItem(r[s],l,n));break}case"a":{let s=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.push(...s),i[3]&&typeof i[3]=="object"&&i[3].idKey&&(this.rangeIdKeys[n]=i[3].idKey);break}case"p":{let s=Array.isArray(i[1])?i[1]:[i[1]];i[2]&&(e.s=i[2]),r.unshift(...s);break}case"i":{let s=this.findItemIndexByKey(r,i[1],e.s,n);if(s>=0){let l=Array.isArray(i[2])?i[2]:[i[2]];r.splice(s+1,0,...l)}break}case"o":{let s=i[1],l=[],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 s){let p=c.get(d);p&&l.push(p)}r.length=0,r.push(...l);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 i=e.s[r];if(n+=i,r<e.s.length-1){let a=r.toString();if(e[a]!==void 0){let s=t?`${t}.${a}`:a;n+=this.renderValue(e[a],a,s)}}}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 a=n||t||"";return a&&(this.rangeState[a]={items:e.d,statics:e.s,staticsMap:e.sm},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[a]=e.m.idKey)),this.renderRangeStructure(e,t,n)}if("s"in e&&Array.isArray(e.s))return this.reconstructFromTree(e,n||"");let r=Object.keys(e),i=r.filter(a=>/^\d+$/.test(a)).sort((a,s)=>parseInt(a)-parseInt(s));if(i.length>0&&i.length===r.length)return i.map(a=>{let s=n?`${n}.${a}`:a;return this.renderValue(e[a],a,s)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,i)=>{let a=i.toString(),s=n?`${n}.${a}`:a;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,s):this.renderValue(r,a,s)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s:i,sm:a}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let l="else",c=n?`${n}.else`:"else";return this.renderValue(e.else,l,c)}return""}let s=a&&typeof a=="object";return i&&Array.isArray(i)?r.map((l,c)=>{let d=i;s&&l._sk&&a[l._sk]&&(d=a[l._sk]);let p="";for(let u=0;u<d.length;u++)if(p+=d[u],u<d.length-1){let f=u.toString();if(l[f]!==void 0){let v=n?`${n}.${c}.${f}`:`${c}.${f}`;p+=this.renderValue(l[f],f,v)}}return p}).join(""):r.map((l,c)=>{let d=c.toString(),p=n?`${n}.${d}`:d;return this.renderValue(l,d,p)}).join("")}applyDifferentialOperations(e,t){if(!t||!this.rangeState[t])return"";let n=this.rangeState[t],r=[...n.items],i=n.statics;for(let s of e){if(!Array.isArray(s)||s.length<2)continue;switch(s[0]){case"r":{let c=this.findItemIndexByKey(r,s[1],i,t);c>=0&&r.splice(c,1);break}case"u":{let c=this.findItemIndexByKey(r,s[1],i,t),d=s[2];c>=0&&d&&(r[c]=this.mergeRangeItem(r[c],d,t||""));break}case"a":{this.addItemsToRange(r,s[1],s[2],n,!1),s[3]&&typeof s[3]=="object"&&s[3].idKey&&(this.rangeIdKeys[t||""]=s[3].idKey);break}case"p":{this.addItemsToRange(r,s[1],s[2],n,!0);break}case"i":{let c=this.findItemIndexByKey(r,s[1],i,t);if(c>=0){let d=Array.isArray(s[2])?s[2]:[s[2]];r.splice(c+1,0,...d)}break}case"o":{let c=s[1],d=[],p=new Map;for(let u of r){let f=this.getItemKey(u,i,t);f&&p.set(f,u)}for(let u of c){let f=p.get(u);f&&d.push(f)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics,staticsMap:n.staticsMap},this.treeState[t]={d:r,s:n.statics,sm:n.staticsMap};let a=this.getCurrentRangeStructure(t);return a&&a.s?this.renderItemsWithStatics(r,a.s,a.sm,t):r.map(s=>this.renderValue(s)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics,sm:this.rangeState[e].staticsMap};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n,r){let i=e.map((a,s)=>{let l=t;n&&typeof n=="object"&&a._sk&&n[a._sk]&&(l=n[a._sk]);let c="";for(let d=0;d<l.length;d++)if(c+=l[d],d<l.length-1){let p=d.toString();if(a[p]!==void 0){let u=r?`${r}.${s}.${p}`:`${s}.${p}`;c+=this.renderValue(a[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:",i.substring(0,200))),i}addItemsToRange(e,t,n,r,i){if(n&&(r.statics=n),!t)return;let a=Array.isArray(t)?t:[t];i?e.unshift(...a):e.push(...a)}getItemKey(e,t,n){if(e._k&&typeof e._k=="string")return e._k;if(!n||!this.rangeIdKeys[n])return null;let r=this.rangeIdKeys[n];return e[r]||null}findItemIndexByKey(e,t,n,r){return e.findIndex(i=>this.getItemKey(i,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};var ue=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 pe=class{constructor(e,t){this.context=e;this.logger=t;this.boundFields=new Map;this.enabled=!1;this.wiredElements=new Set;this.elementCleanups=new Map}setCapabilities(e){this.enabled=e.includes("change"),this.logger.debug("Capabilities received, change auto-wiring:",this.enabled?"enabled":"disabled")}analyzeStatics(e){let t=this.boundFields.size;this.walkTree(e),this.boundFields.size>t&&this.logger.debug(`Detected ${this.boundFields.size} bound field(s):`,Array.from(this.boundFields.keys()))}wireElements(){if(!this.enabled)return;let e=this.context.getWrapperElement();if(!e)return;for(let n of this.elementCleanups.keys())n.isConnected||(this.elementCleanups.get(n)(),this.elementCleanups.delete(n),this.wiredElements.delete(n));for(let[n,r]of this.boundFields){let i=this.escapeCSSSelector(n),a=e.querySelectorAll(`[name="${i}"]`);for(let s of a){if(this.wiredElements.has(s)||s.hasAttribute("lvt-input")||s.hasAttribute("lvt-change"))continue;let l=s.closest("form");l&&(l.hasAttribute("lvt-change")||l.hasAttribute("lvt-form:no-intercept"))||s instanceof HTMLInputElement&&(s.type==="hidden"||s.type==="submit"||s.type==="button")||s instanceof HTMLButtonElement||(this.attachListener(s,n,r),this.wiredElements.add(s))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let i=n.getAttribute("name");i&&(this.attachListener(n,i,"value"),this.wiredElements.add(n))}}teardown(){for(let e of this.elementCleanups.values())e();this.elementCleanups.clear(),this.wiredElements.clear(),this.boundFields.clear(),this.enabled=!1}getBoundFields(){return this.boundFields}isEnabled(){return this.enabled}walkTree(e){if(!(!e||typeof e!="object"||Array.isArray(e))){e.s&&Array.isArray(e.s)&&this.analyzeStaticsArray(e.s);for(let t of Object.keys(e))if(/^\d+$/.test(t)){let n=e[t];n&&typeof n=="object"&&!Array.isArray(n)&&this.walkTree(n)}if(e.d&&Array.isArray(e.d))for(let t of e.d)t&&typeof t=="object"&&!Array.isArray(t)&&this.walkTree(t)}}analyzeStaticsArray(e){for(let t=0;t<e.length-1;t++){let n=e[t],r=e[t+1],i=this.detectBinding(n,r);i&&!this.boundFields.has(i.fieldName)&&this.boundFields.set(i.fieldName,i.bindingType)}}detectBinding(e,t){let n=this.detectValueBinding(e);return n?{fieldName:n,bindingType:"value"}:(n=this.detectTextareaBinding(e,t),n?{fieldName:n,bindingType:"content"}:(n=this.detectAttributeBinding(e,t),n?{fieldName:n,bindingType:"attribute"}:null))}escapeCSSSelector(e){return typeof CSS!="undefined"&&typeof CSS.escape=="function"?CSS.escape(e):e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}extractUnclosedTag(e){let t=e.lastIndexOf("<"),n=e.lastIndexOf(">");return t===-1||t<=n?null:e.substring(t)}extractNameFromTag(e){let t=e.match(/\sname="([^"]+)"/);return t?t[1]:null}detectValueBinding(e){if(!e.endsWith('value="'))return null;let t=this.extractUnclosedTag(e);return t?this.extractNameFromTag(t):null}detectTextareaBinding(e,t){if(!t.startsWith("</textarea"))return null;let n=e.match(/<textarea[^>]*\sname="([^"]+)"[^>]*>$/);return n?n[1]:null}detectAttributeBinding(e,t){if(!e.endsWith(" ")||!/^[a-zA-Z>/\s]/.test(t))return null;let n=this.extractUnclosedTag(e);if(!n||!/^<input\s/i.test(n))return null;let r=n.match(/\stype="([^"]+)"/i);if(!r)return null;let i=r[1].toLowerCase();return i!=="checkbox"&&i!=="radio"?null:this.extractNameFromTag(n)}attachListener(e,t,n){let r=e.getAttribute("lvt-debounce"),i=r?parseInt(r,10):NaN,a=Number.isNaN(i)||i<0?300:i,l=q(()=>{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},a),c=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(c,l),this.elementCleanups.set(e,()=>{e.removeEventListener(c,l)}),this.logger.debug(`Auto-wired ${c} listener on [name="${t}"] (debounce: ${a}ms)`)}};var Me=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===1&&this.socket.send(e)}disconnect(){this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){var s,l,c,d,p;this.clearReconnectTimer();let e=(s=this.options.maxReconnectAttempts)!=null?s:10;if(e>0&&this.reconnectAttempts>=e){(c=(l=this.options).onReconnectFailed)==null||c.call(l);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),i=Math.random()*1e3,a=Math.min(r+i,n);this.reconnectTimer=window.setTimeout(()=>{var u,f;(f=(u=this.options).onReconnectAttempt)==null||f.call(u,this.reconnectAttempts,a),this.connect()},a)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}},ge=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 Pt(e,this.config.logger))return{usingWebSocket:!1,initialState:await nt(e,this.config.logger)};let n,r,i=new Promise((p,u)=>{n=p,r=u}),a=!1,s=!1,l=null,c=p=>{a||(a=!0,l!==null&&(clearTimeout(l),l=null),p?r(p):n({usingWebSocket:!0}))};l=setTimeout(()=>{c(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new Me({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{s=!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:()=>{s?this.config.onDisconnected():c(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(p,u)=>{var f,v;(v=(f=this.config).onReconnectAttempt)==null||v.call(f,p,u)},onReconnectFailed:()=>{var p,u;(u=(p=this.config).onReconnectFailed)==null||u.call(p)},onError:p=>{var u,f;(f=(u=this.config).onError)==null||f.call(u,p),c(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await i}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 nt(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 Pt(o,e){try{let n=(await fetch(o,{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 nt(o,e){try{let t=await fetch(o,{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 fe=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let i=new XMLHttpRequest;i.upload.addEventListener("progress",s=>{s.lengthComputable&&(e.bytesUploaded=s.loaded,e.progress=Math.round(s.loaded/s.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{i.abort()});let a=new Promise((s,l)=>{i.addEventListener("load",()=>{i.status>=200&&i.status<300?(e.done=!0,e.progress=100,s()):l(new Error(`S3 upload failed with status ${i.status}: ${i.statusText}`))}),i.addEventListener("error",()=>{l(new Error("S3 upload failed: Network error"))}),i.addEventListener("abort",()=>{l(new Error("S3 upload cancelled"))})});if(i.open("PUT",t.url),t.headers)for(let[s,l]of Object.entries(t.headers))i.setRequestHeader(s,l);i.send(r),await a}catch(i){throw e.error=i instanceof Error?i.message:String(i),i}}};var he=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 fe)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let i=this.inputHandlers.get(n);i&&n.removeEventListener("change",i);let a=s=>{let l=s.target.files;!l||l.length===0||this.startUpload(r,Array.from(l))};n.addEventListener("change",a),this.inputHandlers.set(n,a)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(i=>({name:i.name,type:i.type||"application/octet-stream",size:i.size})),r={action:"upload_start",upload_name:e,files:n};this.sendMessage(r)}async handleUploadStartResponse(e){let{upload_name:t,entries:n}=e;n.length>0&&this.autoUploadConfig.set(t,n[0].auto_upload);let r=this.pendingFiles.get(t);if(!r){console.error(`No pending files found for upload: ${t}`);return}this.pendingFiles.delete(t);let i=new Map;for(let s of r)i.set(s.name,s);let a=[];for(let s of n){let l=i.get(s.client_name);if(!l){console.warn(`No file found for entry ${s.entry_id} (client_name: ${s.client_name})`);continue}let c={id:s.entry_id,file:l,uploadName:t,progress:0,bytesUploaded:0,valid:s.valid,done:!1,error:s.error,external:s.external};if(this.entries.set(c.id,c),a.push(c),!s.valid){this.onError&&s.error&&this.onError(c,s.error);continue}s.auto_upload&&(s.external?this.uploadExternal(c,s.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 a=Math.min(r+this.chunkSize,t.size),s=t.slice(r,a),l=await this.fileToBase64(s),c={action:"upload_chunk",entry_id:n,chunk_base64:l,offset:r,total:t.size};this.sendMessage(c),r=a,e.bytesUploaded=r,e.progress=Math.round(r/t.size*100),this.onProgress&&this.onProgress(e)}e.done=!0;let i={action:"upload_complete",upload_name:e.uploadName,entry_ids:[n]};this.sendMessage(i),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(i){let a=i instanceof Error?i.message:String(i);e.error=a,this.onError&&this.onError(e,a),this.cleanupEntries(e.uploadName)}}handleProgressMessage(e){let t=this.entries.get(e.entry_id);t&&(t.progress=e.progress,t.bytesUploaded=e.bytes_recv,this.onProgress&&this.onProgress(t))}cancelUpload(e){let t=this.entries.get(e);t&&(t.abortController&&t.abortController.abort(),this.sendMessage({action:"cancel_upload",entry_id:e}),this.entries.delete(e))}getEntries(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&t.push(n);return t}triggerPendingUploads(e){let t=[];for(let n of this.entries.values())n.uploadName===e&&n.progress===0&&!n.done&&!n.error&&t.push(n);for(let n of t)n.external?this.uploadExternal(n,n.external):this.uploadChunked(n)}registerUploader(e,t){this.uploaders.set(e,t)}clearFileInput(e){document.querySelectorAll(`input[type="file"][lvt-upload="${e}"]`).forEach(n=>{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,i]of this.entries)e&&i.uploadName!==e||(i.done||i.error)&&n.push(r);for(let r of n)this.entries.delete(r)},t)}fileToBase64(e){return new Promise((t,n)=>{let r=new FileReader;r.onload=()=>{let a=r.result.split(",")[1];t(a)},r.onerror=n,r.readAsDataURL(e)})}};var rt={silent:0,error:1,warn:2,info:3,debug:4},it="LiveTemplate",ke=class o{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 o(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 rt[e]<=rt[this.state.level]}formatPrefix(){return this.scope.length===0?`[${it}]`:`[${it}:${this.scope.join(":")}]`}};function xe(o={}){var n,r;let e={level:(n=o.level)!=null?n:"info"},t=Array.isArray(o.scope)?o.scope:o.scope?[o.scope]:[];return new ke(e,t,(r=o.sink)!=null?r:console)}async function st(o,e){try{let t=globalThis==null?void 0:globalThis.require;if(typeof t=="function"){let i=t("fs"),a=JSON.parse(i.readFileSync(e,"utf8"));return o.applyUpdate(a)}let r=await(await fetch(e)).json();return o.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function ot(o,e){let t=[],n=c=>c.replace(/\s+/g," ").replace(/>\s+</g,"><").trim(),r=n(o),i=n(e);if(r===i)return{match:!0,differences:[]};let a=r.split(`
30
30
  `),s=i.split(`
31
- `),l=Math.max(a.length,s.length);for(let c=0;c<l;c++){let d=a[c]||"",p=s[c]||"";d!==p&&(t.push(`Line ${c+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${p}`))}return{match:!1,differences:t}}var me=class o{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,...i}=e,a=n!=null?n:r?"debug":"info",s=t!=null?t:xe({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):s.setLevel(a),this.logger=s.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...i},this.treeRenderer=new de(this.logger.child("TreeRenderer")),this.focusManager=new Z(this.logger.child("FocusManager")),this.formLifecycleManager=new ue,this.loadingIndicator=new le,this.formDisabler=new ce,this.uploadHandler=new he(l=>this.send(l),{chunkSize:256*1024,onProgress:l=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:l}}))},onComplete:(l,c)=>{this.logger.info(`Upload complete: ${l}`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:l,entries:c}}))},onError:(l,c)=>{this.logger.error(`Upload error for ${l.id}:`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:l,error:c}}))}}),this.eventDelegator=new se({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:l=>this.parseValue(l),send:l=>this.send(l),sendHTTPMultipart:(l,c,d)=>this.sendHTTPMultipart(l,c,d),setActiveSubmission:(l,c,d)=>this.formLifecycleManager.setActiveSubmission(l,c,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:l=>this.uploadHandler.triggerPendingUploads(l)},this.logger.child("EventDelegator")),this.linkInterceptor=new oe({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:l=>this.handleNavigationResponse(l)},this.logger.child("LinkInterceptor")),this.observerManager=new ae({getWrapperElement:()=>this.wrapperElement,send:l=>this.send(l)},this.logger.child("ObserverManager")),this.changeAutoWirer=new pe({getWrapperElement:()=>this.wrapperElement,send:l=>this.send(l)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new ge({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var l,c,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(c=(l=this.options).onConnect)==null||c.call(l),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var l,c,d;this.ws=null,this.logger.info("WebSocket disconnected"),(c=(l=this.options).onDisconnect)==null||c.call(l),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(l,c)=>{this.handleWebSocketPayload(l,c)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:l=>{var c,d;this.logger.error("WebSocket error:",l),(d=(c=this.options).onError)==null||d.call(c,l)}})}static autoInit(){let e=xe({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new o;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(a=>{e.error("Auto-initialization connect failed:",a)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,i,a;let n=e;if(n.type==="upload_progress"){this.uploadHandler.handleProgressMessage(n);return}if(n.upload_name&&n.entries){let s=n;try{this.handleUploadStartResponse(s)}catch(l){this.logger.error("Error handling upload start response:",l)}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),this.wrapperElement&&((r=e.meta)!=null&&r.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(i=e.meta)==null?void 0:i.action,success:(a=e.meta)==null?void 0:a.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ye(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ie(),et(),Ve(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(),this.wrapperElement&&(Ke(this.wrapperElement),je(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"}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),i=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!i.ok)throw new Error(`HTTP multipart request failed: ${i.status}`);let a=await i.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}handleNavigationResponse(e){var c;if(!this.wrapperElement)return;let n=new DOMParser().parseFromString(e,"text/html"),r=this.wrapperElement.getAttribute("data-lvt-id"),i=(c=n.querySelector("title"))==null?void 0:c.textContent;i&&(document.title=i);let a=r?n.querySelector(`[data-lvt-id="${r}"]`):null;if(a){this.wrapperElement.replaceChildren(...Array.from(a.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement);return}let s=n.querySelector("[data-lvt-id]");if(s){let d=s.getAttribute("data-lvt-id");if(!d){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(r),this.eventDelegator.teardownForWrapper(r);let p=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",d),this.wrapperElement.replaceChildren(...Array.from(s.childNodes).map(k=>k.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement),window.scrollTo(0,0);let u=window.location.pathname+window.location.search;this.liveUrlOverride=u,this.webSocketManager.setLiveUrl(u);let v=`[data-lvt-id="${d.replace(/[\\"]/g,"\\$&")}"]`;this.connect(v).catch(k=>{p===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",k),window.location.reload())});return}this.linkInterceptor.teardownForWrapper(r),this.eventDelegator.teardownForWrapper(r),this.disconnect();let l=n.querySelector("body");l&&this.wrapperElement.replaceChildren(...Array.from(l.childNodes).map(d=>d.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let 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 l=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${l}</body>`)}updateDOM(e,t,n){let r=this.applyUpdate(t),i=s=>!s||typeof s!="object"?!1:s.s&&Array.isArray(s.s)?!0:Object.values(s).some(l=>i(l));if(!r.changed&&!i(t))return;let a=document.createElement(e.tagName);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"))),a.innerHTML=r.html,this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr"))),De(e,a,{childrenOnly:!0,getNodeKey:s=>{if(s.nodeType===1)return s.getAttribute("data-key")||s.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(s,l)=>this.focusManager.shouldSkipUpdate(s)||s.isEqualNode(l)?!1:(this.executeLifecycleHook(s,"lvt-updated"),!0),onElUpdated:s=>{var l;s instanceof HTMLTextAreaElement&&(s.value=(l=s.textContent)!=null?l:"")},onNodeAdded:s=>{var l;s instanceof HTMLTextAreaElement&&(s.value=(l=s.textContent)!=null?l:""),s.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(s,"lvt-mounted")},onBeforeNodeDiscarded:s=>(s.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(s,"lvt-destroyed"),!0)}),this.focusManager.restoreFocusedElement(),qe(e),ze(e),Ge(e),Be(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),Xe(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"&&me.autoInit();return pt(Bt);})();
31
+ `),l=Math.max(a.length,s.length);for(let c=0;c<l;c++){let d=a[c]||"",p=s[c]||"";d!==p&&(t.push(`Line ${c+1}:`),t.push(` Expected: ${d}`),t.push(` Actual: ${p}`))}return{match:!1,differences:t}}var me=class o{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,...i}=e,a=n!=null?n:r?"debug":"info",s=t!=null?t:xe({level:a});t?n?t.setLevel(n):r&&t.setLevel("debug"):s.setLevel(a),this.logger=s.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...i},this.treeRenderer=new de(this.logger.child("TreeRenderer")),this.focusManager=new Z(this.logger.child("FocusManager")),this.formLifecycleManager=new ue,this.loadingIndicator=new le,this.formDisabler=new ce,this.uploadHandler=new he(l=>this.send(l),{chunkSize:256*1024,onProgress:l=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:l}}))},onComplete:(l,c)=>{this.logger.info(`Upload complete: ${l}`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:l,entries:c}}))},onError:(l,c)=>{this.logger.error(`Upload error for ${l.id}:`,c),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:l,error:c}}))}}),this.eventDelegator=new se({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:l=>this.parseValue(l),send:l=>this.send(l),sendHTTPMultipart:(l,c,d)=>this.sendHTTPMultipart(l,c,d),setActiveSubmission:(l,c,d)=>this.formLifecycleManager.setActiveSubmission(l,c,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:l=>this.uploadHandler.triggerPendingUploads(l)},this.logger.child("EventDelegator")),this.linkInterceptor=new oe({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:l=>this.handleNavigationResponse(l),sendNavigate:l=>this.sendNavigate(l),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new ae({getWrapperElement:()=>this.wrapperElement,send:l=>this.send(l)},this.logger.child("ObserverManager")),this.changeAutoWirer=new pe({getWrapperElement:()=>this.wrapperElement,send:l=>this.send(l)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new ge({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{var l,c,d;this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),(c=(l=this.options).onConnect)==null||c.call(l),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{var l,c,d;this.ws=null,this.logger.info("WebSocket disconnected"),(c=(l=this.options).onDisconnect)==null||c.call(l),(d=this.wrapperElement)==null||d.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(l,c)=>{this.handleWebSocketPayload(l,c)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:l=>{var c,d;this.logger.error("WebSocket error:",l),(d=(c=this.options).onError)==null||d.call(c,l)}})}static autoInit(){let e=xe({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new o;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement)),r.connect().catch(a=>{e.error("Auto-initialization connect failed:",a)}),window.liveTemplateClient=r}};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",t):t()}handleWebSocketPayload(e,t){var r,i,a;let n=e;if(n.type==="upload_progress"){this.uploadHandler.handleProgressMessage(n);return}if(n.upload_name&&n.entries){let s=n;try{this.handleUploadStartResponse(s)}catch(l){this.logger.error("Error handling upload start response:",l)}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),this.wrapperElement&&((r=e.meta)!=null&&r.capabilities&&this.changeAutoWirer.setCapabilities(e.meta.capabilities),this.changeAutoWirer.analyzeStatics(e.tree),this.updateDOM(this.wrapperElement,e.tree,e.meta),this.messageCount++,this.wrapperElement.dispatchEvent(new CustomEvent("lvt:updated",{detail:{messageCount:this.messageCount,action:(i=e.meta)==null?void 0:i.action,success:(a=e.meta)==null?void 0:a.success}})))}async connect(e="[data-lvt-id]"){var n,r;if(this.wrapperElement=document.querySelector(e),!this.wrapperElement)throw new Error(`LiveTemplate wrapper not found with selector: ${e}`);this.webSocketManager.disconnect();let t=await this.webSocketManager.connect();this.useHTTP=!t.usingWebSocket,this.useHTTP&&(this.ws=null,this.logger.info("WebSocket not available, using HTTP mode"),(r=(n=this.options).onConnect)==null||r.call(n),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),Ye(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),ie(),et(),Ve(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(),this.wrapperElement&&(Ke(this.wrapperElement),je(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((a,s)=>{r.has(s)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:s,href:e}),r.add(s),n[s]=a});let i=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let a=this.webSocketManager.getReadyState();return a===3?this.logger.error("sendNavigate: WebSocket is CLOSED and autoReconnect may be disabled; navigate message dropped. Reload or re-enable autoReconnect.",{href:e}):this.options.autoReconnect?this.logger.warn("sendNavigate: WS not open; browser URL is ahead of server state until reconnect",{href:e,readyState:a}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:a}),!1}return this.liveUrlOverride=i,this.webSocketManager.setLiveUrl(i),this.logger.debug("sendNavigate",{href:e,data:n}),this.send({action:"__navigate__",data:n}),!0}async sendHTTP(e){try{let t=this.getLiveUrl(),n=await fetch(t,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(e)});if(!n.ok)throw new Error(`HTTP request failed: ${n.status}`);let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}catch(t){this.logger.error("Failed to send HTTP request:",t)}}sendHTTPMultipart(e,t,n){this.doSendHTTPMultipart(e,t,n)}async doSendHTTPMultipart(e,t,n){try{let r=this.getLiveUrl(),i=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!i.ok)throw new Error(`HTTP multipart request failed: ${i.status}`);let a=await i.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,a.tree,a.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}handleNavigationResponse(e){var l;if(!this.wrapperElement)return;let n=new DOMParser().parseFromString(e,"text/html"),r=this.wrapperElement.getAttribute("data-lvt-id"),i=(l=n.querySelector("title"))==null?void 0:l.textContent;i&&(document.title=i);let a=n.querySelector("[data-lvt-id]");if(a){let c=a.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(a.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 f=`[data-lvt-id="${c.replace(/[\\"]/g,"\\$&")}"]`;this.connect(f).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 s=n.querySelector("body");s&&this.wrapperElement.replaceChildren(...Array.from(s.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 l=`<div data-lvt-id="${this.lvtId||"lvt-unknown"}">`+r+"</div>";return e.replace(/<body>[\s\S]*?<\/body>/,`<body>${l}</body>`)}updateDOM(e,t,n){let r=this.applyUpdate(t),i=s=>!s||typeof s!="object"?!1:s.s&&Array.isArray(s.s)?!0:Object.values(s).some(l=>i(l));if(!r.changed&&!i(t))return;let a=document.createElement(e.tagName);if(this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] element.tagName:",e.tagName),this.logger.debug("[updateDOM] result.html (first 500 chars):",r.html.substring(0,500)),this.logger.debug("[updateDOM] Has <table> tag:",r.html.includes("<table>")),this.logger.debug("[updateDOM] Has <tbody> tag:",r.html.includes("<tbody>")),this.logger.debug("[updateDOM] Has <tr> tag:",r.html.includes("<tr"))),/<script[\s>]/i.test(r.html)){let s=e.tagName.toLowerCase(),l=s==="body"||s==="html"?"div":s,d=new DOMParser().parseFromString(`<${l}>${r.html}</${l}>`,"text/html"),p=d.body.firstElementChild;p?a.replaceChildren(...Array.from(p.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),a.replaceChildren(...Array.from(d.body.childNodes)))}else a.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",a.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has <table>:",a.innerHTML.includes("<table>")),this.logger.debug("[updateDOM] tempWrapper has <tbody>:",a.innerHTML.includes("<tbody>")),this.logger.debug("[updateDOM] tempWrapper has <tr>:",a.innerHTML.includes("<tr"))),Ne(e,a,{childrenOnly:!0,getNodeKey:s=>{if(s.nodeType===1)return s.getAttribute("data-key")||s.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(s,l)=>{if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-preserve"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-preserve-attrs")&&s.nodeType===Node.ELEMENT_NODE){let c=s.attributes,d=l;for(let p=0;p<c.length;p++){let u=c[p];u.name==="lvt-preserve"||u.name==="lvt-preserve-attrs"||d.hasAttributeNS(u.namespaceURI,u.localName)||d.setAttributeNS(u.namespaceURI,u.name,u.value)}}return this.focusManager.shouldSkipUpdate(s)||s.isEqualNode(l)?!1:(this.executeLifecycleHook(s,"lvt-updated"),!0)},onElUpdated:s=>{var l;s instanceof HTMLTextAreaElement&&(s.value=(l=s.textContent)!=null?l:"")},onNodeAdded:s=>{var l;s instanceof HTMLTextAreaElement&&(s.value=(l=s.textContent)!=null?l:""),s.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(s,"lvt-mounted")},onBeforeNodeDiscarded:s=>(s.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(s,"lvt-destroyed"),!0)}),this.focusManager.restoreFocusedElement(),qe(e),ze(e),Ge(e),Be(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),Xe(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"&&me.autoInit();return pt(Bt);})();
32
32
  //# sourceMappingURL=livetemplate-client.browser.js.map