From 001f8898a2bf09b3e2799b62896ef4edb96e52fe Mon Sep 17 00:00:00 2001 From: Adnaan Badr Date: Sat, 20 Jun 2026 06:35:36 +0000 Subject: [PATCH] fix: stabilize flaky checkbox-toggle + SQLITE_BUSY E2E tests (#292) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three browser E2E tests flaked in the cross-repo job; two distinct, unrelated root causes (plus three more tests sharing cause #2): 1. TestActionButtons — SQLITE_BUSY. SQLite's busy_timeout defaults to 0, so a read that races a concurrent write fails immediately with "database is locked". The library now opens every SQLite connection with busy_timeout=5000 (internal/source: new sqliteDSN helper used by both SQLiteSource and the schema probe), and the test's own verification connection gets the same pragma — the read waits for the action's write to commit instead of failing. 2. Checkbox toggles never reflected the server's new state (TestAutoTasks_BasicToggle/_NoFullReload, TestLvtSourceMarkdownToggle/ ToggleBack). The client's morphdom pass preserves live state over server-rendered values; for a server-authoritative lvt-on:click="Toggle" checkbox that's backwards, so the server's toggle never reflected in the DOM. Fixed upstream in @livetemplate/client v0.14.3 (livetemplate/client#135): an lvt-on:click checkbox/radio is now server-authoritative by default. Bump @livetemplate/client 0.11.9 → 0.14.3 and rebuild the embedded bundle; no per-template attribute is needed — the framework handles it generically for every server-driven toggle. Also hardened the auto-task E2E interactions: switch from chromedp.Click to JS .click() (CDP click is unreliable for delegated handlers in headless Docker Chrome, as action_buttons_e2e_test.go already documents) and replace fixed sleeps with waitForDOM polling for the actual expected state. Verified locally against Docker Chrome with @livetemplate/client@0.14.3: TestActionButtons, all six TestAutoTasks, both markdown toggle tests green on repeat runs. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_01HyPY7btbvCZiLKkh9wSKJx --- action_buttons_e2e_test.go | 7 +- auto_tasks_e2e_test.go | 79 ++++++++----------- client/package-lock.json | 8 +- client/package.json | 2 +- .../client/tinkerdown-client.browser.js | 24 +++--- .../client/tinkerdown-client.browser.js.map | 4 +- internal/source/schema.go | 2 +- internal/source/sqlite.go | 17 +++- internal/source/sqlite_test.go | 23 ++++++ 9 files changed, 97 insertions(+), 69 deletions(-) diff --git a/action_buttons_e2e_test.go b/action_buttons_e2e_test.go index 4f9379d..3424f3e 100644 --- a/action_buttons_e2e_test.go +++ b/action_buttons_e2e_test.go @@ -141,8 +141,11 @@ func TestActionButtons(t *testing.T) { } t.Log("clear-done action passed: deleted 2 completed tasks") - // Verify in database - db, err := sql.Open("sqlite", dbPath) + // Verify in database. Use a busy_timeout so the read waits for the server's + // concurrent action writes to commit instead of failing immediately with + // SQLITE_BUSY (matches the busy_timeout the server applies to its own + // connection in internal/source). + db, err := sql.Open("sqlite", dbPath+"?_pragma=busy_timeout(5000)") if err != nil { t.Fatalf("Failed to open database for verification: %v", err) } diff --git a/auto_tasks_e2e_test.go b/auto_tasks_e2e_test.go index ee7c04c..5f00971 100644 --- a/auto_tasks_e2e_test.go +++ b/auto_tasks_e2e_test.go @@ -36,6 +36,22 @@ func (l *autoTasksConsoleLogs) get() []string { return append([]string{}, l.logs...) } +// toggleFirstCheckbox clicks the first checkbox in the given lvt-source section +// and waits until its checked state matches wantChecked. +// +// It uses a JS .click() rather than chromedp.Click: CDP's synthetic mouse click +// does not reliably trigger livetemplate's delegated event handlers in headless +// Docker Chrome (the same reason action_buttons_e2e_test.go uses .click()). It +// then polls for the resulting checked state instead of sleeping a fixed +// duration, so a slow WebSocket round-trip + file write no longer flakes. +func toggleFirstCheckbox(source string, wantChecked bool, timeout time.Duration) chromedp.Action { + sel := fmt.Sprintf(`document.querySelectorAll('[lvt-source="%s"] input[type="checkbox"]')`, source) + return chromedp.Tasks{ + chromedp.Evaluate(sel+`[0].click()`, nil), + waitForDOM(fmt.Sprintf(`%s[0].checked === %t`, sel, wantChecked), timeout), + } +} + // createAutoTasksExample creates a temp directory with a zero-config markdown file // containing task list sections (no frontmatter, no separate data file). func createAutoTasksExample(t *testing.T) (string, func()) { @@ -197,32 +213,15 @@ func TestAutoTasks_BasicToggle(t *testing.T) { } t.Log("'Make coffee' starts unchecked") - // Click the first checkbox to toggle it + // Click the first checkbox to toggle it and wait for the checked state to + // appear (WebSocket round-trip + file write). A failure here dumps console + // logs for diagnosis. err = chromedp.Run(ctx, - chromedp.Click(`[lvt-source="_auto_morning-tasks"] input[type="checkbox"]`, chromedp.ByQuery), - chromedp.Sleep(3*time.Second), // Wait for WebSocket response + file write - ) - if err != nil { - t.Fatalf("Failed to click checkbox: %v", err) - } - t.Log("Clicked first checkbox") - - // Verify the checkbox is now checked in the UI - var afterChecked bool - err = chromedp.Run(ctx, - chromedp.Evaluate(` - (() => { - const checkboxes = document.querySelectorAll('[lvt-source="_auto_morning-tasks"] input[type="checkbox"]'); - return checkboxes.length > 0 ? checkboxes[0].checked : false; - })() - `, &afterChecked), + toggleFirstCheckbox("_auto_morning-tasks", true, 15*time.Second), ) if err != nil { - t.Fatalf("Failed to get state after toggle: %v", err) - } - if !afterChecked { t.Logf("Console logs: %v", testCtx.ConsoleLogs.get()) - t.Fatal("Checkbox should be checked after toggle") + t.Fatalf("Checkbox should be checked after toggle: %v", err) } t.Log("Checkbox is now checked in UI") @@ -270,29 +269,17 @@ func TestAutoTasks_AddTask(t *testing.T) { } t.Log("Page loaded with auto-tasks") - // Type new task text and submit + // Type new task text and submit. Use a JS .click() on the submit button + // (CDP click is unreliable for delegated handlers in headless Docker Chrome) + // and poll for the new row instead of a fixed sleep. err = chromedp.Run(ctx, chromedp.SendKeys(`[lvt-source="_auto_morning-tasks"] input[name="text"]`, "Walk the dog", chromedp.ByQuery), - chromedp.Click(`[lvt-source="_auto_morning-tasks"] button[type="submit"]`, chromedp.ByQuery), - chromedp.Sleep(3*time.Second), // Wait for WebSocket + file write - ) - if err != nil { - t.Fatalf("Failed to add task: %v", err) - } - t.Log("Submitted new task 'Walk the dog'") - - // Verify new task appears in UI - var newTaskCount int - err = chromedp.Run(ctx, - chromedp.Evaluate(`document.querySelectorAll('[lvt-source="_auto_morning-tasks"] input[type="checkbox"]').length`, &newTaskCount), + chromedp.Evaluate(`document.querySelector('[lvt-source="_auto_morning-tasks"] button[type="submit"]').click()`, nil), + waitForDOM(`document.querySelectorAll('[lvt-source="_auto_morning-tasks"] input[type="checkbox"]').length === 4`, 15*time.Second), ) if err != nil { - t.Fatalf("Failed to count tasks after add: %v", err) - } - - if newTaskCount != 4 { t.Logf("Console logs: %v", testCtx.ConsoleLogs.get()) - t.Fatalf("Expected 4 tasks after adding, got %d", newTaskCount) + t.Fatalf("Failed to add task: %v", err) } t.Log("New task appears in UI (4 total)") @@ -393,12 +380,12 @@ func TestAutoTasks_PersistAcrossReload(t *testing.T) { t.Fatalf("Failed to navigate: %v", err) } - // Toggle first checkbox + // Toggle first checkbox and wait for the checked state before reloading err = chromedp.Run(ctx, - chromedp.Click(`[lvt-source="_auto_morning-tasks"] input[type="checkbox"]`, chromedp.ByQuery), - chromedp.Sleep(3*time.Second), + toggleFirstCheckbox("_auto_morning-tasks", true, 15*time.Second), ) if err != nil { + t.Logf("Console logs: %v", testCtx.ConsoleLogs.get()) t.Fatalf("Failed to toggle: %v", err) } t.Log("Toggled first checkbox") @@ -473,12 +460,12 @@ func TestAutoTasks_NoFullReload(t *testing.T) { } t.Log("Reload marker set") - // Toggle checkbox + // Toggle checkbox and wait for the checked state (watcher + refresh cycle) err = chromedp.Run(ctx, - chromedp.Click(`[lvt-source="_auto_morning-tasks"] input[type="checkbox"]`, chromedp.ByQuery), - chromedp.Sleep(5*time.Second), // Wait for watcher + refresh cycle + toggleFirstCheckbox("_auto_morning-tasks", true, 15*time.Second), ) if err != nil { + t.Logf("Console logs: %v", testCtx.ConsoleLogs.get()) t.Fatalf("Failed to toggle: %v", err) } t.Log("Toggled checkbox with file watcher active") diff --git a/client/package-lock.json b/client/package-lock.json index 589ac49..323d4ad 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "license": "MIT", "dependencies": { - "@livetemplate/client": "^0.11.9", + "@livetemplate/client": "^0.14.3", "monaco-editor": "^0.45.0" }, "devDependencies": { @@ -1282,9 +1282,9 @@ } }, "node_modules/@livetemplate/client": { - "version": "0.11.9", - "resolved": "https://registry.npmjs.org/@livetemplate/client/-/client-0.11.9.tgz", - "integrity": "sha512-18iRVec9XObV6xqW3TBEn3hAXrNjQimhrlNho3fgboKPTgFayQokcezgm7S3I44eWWQ5iGtVUwFY62uYnO7GXA==", + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/@livetemplate/client/-/client-0.14.3.tgz", + "integrity": "sha512-66n1baH3pZedAYW7BjcXQx3MxzGKSmmuBW/7Won9Ku+MyYaKTF67eeTaqJr09b3bA0nj01faPEW5zKi0XU7f2w==", "license": "MIT", "dependencies": { "@types/morphdom": "^2.3.0", diff --git a/client/package.json b/client/package.json index e07e52f..f3374bf 100644 --- a/client/package.json +++ b/client/package.json @@ -15,7 +15,7 @@ "analyze": "node -e \"const fs=require('fs');const m=JSON.parse(fs.readFileSync('dist/meta.json'));Object.entries(m.outputs).forEach(([k,v])=>console.log(k,Math.round(v.bytes/1024)+'KB'));\"" }, "dependencies": { - "@livetemplate/client": "^0.11.9", + "@livetemplate/client": "^0.14.3", "monaco-editor": "^0.45.0" }, "devDependencies": { diff --git a/internal/assets/client/tinkerdown-client.browser.js b/internal/assets/client/tinkerdown-client.browser.js index 56e4114..f6adad2 100644 --- a/internal/assets/client/tinkerdown-client.browser.js +++ b/internal/assets/client/tinkerdown-client.browser.js @@ -1,4 +1,4 @@ -"use strict";var TinkerdownClient=(()=>{var _r=Object.create;var Ne=Object.defineProperty;var Ir=Object.getOwnPropertyDescriptor;var Rr=Object.getOwnPropertyNames;var Dr=Object.getPrototypeOf,Hr=Object.prototype.hasOwnProperty;var L=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),Or=(i,e)=>{for(var t in e)Ne(i,t,{get:e[t],enumerable:!0})},rn=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Rr(e))!Hr.call(i,r)&&r!==t&&Ne(i,r,{get:()=>e[r],enumerable:!(n=Ir(e,r))||n.enumerable});return i};var xt=(i,e,t)=>(t=i!=null?_r(Dr(i)):{},rn(e||!i||!i.__esModule?Ne(t,"default",{value:i,enumerable:!0}):t,i)),Pr=i=>rn(Ne({},"__esModule",{value:!0}),i);var At=L((Bo,dn)=>{"use strict";var on=11;function Nr(i,e){var t=e.attributes,n,r,o,s,a;if(!(e.nodeType===on||i.nodeType===on)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,o=n.namespaceURI,s=n.value,o?(r=n.localName||r,a=i.getAttributeNS(o,r),a!==s&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(o,r,s))):(a=i.getAttribute(r),a!==s&&i.setAttribute(r,s));for(var l=i.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,o=n.namespaceURI,o?(r=n.localName||r,e.hasAttributeNS(o,r)||i.removeAttributeNS(o,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var Fe,Fr="http://www.w3.org/1999/xhtml",U=typeof document>"u"?void 0:document,$r=!!U&&"content"in U.createElement("template"),Br=!!U&&U.createRange&&"createContextualFragment"in U.createRange();function Ur(i){var e=U.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function qr(i){Fe||(Fe=U.createRange(),Fe.selectNode(U.body));var e=Fe.createContextualFragment(i);return e.childNodes[0]}function Wr(i){var e=U.createElement("body");return e.innerHTML=i,e.childNodes[0]}function zr(i){return i=i.trim(),$r?Ur(i):Br?qr(i):Wr(i)}function $e(i,e){var t=i.nodeName,n=e.nodeName,r,o;return t===n?!0:(r=t.charCodeAt(0),o=n.charCodeAt(0),r<=90&&o>=97?t===n.toUpperCase():o<=90&&r>=97?n===t.toUpperCase():!1)}function jr(i,e){return!e||e===Fr?U.createElement(i):U.createElementNS(e,i)}function Kr(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function St(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var sn={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}St(i,e,"selected")},INPUT:function(i,e){St(i,e,"checked"),St(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,o,s;r;)if(s=r.nodeName&&r.nodeName.toUpperCase(),s==="OPTGROUP")o=r,r=o.firstChild,r||(r=o.nextSibling,o=null);else{if(s==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&o&&(r=o.nextSibling,o=null)}i.selectedIndex=t}}},Le=1,an=11,ln=3,cn=8;function te(){}function Vr(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function Gr(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var o=n;n=U.createElement("html"),n.innerHTML=o}else n=zr(n);else n.nodeType===an&&(n=n.firstElementChild);var s=r.getNodeKey||Vr,a=r.onBeforeNodeAdded||te,c=r.onNodeAdded||te,l=r.onBeforeElUpdated||te,d=r.onElUpdated||te,h=r.onBeforeNodeDiscarded||te,u=r.onNodeDiscarded||te,g=r.onBeforeElChildrenUpdated||te,v=r.skipFromChildren||te,T=r.addChild||function(f,m){return f.appendChild(m)},S=r.childrenOnly===!0,I=Object.create(null),p=[];function x(f){p.push(f)}function N(f,m){if(f.nodeType===Le)for(var _=f.firstChild;_;){var A=void 0;m&&(A=s(_))?x(A):(u(_),_.firstChild&&N(_,m)),_=_.nextSibling}}function b(f,m,_){h(f)!==!1&&(m&&m.removeChild(f),u(f),N(f,_))}function R(f){if(f.nodeType===Le||f.nodeType===an)for(var m=f.firstChild;m;){var _=s(m);_&&(I[_]=m),R(m),m=m.nextSibling}}R(t);function y(f){c(f);for(var m=f.firstChild;m;){var _=m.nextSibling,A=s(m);if(A){var C=I[A];C&&$e(m,C)?(m.parentNode.replaceChild(C,m),E(C,m)):y(m)}else y(m);m=_}}function k(f,m,_){for(;m;){var A=m.nextSibling;(_=s(m))?x(_):b(m,f,!0),m=A}}function E(f,m,_){var A=s(m);if(A&&delete I[A],!_){var C=l(f,m);if(C===!1||(C instanceof HTMLElement&&(f=C,R(f)),i(f,m),d(f),g(f,m)===!1))return}f.nodeName!=="TEXTAREA"?M(f,m):sn.TEXTAREA(f,m)}function M(f,m){var _=v(f,m),A=m.firstChild,C=f.firstChild,X,W,J,le,G;e:for(;A;){for(le=A.nextSibling,X=s(A);!_&&C;){if(J=C.nextSibling,A.isSameNode&&A.isSameNode(C)){A=le,C=J;continue e}W=s(C);var Z=C.nodeType,ee=void 0;if(Z===A.nodeType&&(Z===Le?(X?X!==W&&((G=I[X])?J===G?ee=!1:(f.insertBefore(G,C),W?x(W):b(C,f,!0),C=G,W=s(C)):ee=!1):W&&(ee=!1),ee=ee!==!1&&$e(C,A),ee&&E(C,A)):(Z===ln||Z==cn)&&(ee=!0,C.nodeValue!==A.nodeValue&&(C.nodeValue=A.nodeValue))),ee){A=le,C=J;continue e}W?x(W):b(C,f,!0),C=J}if(X&&(G=I[X])&&$e(G,A))_||T(f,G),E(G,A);else{var Et=a(A);Et!==!1&&(Et&&(A=Et),A.actualize&&(A=A.actualize(f.ownerDocument||U)),T(f,A),y(A))}A=le,C=J}k(f,C,W);var nn=sn[f.nodeName];nn&&nn(f,m)}var w=t,F=w.nodeType,B=n.nodeType;if(!S){if(F===Le)B===Le?$e(t,n)||(u(t),w=Kr(t,jr(n.nodeName,n.namespaceURI))):w=n;else if(F===ln||F===cn){if(B===F)return w.nodeValue!==n.nodeValue&&(w.nodeValue=n.nodeValue),w;w=n}}if(w===n)u(t);else{if(n.isSameNode&&n.isSameNode(w))return;if(E(w,n,S),p)for(var $=0,V=p.length;${"use strict";Object.defineProperty(ce,"__esModule",{value:!0});ce.FOCUSABLE_INPUTS=ce.DEFAULT_CHANGE_DEBOUNCE_MS=void 0;ce.DEFAULT_CHANGE_DEBOUNCE_MS=300;ce.FOCUSABLE_INPUTS=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"]});var hn=L(Be=>{"use strict";Object.defineProperty(Be,"__esModule",{value:!0});Be.FocusManager=void 0;var un=Tt(),Ct=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=`${un.FOCUSABLE_INPUTS.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=s=>{let a=s.target;!a||!this.wrapperElement?.contains(a)||(this.isTextualInput(a)||a instanceof HTMLSelectElement)&&(this.lastFocusedElement=a,this.logger.debug("[Focus] Tracked focus on:",a.tagName,a.id||a.getAttribute("name")),this.isTextualInput(a)&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd))},o=s=>{let a=s.target;!a||!this.wrapperElement?.contains(a)||this.isTextualInput(a)&&a===this.lastFocusedElement&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=o,document.addEventListener("focus",r,!0),document.addEventListener("blur",o,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",this.lastFocusedElement?.tagName,this.lastFocusedElement?.id||this.lastFocusedElement?.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 s=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[s]||null,this.logger.debug("[Focus] Found by index:",s,t?.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,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,o=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&o!==null&&(t.setSelectionRange(r,o),this.logger.debug("[Focus] Restored cursor:",r,"-",o))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?un.FOCUSABLE_INPUTS.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}};Be.FocusManager=Ct});var de=L(q=>{"use strict";Object.defineProperty(q,"__esModule",{value:!0});q.SYNTHETIC_TRIGGERS=void 0;q.parseReactiveAttribute=fn;q.resolveTarget=_t;q.executeAction=It;q.matchesEvent=gn;q.processReactiveAttributes=mn;q.processElementInteraction=Xr;q.isDOMEventTrigger=Jr;q.setupReactiveAttributeListeners=Qr;var pn=["pending","success","error","done"],Lt=new Set(pn);q.SYNTHETIC_TRIGGERS=new Set(["click-away"]);var Mt={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function fn(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],o=Mt[r];if(!o)return null;let s=n[2];if(q.SYNTHETIC_TRIGGERS.has(s)||!Lt.has(s)&&!s.includes(":"))return null;let a=s.split(":"),c=a[a.length-1];if(!Lt.has(c))return null;let l=c,d=a.length>1?a.slice(0,-1).join(":"):void 0;return{action:o,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function _t(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function It(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),o=t.substring(n+1);i.setAttribute(r,o)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function gn(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function mn(i,e){let t=Object.keys(Mt),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let a of t)n.push(`[lvt-el\\:${a}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${a}\\:on\\:${r}\\:${i}]`);let o=n.join(", "),s;try{s=document.querySelectorAll(o)}catch{let a=t.map(c=>`[lvt-el\\:${c}\\:on\\:${i}]`);try{s=document.querySelectorAll(a.join(", "))}catch{return}}s.forEach(a=>{Array.from(a.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=fn(c.name,c.value);l&&gn(l,i,e)&&It(_t(a),l.action,l.param)})})}function Xr(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),o=Mt[r];o&&It(_t(i),o,t.value)}}function Jr(i){return!Lt.has(i)&&!q.SYNTHETIC_TRIGGERS.has(i)}function Qr(){pn.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{let n=e.detail?.action;mn(i,n)},!0)})}});var Tn=L(H=>{"use strict";Object.defineProperty(H,"__esModule",{value:!0});H.__resetAnimatedElementsForTesting=Zr;H.setupFxDOMEventTriggers=ei;H.teardownFxDOMEventTriggers=ti;H.processFxLifecycleAttributes=An;H.setupFxLifecycleListeners=ni;H.teardownFxLifecycleListeners=ri;H.handleScrollDirectives=oi;H.teardownAutoClickTimers=si;H.handleAutoClickDirectives=ai;H.handleHighlightDirectives=li;H.handleAnimateDirectives=ci;H.handleToastDirectives=ui;H.setupToastClickOutside=hi;H.handleShadowRootHydration=mi;H.handleAreaSelectDirectives=bi;H.teardownAreaSelectForRoot=vi;H.handleURLHashDirective=yi;H.teardownURLHashForRoot=wi;H.__resetURLHashUnencodedWarnedForTesting=ki;var bn=de(),xn=new Set(["pending","success","error","done"]),Rt=new WeakSet,Me=new WeakMap,Y=new Map;function Zr(){Rt=new WeakSet,Me=new WeakMap;for(let{timer:i}of Y.values())clearTimeout(i);Y=new Map}function Sn(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function ei(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(s=>s.el.isConnected),o=s=>{for(let a of s.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let c=Sn(a.name);if(!c.trigger||xn.has(c.trigger)||bn.SYNTHETIC_TRIGGERS.has(c.trigger))continue;let l=`__lvt_fx_${a.name}`;if(s[l])continue;let d=a.name.match(/^lvt-fx:(\w+)/i)?.[1];if(!d)continue;let h=a.name,u=()=>{if(!s.hasAttribute(h))return;let g=s.getAttribute(h)||"",v=(0,bn.resolveTarget)(s);Ie(v,d,g)};s.addEventListener(c.trigger,u),s[l]=u,r.push({el:s,event:c.trigger,handler:u,guardKey:l})}};o(i),i.querySelectorAll("*").forEach(o),t[n]=r}function ti(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:o,guardKey:s})=>{n.removeEventListener(r,o),delete n[s]}),delete i[e])}function An(i,e,t){let n=r=>{for(let o of r.attributes){if(!o.name.startsWith("lvt-fx:"))continue;let s=Sn(o.name);if(!s.trigger||!xn.has(s.trigger)||s.trigger!==e||s.actionName&&s.actionName!==t)continue;let a=o.name.match(/^lvt-fx:(\w+)/i)?.[1];a&&Ie(r,a,o.value)}};n(i),i.querySelectorAll("*").forEach(n)}function Ie(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),o=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",s=i.style.backgroundColor,a=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=o,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=s,i.style.transition=a,i.style.length===0&&i.removeAttribute("style"),i.__lvtHighlighting=!1;return}i.style.backgroundColor=s,setTimeout(()=>{i.isConnected&&(i.style.transition=a,i.style.length===0&&i.removeAttribute("style")),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Rt.has(i))break;Rt.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),o=t||"fade",s="";switch(o){case"fade":s=`lvt-fade-in ${r}ms ease-out`;break;case"slide":s=`lvt-slide-in ${r}ms ease-out`;break;case"scale":s=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${o}`)}if(!s)break;i.style.animation=s,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),o=ii.has(r)?r:"auto",s=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),a=t||"bottom";switch(a){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:o});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=s&&i.scrollTo({top:i.scrollHeight,behavior:o}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:o});break;case"into-view":{i.dataset.lvtIvDone!=="1"&&(i.scrollIntoView({block:"center",inline:"nearest",behavior:o}),i.dataset.lvtIvDone="1");break}case"preserve":break;default:{if(a.startsWith("reset-on:")){let c=a.slice(9);if(!c){console.warn('lvt-fx:scroll="reset-on:" requires an attribute name');break}let l=i.getAttribute(c);Me.has(i)?Me.get(i)!==l&&(Me.set(i,l),i.scrollLeft=0,i.scrollTop=0):Me.set(i,l);break}console.warn(`Unknown lvt-fx:scroll mode: ${a}`)}}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function ni(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let o=s=>{let c=s.detail?.action;An(i,r,c)};document.addEventListener(`lvt:${r}`,o,!0),t.push({event:`lvt:${r}`,handler:o})}),i.__lvtFxLifecycleListeners=t}function ri(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var ii=new Set(["auto","smooth","instant"]);function oi(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&Ie(e,"scroll",t)})}function si(){for(let{timer:i}of Y.values())clearTimeout(i);Y.clear()}function ai(i){if(!(Y.size===0&&i.querySelector("[lvt-fx\\:auto-click]")===null)){for(let[e,t]of Array.from(Y))(!e.isConnected||!e.hasAttribute("lvt-fx:auto-click"))&&(clearTimeout(t.timer),Y.delete(e));i.querySelectorAll("[lvt-fx\\:auto-click]").forEach(e=>{let t=e.getAttribute("lvt-fx:auto-click");if(!t)return;let n=Y.get(e);if(n&&n.spec===t)return;n&&clearTimeout(n.timer);let r=t.indexOf(":"),o=r>0?t.slice(0,r):"",s=/^\d+$/.test(o)?parseInt(o,10):NaN,a=r>0?t.slice(r+1):"";if(!Number.isFinite(s)||s<0||!a||!/^[\w-]+$/.test(a)){console.warn(`lvt-fx:auto-click expects ":", got: ${t}`),Y.delete(e);return}let c=setTimeout(()=>{if(!e.isConnected)return;let l=e.querySelector(`button[name="${a}"]`);l&&l.click()},s);Y.set(e,{timer:c,spec:t})})}}function li(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&Ie(e,"highlight",t)})}function ci(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&Ie(e,"animate",t)}),di()}function di(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=` +"use strict";var TinkerdownClient=(()=>{var $r=Object.create;var Ue=Object.defineProperty;var Br=Object.getOwnPropertyDescriptor;var Ur=Object.getOwnPropertyNames;var qr=Object.getPrototypeOf,Wr=Object.prototype.hasOwnProperty;var _=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),zr=(i,e)=>{for(var t in e)Ue(i,t,{get:e[t],enumerable:!0})},dn=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ur(e))!Wr.call(i,r)&&r!==t&&Ue(i,r,{get:()=>e[r],enumerable:!(n=Br(e,r))||n.enumerable});return i};var Lt=(i,e,t)=>(t=i!=null?$r(qr(i)):{},dn(e||!i||!i.__esModule?Ue(t,"default",{value:i,enumerable:!0}):t,i)),jr=i=>dn(Ue({},"__esModule",{value:!0}),i);var _t=_((ls,mn)=>{"use strict";var un=11;function Kr(i,e){var t=e.attributes,n,r,o,s,a;if(!(e.nodeType===un||i.nodeType===un)){for(var c=t.length-1;c>=0;c--)n=t[c],r=n.name,o=n.namespaceURI,s=n.value,o?(r=n.localName||r,a=i.getAttributeNS(o,r),a!==s&&(n.prefix==="xmlns"&&(r=n.name),i.setAttributeNS(o,r,s))):(a=i.getAttribute(r),a!==s&&i.setAttribute(r,s));for(var l=i.attributes,d=l.length-1;d>=0;d--)n=l[d],r=n.name,o=n.namespaceURI,o?(r=n.localName||r,e.hasAttributeNS(o,r)||i.removeAttributeNS(o,r)):e.hasAttribute(r)||i.removeAttribute(r)}}var qe,Vr="http://www.w3.org/1999/xhtml",B=typeof document>"u"?void 0:document,Gr=!!B&&"content"in B.createElement("template"),Yr=!!B&&B.createRange&&"createContextualFragment"in B.createRange();function Xr(i){var e=B.createElement("template");return e.innerHTML=i,e.content.childNodes[0]}function Jr(i){qe||(qe=B.createRange(),qe.selectNode(B.body));var e=qe.createContextualFragment(i);return e.childNodes[0]}function Qr(i){var e=B.createElement("body");return e.innerHTML=i,e.childNodes[0]}function Zr(i){return i=i.trim(),Gr?Xr(i):Yr?Jr(i):Qr(i)}function We(i,e){var t=i.nodeName,n=e.nodeName,r,o;return t===n?!0:(r=t.charCodeAt(0),o=n.charCodeAt(0),r<=90&&o>=97?t===n.toUpperCase():o<=90&&r>=97?n===t.toUpperCase():!1)}function ei(i,e){return!e||e===Vr?B.createElement(i):B.createElementNS(e,i)}function ti(i,e){for(var t=i.firstChild;t;){var n=t.nextSibling;e.appendChild(t),t=n}return e}function Mt(i,e,t){i[t]!==e[t]&&(i[t]=e[t],i[t]?i.setAttribute(t,""):i.removeAttribute(t))}var hn={OPTION:function(i,e){var t=i.parentNode;if(t){var n=t.nodeName.toUpperCase();n==="OPTGROUP"&&(t=t.parentNode,n=t&&t.nodeName.toUpperCase()),n==="SELECT"&&!t.hasAttribute("multiple")&&(i.hasAttribute("selected")&&!e.selected&&(i.setAttribute("selected","selected"),i.removeAttribute("selected")),t.selectedIndex=-1)}Mt(i,e,"selected")},INPUT:function(i,e){Mt(i,e,"checked"),Mt(i,e,"disabled"),i.value!==e.value&&(i.value=e.value),e.hasAttribute("value")||i.removeAttribute("value")},TEXTAREA:function(i,e){var t=e.value;i.value!==t&&(i.value=t);var n=i.firstChild;if(n){var r=n.nodeValue;if(r==t||!t&&r==i.placeholder)return;n.nodeValue=t}},SELECT:function(i,e){if(!e.hasAttribute("multiple")){for(var t=-1,n=0,r=i.firstChild,o,s;r;)if(s=r.nodeName&&r.nodeName.toUpperCase(),s==="OPTGROUP")o=r,r=o.firstChild,r||(r=o.nextSibling,o=null);else{if(s==="OPTION"){if(r.hasAttribute("selected")){t=n;break}n++}r=r.nextSibling,!r&&o&&(r=o.nextSibling,o=null)}i.selectedIndex=t}}},_e=1,pn=11,fn=3,gn=8;function ee(){}function ni(i){if(i)return i.getAttribute&&i.getAttribute("id")||i.id}function ri(i){return function(t,n,r){if(r||(r={}),typeof n=="string")if(t.nodeName==="#document"||t.nodeName==="HTML"||t.nodeName==="BODY"){var o=n;n=B.createElement("html"),n.innerHTML=o}else n=Zr(n);else n.nodeType===pn&&(n=n.firstElementChild);var s=r.getNodeKey||ni,a=r.onBeforeNodeAdded||ee,c=r.onNodeAdded||ee,l=r.onBeforeElUpdated||ee,d=r.onElUpdated||ee,h=r.onBeforeNodeDiscarded||ee,u=r.onNodeDiscarded||ee,p=r.onBeforeElChildrenUpdated||ee,v=r.skipFromChildren||ee,E=r.addChild||function(m,b){return m.appendChild(b)},T=r.childrenOnly===!0,R=Object.create(null),g=[];function S(m){g.push(m)}function O(m,b){if(m.nodeType===_e)for(var M=m.firstChild;M;){var x=void 0;b&&(x=s(M))?S(x):(u(M),M.firstChild&&O(M,b)),M=M.nextSibling}}function H(m,b,M){h(m)!==!1&&(b&&b.removeChild(m),u(m),O(m,M))}function J(m){if(m.nodeType===_e||m.nodeType===pn)for(var b=m.firstChild;b;){var M=s(b);M&&(R[M]=b),J(b),b=b.nextSibling}}J(t);function f(m){c(m);for(var b=m.firstChild;b;){var M=b.nextSibling,x=s(b);if(x){var C=R[x];C&&We(b,C)?(b.parentNode.replaceChild(C,b),k(C,b)):f(b)}else f(b);b=M}}function A(m,b,M){for(;b;){var x=b.nextSibling;(M=s(b))?S(M):H(b,m,!0),b=x}}function k(m,b,M){var x=s(b);if(x&&delete R[x],!M){var C=l(m,b);if(C===!1||(C instanceof HTMLElement&&(m=C,J(m)),i(m,b),d(m),p(m,b)===!1))return}m.nodeName!=="TEXTAREA"?y(m,b):hn.TEXTAREA(m,b)}function y(m,b){var M=v(m,b),x=b.firstChild,C=m.firstChild,G,W,Q,oe,V;e:for(;x;){for(oe=x.nextSibling,G=s(x);!M&&C;){if(Q=C.nextSibling,x.isSameNode&&x.isSameNode(C)){x=oe,C=Q;continue e}W=s(C);var ce=C.nodeType,Y=void 0;if(ce===x.nodeType&&(ce===_e?(G?G!==W&&((V=R[G])?Q===V?Y=!1:(m.insertBefore(V,C),W?S(W):H(C,m,!0),C=V,W=s(C)):Y=!1):W&&(Y=!1),Y=Y!==!1&&We(C,x),Y&&k(C,x)):(ce===fn||ce==gn)&&(Y=!0,C.nodeValue!==x.nodeValue&&(C.nodeValue=x.nodeValue))),Y){x=oe,C=Q;continue e}W?S(W):H(C,m,!0),C=Q}if(G&&(V=R[G])&&We(V,x))M||E(m,V),k(V,x);else{var se=a(x);se!==!1&&(se&&(x=se),x.actualize&&(x=x.actualize(m.ownerDocument||B)),E(m,x),f(x))}x=oe,C=Q}A(m,C,W);var cn=hn[m.nodeName];cn&&cn(m,b)}var w=t,F=w.nodeType,$=n.nodeType;if(!T){if(F===_e)$===_e?We(t,n)||(u(t),w=ti(t,ei(n.nodeName,n.namespaceURI))):w=n;else if(F===fn||F===gn){if($===F)return w.nodeValue!==n.nodeValue&&(w.nodeValue=n.nodeValue),w;w=n}}if(w===n)u(t);else{if(n.isSameNode&&n.isSameNode(w))return;if(k(w,n,T),g)for(var N=0,q=g.length;N{"use strict";Object.defineProperty(de,"__esModule",{value:!0});de.FOCUSABLE_INPUTS=de.DEFAULT_CHANGE_DEBOUNCE_MS=void 0;de.DEFAULT_CHANGE_DEBOUNCE_MS=300;de.FOCUSABLE_INPUTS=["text","textarea","number","email","password","search","tel","url","date","time","datetime-local","color","range"]});var bn=_(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});ze.FocusManager=void 0;var vn=Rt(),It=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=`${vn.FOCUSABLE_INPUTS.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=s=>{let a=s.target;!a||!this.wrapperElement?.contains(a)||(this.isTextualInput(a)||a instanceof HTMLSelectElement)&&(this.lastFocusedElement=a,this.logger.debug("[Focus] Tracked focus on:",a.tagName,a.id||a.getAttribute("name")),this.isTextualInput(a)&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd))},o=s=>{let a=s.target;!a||!this.wrapperElement?.contains(a)||this.isTextualInput(a)&&a===this.lastFocusedElement&&(this.lastFocusedSelectionStart=a.selectionStart,this.lastFocusedSelectionEnd=a.selectionEnd,this.logger.debug("[Focus] Saved cursor on blur:",this.lastFocusedSelectionStart,"-",this.lastFocusedSelectionEnd))};document[t]&&document.removeEventListener("focus",document[t],!0),document[n]&&document.removeEventListener("blur",document[n],!0),document[t]=r,document[n]=o,document.addEventListener("focus",r,!0),document.addEventListener("blur",o,!0),this.logger.debug("[Focus] Focus tracking set up")}restoreFocusedElement(){if(this.logger.debug("[Focus] restoreFocusedElement - lastFocusedElement:",this.lastFocusedElement?.tagName,this.lastFocusedElement?.id||this.lastFocusedElement?.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 s=parseInt(e.replace("data-focus-index-",""),10);t=this.focusableElements[s]||null,this.logger.debug("[Focus] Found by index:",s,t?.tagName)}else t=this.wrapperElement.querySelector(e),this.logger.debug("[Focus] Found by selector:",e,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,o=this.lastFocusedSelectionEnd;t.focus(),this.logger.debug("[Focus] Restored focus"),this.isTextualInput(t)&&r!==null&&o!==null&&(t.setSelectionRange(r,o),this.logger.debug("[Focus] Restored cursor:",r,"-",o))}isTextualInput(e){return e instanceof HTMLTextAreaElement?!0:e instanceof HTMLInputElement?vn.FOCUSABLE_INPUTS.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}};ze.FocusManager=It});var ue=_(U=>{"use strict";Object.defineProperty(U,"__esModule",{value:!0});U.SYNTHETIC_TRIGGERS=void 0;U.parseReactiveAttribute=wn;U.resolveTarget=Ot;U.executeAction=Pt;U.matchesEvent=kn;U.processReactiveAttributes=En;U.processElementInteraction=oi;U.isDOMEventTrigger=si;U.setupReactiveAttributeListeners=ai;var yn=["pending","success","error","done"],Dt=new Set(yn);U.SYNTHETIC_TRIGGERS=new Set(["click-away"]);var Ht={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"};function wn(i,e){let n=i.toLowerCase().match(/^lvt-el:(\w+):on:(.+)$/);if(n){let r=n[1],o=Ht[r];if(!o)return null;let s=n[2];if(U.SYNTHETIC_TRIGGERS.has(s)||!Dt.has(s)&&!s.includes(":"))return null;let a=s.split(":"),c=a[a.length-1];if(!Dt.has(c))return null;let l=c,d=a.length>1?a.slice(0,-1).join(":"):void 0;return{action:o,lifecycle:l,actionName:d||void 0,param:e||void 0}}return null}function Ot(i){let e=i.getAttribute("data-lvt-target");return e?e.startsWith("#")?document.getElementById(e.slice(1))||i:e.startsWith("closest:")&&i.closest(e.slice(8))||i:i}function Pt(i,e,t){switch(e){case"reset":i instanceof HTMLFormElement&&i.reset();break;case"addClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.add(...n)}break;case"removeClass":if(t){let n=t.split(/\s+/).filter(Boolean);i.classList.remove(...n)}break;case"toggleClass":t&&t.split(/\s+/).filter(Boolean).forEach(r=>i.classList.toggle(r));break;case"setAttr":if(t){let n=t.indexOf(":");if(n>0){let r=t.substring(0,n),o=t.substring(n+1);i.setAttribute(r,o)}}break;case"toggleAttr":t&&i.toggleAttribute(t);break}}function kn(i,e,t){return i.lifecycle!==e?!1:i.actionName?i.actionName===t:!0}function En(i,e){let t=Object.keys(Ht),n=[],r=e?e.replace(/([^\w-])/g,"\\$1"):void 0;for(let a of t)n.push(`[lvt-el\\:${a}\\:on\\:${i}]`),r&&n.push(`[lvt-el\\:${a}\\:on\\:${r}\\:${i}]`);let o=n.join(", "),s;try{s=document.querySelectorAll(o)}catch{let a=t.map(c=>`[lvt-el\\:${c}\\:on\\:${i}]`);try{s=document.querySelectorAll(a.join(", "))}catch{return}}s.forEach(a=>{Array.from(a.attributes).forEach(c=>{if(!c.name.startsWith("lvt-el:")||!c.name.includes(":on:"))return;let l=wn(c.name,c.value);l&&kn(l,i,e)&&Pt(Ot(a),l.action,l.param)})})}function oi(i,e){for(let t of i.attributes){let n=t.name.match(/^lvt-el:(\w+):on:([a-z-]+)$/i);if(!n||n[2].toLowerCase()!==e)continue;let r=n[1].toLowerCase(),o=Ht[r];o&&Pt(Ot(i),o,t.value)}}function si(i){return!Dt.has(i)&&!U.SYNTHETIC_TRIGGERS.has(i)}function ai(){yn.forEach(i=>{document.addEventListener(`lvt:${i}`,e=>{let n=e.detail?.action;En(i,n)},!0)})}});var On=_(L=>{"use strict";Object.defineProperty(L,"__esModule",{value:!0});L.__resetAnimatedElementsForTesting=li;L.setupFxDOMEventTriggers=ci;L.teardownFxDOMEventTriggers=di;L.processFxLifecycleAttributes=_n;L.setupFxLifecycleListeners=ui;L.teardownFxLifecycleListeners=hi;L.handleScrollDirectives=fi;L.teardownAutoClickTimers=gi;L.handleAutoClickDirectives=mi;L.handleHighlightDirectives=vi;L.handleAnimateDirectives=bi;L.handleToastDirectives=wi;L.setupToastClickOutside=ki;L.handleShadowRootHydration=Ai;L.handleAreaSelectDirectives=Ci;L.teardownAreaSelectForRoot=Li;L.handleIframeAutoHeightDirectives=Mi;L.teardownIframeAutoHeightForRoot=_i;L.handleURLHashDirective=Ii;L.teardownURLHashForRoot=Di;L.__resetURLHashUnencodedWarnedForTesting=Hi;L.handleRegionSelectDirectives=$i;L.teardownRegionSelectForRoot=Bi;L.handleProxyBridgeDirectives=Ui;L.teardownProxyBridgeForRoot=qi;L.regionRectFromBox=In;L.readHTMLRange=Dn;L.readCodeRange=Hn;L.lineRangeFromBox=$t;var xn=ue(),Ln=new Set(["pending","success","error","done"]),Nt=new WeakSet,Re=new WeakMap,X=new Map;function li(){Nt=new WeakSet,Re=new WeakMap;for(let{timer:i}of X.values())clearTimeout(i);X=new Map}function Mn(i){let e=i.match(/^lvt-fx:\w+:on:(.+)$/i);if(!e)return{trigger:null};let t=e[1].split(":");return t.length===1?{trigger:t[0].toLowerCase()}:{trigger:t[t.length-1].toLowerCase(),actionName:t.slice(0,-1).join(":")}}function ci(i,e){let t=e||i,n="__lvtFxDirectListeners",r=(t[n]||[]).filter(s=>s.el.isConnected),o=s=>{for(let a of s.attributes){if(!a.name.startsWith("lvt-fx:"))continue;let c=Mn(a.name);if(!c.trigger||Ln.has(c.trigger)||xn.SYNTHETIC_TRIGGERS.has(c.trigger))continue;let l=`__lvt_fx_${a.name}`;if(s[l])continue;let d=a.name.match(/^lvt-fx:(\w+)/i)?.[1];if(!d)continue;let h=a.name,u=()=>{if(!s.hasAttribute(h))return;let p=s.getAttribute(h)||"",v=(0,xn.resolveTarget)(s);Oe(v,d,p)};s.addEventListener(c.trigger,u),s[l]=u,r.push({el:s,event:c.trigger,handler:u,guardKey:l})}};o(i),i.querySelectorAll("*").forEach(o),t[n]=r}function di(i){let e="__lvtFxDirectListeners",t=i[e];t&&(t.forEach(({el:n,event:r,handler:o,guardKey:s})=>{n.removeEventListener(r,o),delete n[s]}),delete i[e])}function _n(i,e,t){let n=r=>{for(let o of r.attributes){if(!o.name.startsWith("lvt-fx:"))continue;let s=Mn(o.name);if(!s.trigger||!Ln.has(s.trigger)||s.trigger!==e||s.actionName&&s.actionName!==t)continue;let a=o.name.match(/^lvt-fx:(\w+)/i)?.[1];a&&Oe(r,a,o.value)}};n(i),i.querySelectorAll("*").forEach(n)}function Oe(i,e,t){let n=getComputedStyle(i);switch(e){case"highlight":{if(i.__lvtHighlighting)break;i.__lvtHighlighting=!0;let r=parseInt(n.getPropertyValue("--lvt-highlight-duration").trim()||"500",10),o=n.getPropertyValue("--lvt-highlight-color").trim()||"#ffc107",s=i.style.backgroundColor,a=i.style.transition;i.style.transition=`background-color ${r}ms ease-out`,i.style.backgroundColor=o,setTimeout(()=>{if(!i.isConnected){i.style.backgroundColor=s,i.style.transition=a,i.style.length===0&&i.removeAttribute("style"),i.__lvtHighlighting=!1;return}i.style.backgroundColor=s,setTimeout(()=>{i.isConnected&&(i.style.transition=a,i.style.length===0&&i.removeAttribute("style")),i.__lvtHighlighting=!1},r)},50);break}case"animate":{if(Nt.has(i))break;Nt.add(i);let r=parseInt(n.getPropertyValue("--lvt-animate-duration").trim()||"500",10),o=t||"fade",s="";switch(o){case"fade":s=`lvt-fade-in ${r}ms ease-out`;break;case"slide":s=`lvt-slide-in ${r}ms ease-out`;break;case"scale":s=`lvt-scale-in ${r}ms ease-out`;break;default:console.warn(`Unknown lvt-fx:animate mode: ${o}`)}if(!s)break;i.style.animation=s,i.addEventListener("animationend",()=>{i.style.removeProperty("animation"),i.style.length===0&&i.removeAttribute("style")},{once:!0});break}case"scroll":{let r=n.getPropertyValue("--lvt-scroll-behavior").trim(),o=pi.has(r)?r:"auto",s=parseInt(n.getPropertyValue("--lvt-scroll-threshold").trim()||"100",10),a=t||"bottom";switch(a){case"bottom":i.scrollTo({top:i.scrollHeight,behavior:o});break;case"bottom-sticky":{i.dataset.lvtScrollSticky==="1"?i.scrollHeight-i.scrollTop-i.clientHeight<=s&&i.scrollTo({top:i.scrollHeight,behavior:o}):(i.dataset.lvtScrollSticky="1",i.scrollTo({top:i.scrollHeight,behavior:"instant"}));break}case"top":i.scrollTo({top:0,behavior:o});break;case"into-view":{i.dataset.lvtIvDone!=="1"&&(i.scrollIntoView({block:"center",inline:"nearest",behavior:o}),i.dataset.lvtIvDone="1");break}case"preserve":break;default:{if(a.startsWith("reset-on:")){let c=a.slice(9);if(!c){console.warn('lvt-fx:scroll="reset-on:" requires an attribute name');break}let l=i.getAttribute(c);Re.has(i)?Re.get(i)!==l&&(Re.set(i,l),i.scrollLeft=0,i.scrollTop=0):Re.set(i,l);break}console.warn(`Unknown lvt-fx:scroll mode: ${a}`)}}break}default:console.warn(`Unknown lvt-fx effect: ${e}`)}}function ui(i){let e="__lvtFxLifecycleSetup";if(i[e])return;i[e]=!0;let t=[];["pending","success","error","done"].forEach(r=>{let o=s=>{let c=s.detail?.action;_n(i,r,c)};document.addEventListener(`lvt:${r}`,o,!0),t.push({event:`lvt:${r}`,handler:o})}),i.__lvtFxLifecycleListeners=t}function hi(i){let e=i.__lvtFxLifecycleListeners;e&&(e.forEach(({event:t,handler:n})=>{document.removeEventListener(t,n,!0)}),delete i.__lvtFxLifecycleListeners),delete i.__lvtFxLifecycleSetup}var pi=new Set(["auto","smooth","instant"]);function fi(i){i.querySelectorAll("[lvt-fx\\:scroll]").forEach(e=>{let t=e.getAttribute("lvt-fx:scroll");t&&Oe(e,"scroll",t)})}function gi(){for(let{timer:i}of X.values())clearTimeout(i);X.clear()}function mi(i){if(!(X.size===0&&i.querySelector("[lvt-fx\\:auto-click]")===null)){for(let[e,t]of Array.from(X))(!e.isConnected||!e.hasAttribute("lvt-fx:auto-click"))&&(clearTimeout(t.timer),X.delete(e));i.querySelectorAll("[lvt-fx\\:auto-click]").forEach(e=>{let t=e.getAttribute("lvt-fx:auto-click");if(!t)return;let n=X.get(e);if(n&&n.spec===t)return;n&&clearTimeout(n.timer);let r=t.indexOf(":"),o=r>0?t.slice(0,r):"",s=/^\d+$/.test(o)?parseInt(o,10):NaN,a=r>0?t.slice(r+1):"";if(!Number.isFinite(s)||s<0||!a||!/^[\w-]+$/.test(a)){console.warn(`lvt-fx:auto-click expects ":", got: ${t}`),X.delete(e);return}let c=setTimeout(()=>{if(!e.isConnected)return;let l=e.querySelector(`button[name="${a}"]`);l&&l.click()},s);X.set(e,{timer:c,spec:t})})}}function vi(i){i.querySelectorAll("[lvt-fx\\:highlight]").forEach(e=>{let t=e.getAttribute("lvt-fx:highlight");t&&Oe(e,"highlight",t)})}function bi(i){i.querySelectorAll("[lvt-fx\\:animate]").forEach(e=>{let t=e.getAttribute("lvt-fx:animate");t&&Oe(e,"animate",t)}),yi()}function yi(){if(!document.getElementById("lvt-animate-styles")){let i=document.createElement("style");i.id="lvt-animate-styles",i.textContent=` @keyframes lvt-fade-in { from { opacity: 0; } to { opacity: 1; } @@ -11,7 +11,7 @@ from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } - `,document.head.appendChild(i)}}var vn="__lvtPendingProcessed";function ui(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[vn]===t)return;e[vn]=t;let n;try{n=JSON.parse(t)}catch{return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",o=pi(r);n.forEach(s=>{let a=gi(s);o.appendChild(a),typeof s.dismissMS=="number"&&s.dismissMS>0&&setTimeout(()=>a.remove(),s.dismissMS)})})}function hi(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(o=>o.remove())};document[i]=t,document.addEventListener("click",t)}function pi(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),fi(e,i),document.body.appendChild(e)),e}function fi(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function gi(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}var yn=new WeakMap;function mi(i){let e=i.querySelectorAll("template[shadowrootmode]");if(e.length!==0)for(let t of e){let n=t.parentElement;if(!n){t.remove();continue}let r=t.getAttribute("shadowrootmode");if(r!=="open"&&r!=="closed"){console.warn(`livetemplate: invalid shadowrootmode=${JSON.stringify(r)}; expected "open" or "closed". Template removed.`,t),t.remove();continue}let o=r,s=n.shadowRoot??yn.get(n);if(s&&s.mode!==r&&console.warn(`livetemplate: shadowrootmode changed from "${s.mode}" to "${r}" on re-render \u2014 mode is fixed at first attach and cannot be changed.`,n),!s)try{s=n.attachShadow({mode:o,delegatesFocus:t.hasAttribute("shadowrootdelegatesfocus"),clonable:t.hasAttribute("shadowrootclonable"),serializable:t.hasAttribute("shadowrootserializable")}),o==="closed"&&yn.set(n,s)}catch(a){if(!(a instanceof DOMException))throw a;console.warn(`livetemplate: attachShadow rejected on <${n.tagName.toLowerCase()}> (${a.name}: ${a.message}). Template removed.`,n),t.remove();continue}s.replaceChildren(t.content),t.remove()}}var _e=new Map,wn=new WeakSet,kn=.02;function bi(i,e){for(let[n,r]of Array.from(_e))(!n.isConnected||!n.hasAttribute("lvt-fx:area-select"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:area-select]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:area-select");if(!r){console.warn(`lvt-fx:area-select requires an action name, got: ${JSON.stringify(r)}`);continue}let o=_e.get(n);if(o&&o.action===r){o.updateSend(e);continue}o&&o.cleanup(),_e.set(n,Si(n,r,e))}}function vi(i){for(let[e,t]of Array.from(_e))i.contains(e)&&t.cleanup()}var se=new Map,ue=null;function yi(i,e){for(let[r,o]of Array.from(se))(!r.isConnected||!r.hasAttribute("lvt-fx:url-hash"))&&o.cleanup();let t=[];i instanceof HTMLElement&&i.hasAttribute("lvt-fx:url-hash")&&t.push(i);let n=i.ownerDocument?.body;if(n&&n!==i&&n.hasAttribute("lvt-fx:url-hash")&&!t.includes(n)&&t.push(n),i.querySelectorAll("[lvt-fx\\:url-hash]").forEach(r=>{t.includes(r)||t.push(r)}),t.length!==0)for(let r of t){let o=r.getAttribute("lvt-fx:url-hash");if(!o){console.warn(`lvt-fx:url-hash requires an action name, got: ${JSON.stringify(o)}`);continue}let s=r.getAttribute("data-lvt-url-hash")||"",a=se.get(r);if(a&&a.action===o){a.updateSend(e),En(a,s);continue}a&&a.cleanup();let c=xi(r,o,e);se.set(r,c);let l=window.location.hash.replace(/^#/,"");l&&l!==s&&qe(l)?(c.currentDataHash=l,e({action:o,data:{hash:l}})):l&&!qe(l)?c.currentDataHash=s:En(c,s)}}function wi(i){let e=i.ownerDocument?.body;for(let[t,n]of Array.from(se)){if(i.contains(t)){n.cleanup();continue}e&&t===e&&e.contains(i)&&n.cleanup()}}function En(i,e){if(i.currentDataHash===e)return;let t=window.location.hash.replace(/^#/,"");if(t===e){i.currentDataHash=e;return}if(t!==""&&!qe(t)){i.currentDataHash=e;return}Ei(e);let n=e?`#${e}`:window.location.pathname+window.location.search,r=t.split(":")[0],o=e.split(":")[0],s=window.history.state;t!==""&&r!==o?window.history.pushState(s,"",n):window.history.replaceState(s,"",n),i.currentDataHash=e}var Dt=new Set;function ki(){Dt.clear()}function Ei(i){!i||Dt.has(i)||(/[ <>"`#\[\]]/.test(i)||/%(?![0-9A-Fa-f]{2})/.test(i))&&(Dt.add(i),console.warn(`lvt-fx:url-hash: data-lvt-url-hash="${i}" contains characters that should be percent-encoded. The directive writes it verbatim into history.pushState/replaceState; malformed URLs result. Server-side FormatHash (or equivalent) should percent-escape path segments and target ids before serialization.`))}function qe(i){return i?i.includes(":")||i.includes("/")||i.includes("."):!1}function xi(i,e,t){let n={action:e,send:t,cleanup:()=>{se.delete(i),se.size===0&&ue&&(window.removeEventListener("hashchange",ue),ue=null)},updateSend:r=>{n.send=r},currentDataHash:""};return ue||(ue=()=>{let r=window.location.hash.replace(/^#/,"");if(qe(r))for(let o of Array.from(se.values()))o.currentDataHash=r,o.send({action:o.action,data:{hash:r}})},window.addEventListener("hashchange",ue)),n}function Si(i,e,t){let n=t,r=null,o=0,s=0,a=-1,c=null,l=null,d=()=>{r&&r.remove(),r=null},h=(b,R)=>{if(a===-1)return;let y=a,k=l;a=-1,c=null,l=null;try{i.releasePointerCapture(y)}catch{}if(i.removeEventListener("pointerleave",u),!R||!b||!k){d();return}if(k.width<=0||k.height<=0){d();return}let E=k.left+k.width,M=k.top+k.height,w=Ue(Math.min(o,b.clientX),k.left,E),F=Ue(Math.min(s,b.clientY),k.top,M),B=Ue(Math.max(o,b.clientX),k.left,E),$=Ue(Math.max(s,b.clientY),k.top,M),V=(w-k.left)/k.width,D=(F-k.top)/k.height,f=(B-w)/k.width,m=($-F)/k.height;d(),!(f<=0||m<=0)&&(f{b.pointerId===a&&h(null,!1)},g=b=>b.preventDefault(),v=b=>{if(!b.isPrimary||b.button!==0)return;a!==-1&&h(null,!1);let R=i.parentElement;if(!R)return;if(!wn.has(R)){let k=window.getComputedStyle(R).position;k!=="relative"&&k!=="absolute"&&k!=="fixed"&&k!=="sticky"&&(console.warn("lvt-fx:area-select: parentElement has no positioning context; the drag overlay will be mis-positioned. Add position:relative (or absolute/fixed/sticky) to the parent.",R),wn.add(R))}o=b.clientX,s=b.clientY,a=b.pointerId,c=R,l=i.getBoundingClientRect();let y=!1;try{i.setPointerCapture(a),y=!0}catch{}y||i.addEventListener("pointerleave",u,{once:!0}),r=document.createElement("div"),r.className="lvt-area-select-overlay",r.setAttribute("aria-hidden","true"),r.style.cssText="position:absolute;pointer-events:none;border:2px solid var(--lvt-area-select-color,#4cc2ff);background:var(--lvt-area-select-fill,rgba(76,194,255,0.18));box-sizing:border-box;z-index:var(--lvt-area-select-z-index,9999);",R.appendChild(r),T(b)},T=b=>{if(!r)return;let R=c;if(!R)return;let y=i.getBoundingClientRect(),k=R.getBoundingClientRect(),E=R.clientLeft,M=R.clientTop,w=R.scrollLeft,F=R.scrollTop,B=Z=>Z-k.left-E+w,$=Z=>Z-k.top-M+F,V=B(Math.min(o,b.clientX)),D=$(Math.min(s,b.clientY)),f=Math.abs(b.clientX-o),m=Math.abs(b.clientY-s),_=B(y.left),A=$(y.top),C=_+y.width,X=A+y.height,W=Math.max(_,Math.min(V,C)),J=Math.max(A,Math.min(D,X)),le=Math.max(_,Math.min(V+f,C)),G=Math.max(A,Math.min(D+m,X));r.style.left=`${W}px`,r.style.top=`${J}px`,r.style.width=`${Math.max(0,le-W)}px`,r.style.height=`${Math.max(0,G-J)}px`},S=b=>{if(b.pointerId===a){if(!i.isConnected){h(null,!1);return}T(b)}},I=b=>{if(b.pointerId===a){if(!i.isConnected){h(null,!1);return}h(b,!0)}},p=b=>{b.pointerId===a&&h(b,!1)},x=b=>{b.pointerId===a&&h(null,!1)};return i.addEventListener("pointerdown",v),i.addEventListener("pointermove",S),i.addEventListener("pointerup",I),i.addEventListener("pointercancel",p),i.addEventListener("lostpointercapture",x),i.addEventListener("dragstart",g),{action:e,cleanup:()=>{i.removeEventListener("pointerdown",v),i.removeEventListener("pointermove",S),i.removeEventListener("pointerup",I),i.removeEventListener("pointercancel",p),i.removeEventListener("lostpointercapture",x),i.removeEventListener("pointerleave",u),i.removeEventListener("dragstart",g),h(null,!1),_e.delete(i)},updateSend:b=>{n=b}}}function Ue(i,e,t){return!Number.isFinite(i)||it?t:i}});var Ht=L(We=>{"use strict";Object.defineProperty(We,"__esModule",{value:!0});We.debounce=Ai;We.throttle=Ti;function Ai(i,e){let t=null;return function(...r){let o=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(o,r)},e)}}function Ti(i,e){let t=!1;return function(...r){let o=this;t||(i.apply(o,r),t=!0,setTimeout(()=>{t=!1},e))}}});var Ot=L(Re=>{"use strict";Object.defineProperty(Re,"__esModule",{value:!0});Re.redactActionData=Li;Re.redactFormData=Mi;Re.hydrateRedactedTokens=_i;var Ci="lvt-redact";function Cn(i,e){return`${Ci}:${i}:${e}`}function Ln(i){return(i??(typeof document<"u"?document:null))?.querySelector?.("[data-lvt-id]")?.getAttribute("data-lvt-id")||"lvt-unknown"}function Mn(i){if(i?.storage)return i.storage;try{return typeof localStorage<"u"?localStorage:null}catch{return null}}function _n(i){return i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement||i instanceof HTMLSelectElement}function In(i){let e=[];return i.hasAttribute("data-lvt-redact")&&e.push(i),i.querySelectorAll?.("[data-lvt-redact]").forEach(t=>e.push(t)),e}function Rn(i,e,t){let n=Mn(e),r=n?e?.scope??Ln(i.ownerDocument):null;for(let o of In(i)){let s=o.getAttribute("data-lvt-redact");if(!s||!_n(o))continue;if(n&&r)try{n.setItem(Cn(r,s),o.value)}catch{}let a=o.getAttribute("name")||s;t(a,{redacted:!0,field:s})}}function Li(i,e,t){Rn(i,t,(n,r)=>{e[n]=r})}function Mi(i,e,t){Rn(i,t,(n,r)=>{e.set(n,JSON.stringify(r))})}function _i(i,e){let t=Mn(e);if(!t)return;let n=e?.scope??Ln(i.ownerDocument),r=new Map,o=a=>{if(r.has(a))return r.get(a);let c=null;try{c=t.getItem(Cn(n,a))}catch{c=null}return r.set(a,c),c},s=i.ownerDocument?.activeElement??null;for(let a of In(i)){if(a===s)continue;let c=a.getAttribute("data-lvt-redact");if(!c)continue;let l=o(c);l!==null&&(_n(a)?a.value=l:a.textContent=l)}}});var Dn=L(Pt=>{"use strict";Object.defineProperty(Pt,"__esModule",{value:!0});Pt.lvtSelector=Ii;function Ii(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}});var je=L(ze=>{"use strict";Object.defineProperty(ze,"__esModule",{value:!0});ze.hasNoInterceptOptOut=Ri;ze._resetLegacyNoInterceptWarned=Di;var Nt=!1;function Ri(i,e,t){return i.hasAttribute(e)?!0:i.hasAttribute("lvt-no-intercept")?(Nt||(Nt=!0,t.warn(`lvt-no-intercept is deprecated; use ${e}. The shim will be removed in v0.9.0.`)),!0):!1}function Di(){Nt=!1}});var Fn=L(ne=>{"use strict";Object.defineProperty(ne,"__esModule",{value:!0});ne.EventDelegator=ne.DELEGATED_EVENT_TYPES=void 0;var Ke=Ht(),Hn=Ot(),On=Dn(),he=de(),Hi=je(),Nn={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},Oi=Object.keys(Nn),Pi=new Set(["mouseenter","mouseleave","focus","blur"]),Pn="application/x-lvt-key",Ni=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]);ne.DELEGATED_EVENT_TYPES=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"];var Ft=class{constructor(e,t){this.context=e,this.logger=t,this.warnedEmitSubmitterGETForms=new WeakSet}teardownForWrapper(e){if(e)for(let t of ne.DELEGATED_EVENT_TYPES){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=ne.DELEGATED_EVENT_TYPES,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(o=>{let s=`__lvt_delegated_${o}_${n}`,a=document[s];a&&document.removeEventListener(o,a,!1);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let h=l.target;if(this.logger.debug("Event listener triggered:",o,l.target),!h)return;let u=h,g=!1;for(;u;){if(u===d){g=!0;break}u=u.parentElement}if(!g)return;let v=`lvt-on:${o}`;for(u=h;u&&u!==d.parentElement;){let T=u.getAttribute(v),S=u,I=!1;if(!T&&o==="submit"&&u instanceof HTMLFormElement){let p=u.getAttribute("lvt-persist");p&&(T=`persist:${p}`,S=u)}if(!T&&o==="click"){let p=u instanceof HTMLButtonElement?u:null;p&&p.name&&!p.disabled&&p.type!=="reset"&&p.form===null&&!p.hasAttribute("commandfor")&&(T=p.name,S=p,I=!0)}if(!T&&o==="submit"&&u instanceof HTMLFormElement)if((0,Hi.hasNoInterceptOptOut)(u,"lvt-form:no-intercept",this.logger)){if(u.hasAttribute("lvt-form:emit-submitter")){let p=l.submitter;if(p?.name){u.method==="get"&&!this.warnedEmitSubmitterGETForms.has(u)&&(this.logger.warn('lvt-form:emit-submitter on a GET form serializes lvt-submitter into the URL query string, polluting browser history and any shared/bookmarked URLs. Use method="POST" or remove the directive if URL pollution is unacceptable.',u),this.warnedEmitSubmitterGETForms.add(u));let x=u.querySelector('input[type="hidden"][name="lvt-submitter"]');x||(x=document.createElement("input"),x.type="hidden",x.name="lvt-submitter",u.appendChild(x)),x.value=p.name}else u.querySelector('input[type="hidden"][name="lvt-submitter"]')?.remove()}}else{let p=u.getAttribute("lvt-form:action"),x=l.submitter;p?T=p:x instanceof HTMLButtonElement&&x.name?T=x.name:u.getAttribute("name")?T=u.getAttribute("name"):T="submit",S=u,x&&(u.__lvtSubmitter=x);let N=u.closest("dialog");N&&u.getAttribute("method")?.toLowerCase()==="dialog"&&(u.__lvtCloseDialog=N)}if(T!=null&&S){if(o==="submit"&&l.preventDefault(),Ni.has(o)){let y=l;if(o==="dragstart"&&y.dataTransfer){let E=S.closest("[data-key]")?.getAttribute("data-key")??"";y.dataTransfer.setData(Pn,E),y.dataTransfer.effectAllowed="move"}else if(o==="dragover")y.preventDefault(),y.dataTransfer&&(y.dataTransfer.dropEffect="move");else if(o==="drop")y.preventDefault();else if(o==="dragenter"||o==="dragleave"){let k=y.relatedTarget;if(k&&S.contains(k))return}if(T==="")return}if((o==="keydown"||o==="keyup")&&S.hasAttribute("lvt-key")){let y=S.getAttribute("lvt-key");if(y&&l.key!==y){u=u.parentElement;continue}}let p=S,x=()=>{this.logger.debug("handleAction called",{action:T,eventType:o,targetElement:p});let y={action:T,data:{}};if(p instanceof HTMLFormElement){this.logger.debug("Processing form element");let E=new FormData(p),M=Array.from(p.querySelectorAll('input[type="checkbox"][name]')),w=new Map;M.forEach(D=>{let f=w.get(D.name)||[];f.push(D),w.set(D.name,f)}),w.forEach((D,f)=>{D.length===1?y.data[f]=D[0].checked:y.data[f]=D.filter(m=>m.checked).map(m=>m.value)});let F=new Set(Array.from(p.querySelectorAll('input[type="password"][name]')).map(D=>D.name)),$=p.__lvtSubmitter?.name;E.forEach((D,f)=>{D instanceof File||$&&f===$||w.has(f)||(F.has(f)?y.data[f]=D:y.data[f]=this.context.parseValue(D))});let V=p.__lvtSubmitter;V&&(this.extractButtonData(V,y.data),V.name&&(y.submitter=V.name),delete p.__lvtSubmitter),this.logger.debug("Form data collected:",y.data)}else if(o==="change"||o==="input"||o==="search"){if(p instanceof HTMLInputElement){let E=p.name||"value";y.data[E]=this.context.parseValue(p.value)}else if(p instanceof HTMLSelectElement){let E=p.name||"value";y.data[E]=this.context.parseValue(p.value)}else if(p instanceof HTMLTextAreaElement){let E=p.name||"value";y.data[E]=this.context.parseValue(p.value)}}if(I&&this.extractButtonData(S,y.data),!(p instanceof HTMLFormElement)&&!I&&Array.from(S.attributes).forEach(E=>{if(E.name.startsWith("data-")&&E.name!=="data-key"&&E.name!=="data-lvt-id"){let M=E.name.slice(5);y.data[M]=this.context.parseValue(E.value)}}),o==="drop"){let E=l.dataTransfer?.getData(Pn);E&&(y.data.dragSourceKey=E);let M=S.closest("[data-key]")?.getAttribute("data-key");M&&(y.data.dragTargetKey=M)}let k=null;if(o==="submit"&&p instanceof HTMLFormElement){let E=p.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(E).some(w=>w.files&&w.files.length>0)){let w=l.submitter;k=new FormData(p),w?.name&&k.set(w.name,w.value),k.set("lvt-action",T),w?.name&&k.set("lvt-submitter",w.name)}}if(o==="submit"&&p instanceof HTMLFormElement){let M=l.submitter,w=null;M&&M.hasAttribute("lvt-form:disable-with")&&(w=M.textContent,M.disabled=!0,M.textContent=M.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(p,M||null,w),p.querySelectorAll('input[type="file"][lvt-upload]').forEach(B=>{let $=B.getAttribute("lvt-upload");$&&(this.logger.debug("Triggering pending uploads for:",$),this.context.triggerPendingUploads($))}),p.dispatchEvent(new CustomEvent("lvt:pending",{detail:y})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",y),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),k!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),(0,Hn.redactFormData)(p,k),this.context.sendHTTPMultipart(p,T,k);return}if((0,Hn.redactActionData)(p,y.data),this.context.send(y),this.logger.debug("send() called"),p instanceof HTMLFormElement){let E=p.__lvtCloseDialog;E&&(E.close(),delete p.__lvtCloseDialog)}},N=S.getAttribute("lvt-mod:throttle"),b=S.getAttribute("lvt-mod:debounce");if((N||b)&&o!=="search"){r.has(S)||r.set(S,new Map);let y=r.get(S),k=`${o}:${T}`,E=`__lvt_callback_${k}`,M=S;M[E]||(M[E]={current:x}),M[E].current=x;let w=y.get(k);if(!w){let F=()=>M[E].current();if(N){let B=parseInt(N,10);w=(0,Ke.throttle)(F,B)}else if(b){let B=parseInt(b,10);w=(0,Ke.debounce)(F,B)}w&&y.set(k,w)}w&&w()}else x();return}u=u.parentElement}};document[s]=c,document.addEventListener(o,c,!1),this.logger.debug("Registered event listener:",o,"with key:",s)})}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(o=>{let s=`__lvt_window_${o}_${n}`,a=window[s];a&&window.removeEventListener(o,a);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let h=`lvt-on:window:${o}`;d.querySelectorAll((0,On.lvtSelector)(h)).forEach(g=>{let v=g.getAttribute(h);if(!v)return;if((o==="keydown"||o==="keyup")&&g.hasAttribute("lvt-key")){let x=g.getAttribute("lvt-key");if(x&&l.key!==x)return}let T={action:v,data:{}};Array.from(g.attributes).forEach(x=>{if(x.name.startsWith("data-")&&x.name!=="data-key"&&x.name!=="data-lvt-id"){let N=x.name.slice(5);T.data[N]=this.context.parseValue(x.value)}});let S=g.getAttribute("lvt-mod:throttle"),I=g.getAttribute("lvt-mod:debounce"),p=()=>this.context.send(T);if(S||I){r.has(g)||r.set(g,new Map);let x=r.get(g),N=`window-${o}:${v}`,b=x.get(N);if(!b){if(S){let R=parseInt(S,10);b=(0,Ke.throttle)(p,R)}else if(I){let R=parseInt(I,10);b=(0,Ke.debounce)(p,R)}b&&x.set(N,b)}b&&b()}else p()})};window[s]=c,window.addEventListener(o,c)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let o=s=>{let a=this.context.getWrapperElement();if(!a)return;let c=s.target,l=Oi.map(h=>(0,On.lvtSelector)(`lvt-el:${h}:on:click-away`)).join(", ");a.querySelectorAll(l).forEach(h=>{h.contains(c)||Array.from(h.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let g=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!g)return;let v=Nn[g[1].toLowerCase()];v&&(0,he.executeAction)((0,he.resolveTarget)(h),v,u.value)})})};document[n]=o,document.addEventListener("click",o)}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}`,o=t[r]||new Set,s=`__lvt_el_listeners_${n}`,a=(t[s]||[]).filter(d=>d.el.isConnected),c=e||t,l=d=>{let h=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let g=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!g)continue;let v=g[1].toLowerCase();(0,he.isDOMEventTrigger)(v)&&h.add(v)}for(let u of h)if(Pi.has(u)){let g=`__lvt_el_${u}`;if(d[g])continue;let v=()=>(0,he.processElementInteraction)(d,u);d.addEventListener(u,v),d[g]=v,a.push({el:d,event:u,handler:v,guardKey:g})}else if(!o.has(u)){let g=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${g}$`,"i"),T=S=>{let I=S.target;for(;I&&I!==t;){let p=!1;for(let x of I.attributes)if(v.test(x.name)){p=!0;break}if(p){(0,he.processElementInteraction)(I,u);return}I=I.parentElement}I===t&&(0,he.processElementInteraction)(t,u)};t.addEventListener(u,T),o.add(u),a.push({el:t,event:u,handler:T})}};l(c),c.querySelectorAll("*").forEach(l),t[s]=a,t[r]=o}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:s,event:a,handler:c,guardKey:l})=>{s.removeEventListener(a,c),l&&delete s[l]}),delete e[n]);let o=`__lvt_el_delegated_${t}`;delete e[o]}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 o=a=>{let c=["a[href]:not([disabled])","button:not([disabled])","textarea:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])",'[tabindex]:not([tabindex="-1"]):not([disabled])','[contenteditable="true"]'].join(", ");return Array.from(a.querySelectorAll(c)).filter(l=>{let d=l,h=window.getComputedStyle(d),u=h.display!=="none",g=h.visibility!=="hidden",v=d.offsetParent!==null||h.position==="fixed"||h.position==="absolute"||typeof process<"u"&&!1;return u&&g&&v})},s=a=>{if(a.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(v=>{v.contains(document.activeElement)&&(!d||v.contains(d))&&(d=v)}),d||l.forEach(v=>{let T=v,S=window.getComputedStyle(T);S.display!=="none"&&S.visibility!=="hidden"&&(d=v)}),!d)return;let h=o(d);if(h.length===0)return;let u=h[0],g=h[h.length-1];a.shiftKey?document.activeElement===u&&(a.preventDefault(),g.focus()):document.activeElement===g&&(a.preventDefault(),u.focus())};document[n]=s,document.addEventListener("keydown",s),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 o=()=>{let a=this.context.getWrapperElement();if(!a)return;a.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,h=window.getComputedStyle(d),u=h.display!=="none",g=h.visibility!=="hidden",v=d.offsetParent!==null||h.position==="fixed"||h.position==="absolute"||d.tagName==="BODY"||typeof process<"u"&&!1,T=u&&g&&v,S=d.getAttribute("data-lvt-autofocused")==="true";T&&!S?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!T&&S&&d.removeAttribute("data-lvt-autofocused")})};o();let s=new MutationObserver(a=>{let c=!1;a.forEach(l=>{l.type==="childList"&&l.addedNodes.length>0&&l.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(c=!0)}),l.type==="attributes"&&(l.target.hasAttribute("lvt-autofocus")||l.attributeName==="hidden"||l.attributeName==="style"||l.attributeName==="class")&&(c=!0)}),c&&o()});s.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=s,this.logger.debug("Autofocus delegation set up")}};ne.EventDelegator=Ft});var $t=L(ie=>{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});ie.safeMatchesPopoverOpen=$n;ie.openFromHash=zn;ie.isHashLinkTarget=Bi;ie.activateHashTarget=Ui;ie.setupHashLink=qi;ie.teardownHashLink=Wi;function $n(i){try{return i.matches(":popover-open")}catch{return!1}}var Fi=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>$n(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function re(i){return Fi.find(e=>e.matches(i))}var $i=new Set(["show-modal","show-popover"]);function Bn(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let o=document.getElementById(r);if(!o)return;let s=re(o);if(s){if($i.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!s.isOpen(o)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function Un(i){let e=i.target;e instanceof Element&&e.id&&re(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function qn(i){let e=i.target;if(!(e instanceof Element)||!e.id)return;let t=re(e);if(t)if(t.isOpen(e)){if(location.hash==="#"+e.id)return;history.pushState(null,"","#"+e.id)}else{if(location.hash!=="#"+e.id)return;history.replaceState(null,"",location.pathname+location.search)}}function Wn(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=re(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=re(e);t&&!t.isOpen(e)&&t.open(e)}}}function zn(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=re(e);t&&(t.isOpen(e)||t.open(e))}function Bi(i){let e=document.getElementById(i);return e?!!re(e):!1}function Ui(i){let e=document.getElementById(i);if(!e)return;let t=re(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var Ve=!1;function qi(){Ve||(Ve=!0,document.addEventListener("click",Bn),document.addEventListener("close",Un,!0),document.addEventListener("toggle",qn,!0),window.addEventListener("popstate",Wn),zn())}function Wi(){Ve&&(Ve=!1,document.removeEventListener("click",Bn),document.removeEventListener("close",Un,!0),document.removeEventListener("toggle",qn,!0),window.removeEventListener("popstate",Wn))}});var Kn=L(Ge=>{"use strict";Object.defineProperty(Ge,"__esModule",{value:!0});Ge.LinkInterceptor=void 0;var zi=je(),jn=$t(),Bt=class{constructor(e,t){this.context=e,this.logger=t,this.popstateListener=null,this.abortController=null,this.currentHref=window.location.href}teardownForWrapper(e){if(this.abortController?.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 o=s=>{let a=s.target?.closest("a[href]");if(!a)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(a))&&!this.shouldSkip(a)){if(a.pathname===window.location.pathname&&a.search===window.location.search&&a.hash){let l=a.hash.slice(1);l&&(0,jn.isHashLinkTarget)(l)&&(s.preventDefault(),(0,jn.activateHashTarget)(l));return}s.preventDefault(),this.navigate(a.href)}};document.addEventListener("click",o),document[n]=o,this.popstateListener||(this.popstateListener=()=>{let s=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,s)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||(0,zi.hasNoInterceptOptOut)(e,"lvt-nav:no-intercept",this.logger))return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){let r=new URL(e,window.location.origin),o=new URL(n,window.location.origin);if(r.origin===o.origin&&r.pathname===o.pathname){if(r.search===o.search){this.abortController?.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&(this.abortController?.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}this.abortController?.abort(),this.abortController=new AbortController;try{let a=await fetch(e,{credentials:"include",headers:{Accept:"text/html"},signal:this.abortController.signal});if(!a.ok){window.location.href=e;return}let c=await a.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(c,e)}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;window.location.href=e}}};Ge.LinkInterceptor=Bt});var Vn=L(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.ObserverManager=void 0;var Ye=class i{constructor(e,t){this.context=e,this.logger=t,this.infiniteScrollObserver=null,this.mutationObserver=null,this.observedSentinel=null,this.updatedListener=null,this.updatedListenerWrapper=null,this.loadMorePending=!1,this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=e.querySelector("[lvt-scroll-sentinel]");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{t.detail?.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 ${i.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},i.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()}};Xe.ObserverManager=Ye;Ye.LOAD_MORE_TIMEOUT_MS=3e4});var Gn=L(Je=>{"use strict";Object.defineProperty(Je,"__esModule",{value:!0});Je.LoadingIndicator=void 0;var Ut=class{constructor(){this.bar=null,this.actionTimer=null,this.pendingCount=0,this.pendingHandler=null,this.updatedHandler=null,this.currentDebounceMs=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.className="lvt-loading-bar",e.style.cssText=` + `,document.head.appendChild(i)}}var Sn="__lvtPendingProcessed";function wi(i){i.querySelectorAll("[data-toast-trigger]").forEach(e=>{let t=e.getAttribute("data-pending");if(!t||e[Sn]===t)return;e[Sn]=t;let n;try{n=JSON.parse(t)}catch{return}if(!Array.isArray(n)||!n.length)return;let r=e.getAttribute("data-position")||"top-right",o=Ei(r);n.forEach(s=>{let a=Si(s);o.appendChild(a),typeof s.dismissMS=="number"&&s.dismissMS>0&&setTimeout(()=>a.remove(),s.dismissMS)})})}function ki(){let i="__lvt_toast_click_outside",e=document[i];e&&document.removeEventListener("click",e);let t=n=>{let r=document.querySelector("[data-lvt-toast-stack]");!r||r.contains(n.target)||r.querySelectorAll("[data-lvt-toast-item]").forEach(o=>o.remove())};document[i]=t,document.addEventListener("click",t)}function Ei(i){let e=document.querySelector("[data-lvt-toast-stack]");return e||(e=document.createElement("div"),e.setAttribute("data-lvt-toast-stack",""),e.setAttribute("aria-live","polite"),xi(e,i),document.body.appendChild(e)),e}function xi(i,e){let t=i.style;switch(e){case"top-left":t.top="1rem",t.left="1rem";break;case"top-center":t.top="1rem",t.left="50%",t.transform="translateX(-50%)";break;case"bottom-right":t.bottom="1rem",t.right="1rem";break;case"bottom-left":t.bottom="1rem",t.left="1rem";break;case"bottom-center":t.bottom="1rem",t.left="50%",t.transform="translateX(-50%)";break;default:t.top="1rem",t.right="1rem";break}}function Si(i){let e=document.createElement("div");e.setAttribute("role","alert"),e.setAttribute("data-lvt-toast-item",i.id),i.type&&e.setAttribute("data-type",i.type);let t=document.createElement("div");if(t.setAttribute("data-lvt-toast-content",""),i.title){let n=document.createElement("strong");n.textContent=i.title,t.appendChild(n)}if(i.body){let n=document.createElement("p");n.textContent=i.body,t.appendChild(n)}if(e.appendChild(t),i.dismissible){let n=document.createElement("button");n.type="button",n.setAttribute("aria-label","Dismiss"),n.textContent="\xD7",n.addEventListener("click",()=>e.remove()),e.appendChild(n)}return e}var An=new WeakMap;function Ai(i){let e=i.querySelectorAll("template[shadowrootmode]");if(e.length!==0)for(let t of e){let n=t.parentElement;if(!n){t.remove();continue}let r=t.getAttribute("shadowrootmode");if(r!=="open"&&r!=="closed"){console.warn(`livetemplate: invalid shadowrootmode=${JSON.stringify(r)}; expected "open" or "closed". Template removed.`,t),t.remove();continue}let o=r,s=n.shadowRoot??An.get(n);if(s&&s.mode!==r&&console.warn(`livetemplate: shadowrootmode changed from "${s.mode}" to "${r}" on re-render \u2014 mode is fixed at first attach and cannot be changed.`,n),!s)try{s=n.attachShadow({mode:o,delegatesFocus:t.hasAttribute("shadowrootdelegatesfocus"),clonable:t.hasAttribute("shadowrootclonable"),serializable:t.hasAttribute("shadowrootserializable")}),o==="closed"&&An.set(n,s)}catch(a){if(!(a instanceof DOMException))throw a;console.warn(`livetemplate: attachShadow rejected on <${n.tagName.toLowerCase()}> (${a.name}: ${a.message}). Template removed.`,n),t.remove();continue}s.replaceChildren(t.content),t.remove()}}var Ie=new Map,Ti=new WeakSet,Tn=.02;function Ci(i,e){for(let[n,r]of Array.from(Ie))(!n.isConnected||!n.hasAttribute("lvt-fx:area-select"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:area-select]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:area-select");if(!r){console.warn(`lvt-fx:area-select requires an action name, got: ${JSON.stringify(r)}`);continue}let o=Ie.get(n);if(o&&o.action===r){o.updateSend(e);continue}o&&o.cleanup(),Ie.set(n,Ni(n,r,e))}}function Li(i){for(let[e,t]of Array.from(Ie))i.contains(e)&&t.cleanup()}var De=new Map;function Mi(i){for(let[t,n]of Array.from(De))(!t.isConnected||!t.hasAttribute("lvt-fx:iframe-autoheight"))&&n.cleanup();let e=i.querySelectorAll("iframe[lvt-fx\\:iframe-autoheight]");for(let t of e){let n=De.get(t);if(n){n.sync();continue}De.set(t,Ri(t))}}function _i(i){for(let[e,t]of Array.from(De))i.contains(e)&&t.cleanup()}function Ri(i){let e=null,t=()=>{try{let r=i.contentDocument;if(!r?.documentElement)return;let o=r.documentElement.scrollHeight;o>0&&(i.style.height=`${o}px`)}catch{}},n=()=>{let r=null;try{r=i.contentDocument}catch{return}r&&(e?.disconnect(),typeof ResizeObserver<"u"&&r.documentElement&&(e=new ResizeObserver(()=>t()),e.observe(r.documentElement)),t())};return i.addEventListener("load",n),i.contentDocument?.readyState==="complete"&&n(),{cleanup:()=>{i.removeEventListener("load",n),e?.disconnect(),De.delete(i)},sync:()=>t()}}var ae=new Map,he=null;function Ii(i,e){for(let[r,o]of Array.from(ae))(!r.isConnected||!r.hasAttribute("lvt-fx:url-hash"))&&o.cleanup();let t=[];i instanceof HTMLElement&&i.hasAttribute("lvt-fx:url-hash")&&t.push(i);let n=i.ownerDocument?.body;if(n&&n!==i&&n.hasAttribute("lvt-fx:url-hash")&&!t.includes(n)&&t.push(n),i.querySelectorAll("[lvt-fx\\:url-hash]").forEach(r=>{t.includes(r)||t.push(r)}),t.length!==0)for(let r of t){let o=r.getAttribute("lvt-fx:url-hash");if(!o){console.warn(`lvt-fx:url-hash requires an action name, got: ${JSON.stringify(o)}`);continue}let s=r.getAttribute("data-lvt-url-hash")||"",a=ae.get(r);if(a&&a.action===o){a.updateSend(e),Cn(a,s);continue}a&&a.cleanup();let c=Pi(r,o,e);ae.set(r,c);let l=window.location.hash.replace(/^#/,"");l&&l!==s&&Ge(l)?(c.currentDataHash=l,e({action:o,data:{hash:l}})):l&&!Ge(l)?c.currentDataHash=s:Cn(c,s)}}function Di(i){let e=i.ownerDocument?.body;for(let[t,n]of Array.from(ae)){if(i.contains(t)){n.cleanup();continue}e&&t===e&&e.contains(i)&&n.cleanup()}}function Cn(i,e){if(i.currentDataHash===e)return;let t=window.location.hash.replace(/^#/,"");if(t===e){i.currentDataHash=e;return}if(t!==""&&!Ge(t)){i.currentDataHash=e;return}Oi(e);let n=e?`#${e}`:window.location.pathname+window.location.search,r=t.split(":")[0],o=e.split(":")[0],s=window.history.state;t!==""&&r!==o?window.history.pushState(s,"",n):window.history.replaceState(s,"",n),i.currentDataHash=e}var Ft=new Set;function Hi(){Ft.clear()}function Oi(i){!i||Ft.has(i)||(/[ <>"`#\[\]]/.test(i)||/%(?![0-9A-Fa-f]{2})/.test(i))&&(Ft.add(i),console.warn(`lvt-fx:url-hash: data-lvt-url-hash="${i}" contains characters that should be percent-encoded. The directive writes it verbatim into history.pushState/replaceState; malformed URLs result. Server-side FormatHash (or equivalent) should percent-escape path segments and target ids before serialization.`))}function Ge(i){return i?i.includes(":")||i.includes("/")||i.includes("."):!1}function Pi(i,e,t){let n={action:e,send:t,cleanup:()=>{ae.delete(i),ae.size===0&&he&&(window.removeEventListener("hashchange",he),he=null)},updateSend:r=>{n.send=r},currentDataHash:""};return he||(he=()=>{let r=window.location.hash.replace(/^#/,"");if(Ge(r))for(let o of Array.from(ae.values()))o.currentDataHash=r,o.send({action:o.action,data:{hash:r}})},window.addEventListener("hashchange",he)),n}function Rn(i,e,t,n){let r=null,o=0,s=0,a=-1,c="",l=null,d=null,h=null,u=()=>{r&&r.remove(),r=null},p=(f,A)=>{if(a===-1)return;let k=a,y=h;a=-1,c="",d=null,h=null,l=null;try{i.releasePointerCapture(k)}catch{}if(i.removeEventListener("pointerleave",v),!A||!f||!y){u();return}if(y.width<=0||y.height<=0){u();return}let w=y.left+y.width,F=y.top+y.height,$=Ke(Math.min(o,f.clientX),y.left,w),N=Ke(Math.min(s,f.clientY),y.top,F),q=Ke(Math.max(o,f.clientX),y.left,w),I=Ke(Math.max(s,f.clientY),y.top,F),m=($-y.left)/y.width,b=(N-y.top)/y.height,M=(q-$)/y.width,x=(I-N)/y.height;u(),!(M<=0||x<=0)&&(M{f.pointerId===a&&p(null,!1)},E=f=>f.preventDefault(),T=f=>{if(!f.isPrimary||f.button!==0)return;a!==-1&&p(null,!1);let A=i.parentElement;if(!A)return;if(!e.has(A)){let y=window.getComputedStyle(A).position;y!=="relative"&&y!=="absolute"&&y!=="fixed"&&y!=="sticky"&&(console.warn(`${t}: parentElement has no positioning context; the drag overlay will be mis-positioned. Add position:relative (or absolute/fixed/sticky) to the parent.`,A),e.add(A))}o=f.clientX,s=f.clientY,a=f.pointerId,c=f.pointerType,l=f,d=A,h=i.getBoundingClientRect();let k=!1;try{i.setPointerCapture(a),k=!0}catch{}k||i.addEventListener("pointerleave",v,{once:!0}),r=document.createElement("div"),r.className="lvt-area-select-overlay",r.setAttribute("aria-hidden","true"),r.style.cssText="position:absolute;pointer-events:none;border:2px solid var(--lvt-area-select-color,#4cc2ff);background:var(--lvt-area-select-fill,rgba(76,194,255,0.18));box-sizing:border-box;z-index:var(--lvt-area-select-z-index,9999);",A.appendChild(r),R(f)},R=f=>{if(!r)return;let A=d;if(!A)return;let k=i.getBoundingClientRect(),y=A.getBoundingClientRect(),w=A.clientLeft,F=A.clientTop,$=A.scrollLeft,N=A.scrollTop,q=se=>se-y.left-w+$,I=se=>se-y.top-F+N,m=q(Math.min(o,f.clientX)),b=I(Math.min(s,f.clientY)),M=Math.abs(f.clientX-o),x=Math.abs(f.clientY-s),C=q(k.left),G=I(k.top),W=C+k.width,Q=G+k.height,oe=Math.max(C,Math.min(m,W)),V=Math.max(G,Math.min(b,Q)),ce=Math.max(C,Math.min(m+M,W)),Y=Math.max(G,Math.min(b+x,Q));r.style.left=`${oe}px`,r.style.top=`${V}px`,r.style.width=`${Math.max(0,ce-oe)}px`,r.style.height=`${Math.max(0,Y-V)}px`},g=f=>{if(f.pointerId===a){if(!i.isConnected){p(null,!1);return}l=f,R(f)}},S=f=>{if(f.pointerId===a){if(!i.isConnected){p(null,!1);return}p(f,!0)}},O=f=>{f.pointerId===a&&p(f,c==="touch")},H=f=>{if(f.pointerId!==a)return;let A=c==="touch";p(A?l:null,A)};return i.addEventListener("pointerdown",T),i.addEventListener("pointermove",g),i.addEventListener("pointerup",S),i.addEventListener("pointercancel",O),i.addEventListener("lostpointercapture",H),i.addEventListener("dragstart",E),{cleanup:()=>{i.removeEventListener("pointerdown",T),i.removeEventListener("pointermove",g),i.removeEventListener("pointerup",S),i.removeEventListener("pointercancel",O),i.removeEventListener("lostpointercapture",H),i.removeEventListener("pointerleave",v),i.removeEventListener("dragstart",E),p(null,!1)}}}function Ni(i,e,t){let n=t,r=Rn(i,Ti,"lvt-fx:area-select",o=>n({action:e,data:{x:o.x,y:o.y,w:o.w,h:o.h}}));return{action:e,cleanup:()=>{r.cleanup(),Ie.delete(i)},updateSend:o=>{n=o}}}var He=new Map,Fi=new WeakSet;function $i(i,e){for(let[n,r]of Array.from(He))(!n.isConnected||!n.hasAttribute("lvt-fx:region-select"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:region-select]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:region-select");if(!r){console.warn(`lvt-fx:region-select requires an action name, got: ${JSON.stringify(r)}`);continue}let o=He.get(n);if(o&&o.action===r){o.updateSend(e);continue}o&&o.cleanup(),He.set(n,zi(n,r,e))}}function Bi(i){for(let[e,t]of Array.from(He))i.contains(e)&&t.cleanup()}var pe=new Map;function Ui(i,e){for(let[n,r]of Array.from(pe))(!n.isConnected||!n.hasAttribute("lvt-fx:proxy-bridge"))&&r.cleanup();let t=i.querySelectorAll("[lvt-fx\\:proxy-bridge]");if(t.length!==0)for(let n of t){let r=n.getAttribute("lvt-fx:proxy-bridge");if(!r){console.warn(`lvt-fx:proxy-bridge requires an action name, got: ${JSON.stringify(r)}`);continue}let o=pe.get(n);if(o&&o.action===r){o.updateSend(e),o.sync();continue}if(o&&o.cleanup(),pe.size>0){console.warn("lvt-fx:proxy-bridge: external mode expects exactly one bridge; ignoring an additional one (shared page metrics would collide).");continue}let s=Wi(n,r,e);pe.set(n,s),s.sync()}}function qi(i){for(let[e,t]of Array.from(pe))i.contains(e)&&t.cleanup()}function Wi(i,e,t){let n=t,r=null,o=null,s=i.querySelector("iframe"),a=i.querySelector("[data-pin-layer]"),c="";try{s&&s.src&&(c=new URL(s.src).origin)}catch{c=""}c||console.warn("lvt-fx:proxy-bridge: could not resolve the iframe origin; ignoring all postMessage traffic");let l=()=>{let u=Ve;a&&u&&u.docW>0&&u.docH>0&&(a.style.width=u.docW+"px",a.style.height=u.docH+"px",a.style.transform=`translate(${-u.scrollX}px, ${-u.scrollY}px)`)},d=u=>{if(!c||u.origin!==c)return;let p=u.data;if(!(!p||p.__prereview!==!0)&&(Ve={scrollX:Number(p.scrollX)||0,scrollY:Number(p.scrollY)||0,docW:Number(p.docW)||0,docH:Number(p.docH)||0},l(),p.type==="nav")){let v=typeof p.url=="string"?p.url:"";v!==r&&(r=v,n({action:e,data:{url:v}}))}};return window.addEventListener("message",d),{action:e,cleanup:()=>{window.removeEventListener("message",d),pe.delete(i),Ve=null},updateSend:u=>{n=u},sync:()=>{l();let u=i.getAttribute("data-focus-token");if(!u||u===o)return;o=u;let p=s?.contentWindow;if(!p||!c)return;let v=i.getAttribute("data-focus-url")||"",E=parseFloat(i.getAttribute("data-focus-y")||"");try{p.postMessage({__prereviewFocus:!0,url:v,y:Number.isFinite(E)?E:0},c)}catch{}}}}function zi(i,e,t){let n=t,r=Rn(i,Fi,"lvt-fx:region-select",o=>{let s=Ki(i,o);s&&n({action:e,data:s})});return{action:e,cleanup:()=>{r.cleanup(),He.delete(i)},updateSend:o=>{n=o}}}var Ve=null;function ji(i){let e=i.previousElementSibling;return e instanceof HTMLIFrameElement?e:i.parentElement?.querySelector("iframe")??null}function Ki(i,e){let t=i.getAttribute("data-surface");if(t==="html"){let n=ji(i),r=n?.contentDocument;if(!n||!r)return null;let o=n.getBoundingClientRect();return $t(r.querySelectorAll("[data-from]"),e,o.left,o.top,Dn)}if(t==="code"){let n=i.parentElement||document;return $t(n.querySelectorAll("[data-line]"),e,0,0,Hn)}return t==="page"?In(i,e):(console.warn(`lvt-fx:region-select: unknown data-surface ${JSON.stringify(t)} (expected "html", "code", or "page")`),null)}function In(i,e){let t=Ve;if(!t||t.docW<=0||t.docH<=0)return null;let n=i.getBoundingClientRect();if(n.width<=0||n.height<=0||e.w<=0||e.h<=0)return null;let r=t.scrollX+e.x*n.width,o=t.scrollY+e.y*n.height;return{x:je(r/t.docW),y:je(o/t.docH),w:je(e.w*n.width/t.docW),h:je(e.h*n.height/t.docH)}}function je(i){return!Number.isFinite(i)||i<0?0:i>1?1:i}function Dn(i){let e=parseInt(i.getAttribute("data-from")||"",10);if(!Number.isFinite(e)||e<=0)return null;let t=parseInt(i.getAttribute("data-to")||"",10);return{from:e,to:Number.isFinite(t)&&t>=e?t:e}}function Hn(i){let e=parseInt(i.getAttribute("data-line")||"",10);return!Number.isFinite(e)||e<=0?null:i.getAttribute("data-side")==="old"?{from:e,to:e,side:"old"}:{from:e,to:e}}function $t(i,e,t,n,r){let o=[];for(let l of Array.from(i)){let d=l.getBoundingClientRect(),h=d.top+n,u=d.bottom+n,p=d.left+t;if(d.right+te.right||ue.bottom)continue;let E=r(l);E&&o.push({top:h,range:E})}if(o.length===0)return null;o.sort((l,d)=>l.top-d.top);let s=o[0].range.side,a=1/0,c=-1/0;for(let{range:l}of o)l.side===s&&(l.fromc&&(c=l.to));return s?{from:a,to:c,side:s}:{from:a,to:c}}function Ke(i,e,t){return!Number.isFinite(i)||it?t:i}});var Bt=_(Ye=>{"use strict";Object.defineProperty(Ye,"__esModule",{value:!0});Ye.debounce=Vi;Ye.throttle=Gi;function Vi(i,e){let t=null;return function(...r){let o=this;t!==null&&clearTimeout(t),t=window.setTimeout(()=>{i.apply(o,r)},e)}}function Gi(i,e){let t=!1;return function(...r){let o=this;t||(i.apply(o,r),t=!0,setTimeout(()=>{t=!1},e))}}});var Ut=_(Pe=>{"use strict";Object.defineProperty(Pe,"__esModule",{value:!0});Pe.redactActionData=Xi;Pe.redactFormData=Ji;Pe.hydrateRedactedTokens=Qi;var Yi="lvt-redact";function Pn(i,e){return`${Yi}:${i}:${e}`}function Nn(i){return(i??(typeof document<"u"?document:null))?.querySelector?.("[data-lvt-id]")?.getAttribute("data-lvt-id")||"lvt-unknown"}function Fn(i){if(i?.storage)return i.storage;try{return typeof localStorage<"u"?localStorage:null}catch{return null}}function $n(i){return i instanceof HTMLInputElement||i instanceof HTMLTextAreaElement||i instanceof HTMLSelectElement}function Bn(i){let e=[];return i.hasAttribute("data-lvt-redact")&&e.push(i),i.querySelectorAll?.("[data-lvt-redact]").forEach(t=>e.push(t)),e}function Un(i,e,t){let n=Fn(e),r=n?e?.scope??Nn(i.ownerDocument):null;for(let o of Bn(i)){let s=o.getAttribute("data-lvt-redact");if(!s||!$n(o))continue;if(n&&r)try{n.setItem(Pn(r,s),o.value)}catch{}let a=o.getAttribute("name")||s;t(a,{redacted:!0,field:s})}}function Xi(i,e,t){Un(i,t,(n,r)=>{e[n]=r})}function Ji(i,e,t){Un(i,t,(n,r)=>{e.set(n,JSON.stringify(r))})}function Qi(i,e){let t=Fn(e);if(!t)return;let n=e?.scope??Nn(i.ownerDocument),r=new Map,o=a=>{if(r.has(a))return r.get(a);let c=null;try{c=t.getItem(Pn(n,a))}catch{c=null}return r.set(a,c),c},s=i.ownerDocument?.activeElement??null;for(let a of Bn(i)){if(a===s)continue;let c=a.getAttribute("data-lvt-redact");if(!c)continue;let l=o(c);l!==null&&($n(a)?a.value=l:a.textContent=l)}}});var qn=_(qt=>{"use strict";Object.defineProperty(qt,"__esModule",{value:!0});qt.lvtSelector=Zi;function Zi(i,e){let t=i.replace(/:/g,"\\:");if(e===void 0)return`[${t}]`;let n=e.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return`[${t}="${n}"]`}});var Je=_(Xe=>{"use strict";Object.defineProperty(Xe,"__esModule",{value:!0});Xe.hasNoInterceptOptOut=eo;Xe._resetLegacyNoInterceptWarned=to;var Wt=!1;function eo(i,e,t){return i.hasAttribute(e)?!0:i.hasAttribute("lvt-no-intercept")?(Wt||(Wt=!0,t.warn(`lvt-no-intercept is deprecated; use ${e}. The shim will be removed in v0.9.0.`)),!0):!1}function to(){Wt=!1}});var Vn=_(te=>{"use strict";Object.defineProperty(te,"__esModule",{value:!0});te.EventDelegator=te.DELEGATED_EVENT_TYPES=void 0;var Qe=Bt(),Wn=Ut(),zn=qn(),fe=ue(),no=Je(),Kn={reset:"reset",addclass:"addClass",removeclass:"removeClass",toggleclass:"toggleClass",setattr:"setAttr",toggleattr:"toggleAttr"},ro=Object.keys(Kn),io=new Set(["mouseenter","mouseleave","focus","blur"]),jn="application/x-lvt-key",oo=new Set(["dragstart","dragover","drop","dragend","dragenter","dragleave"]);te.DELEGATED_EVENT_TYPES=["click","submit","change","input","search","keydown","keyup","focus","blur","mouseenter","mouseleave","dragstart","dragover","drop","dragend","dragenter","dragleave"];var zt=class{constructor(e,t){this.context=e,this.logger=t,this.warnedEmitSubmitterGETForms=new WeakSet}teardownForWrapper(e){if(e)for(let t of te.DELEGATED_EVENT_TYPES){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=te.DELEGATED_EVENT_TYPES,n=e.getAttribute("data-lvt-id"),r=this.context.getRateLimitedHandlers();t.forEach(o=>{let s=`__lvt_delegated_${o}_${n}`,a=document[s];a&&document.removeEventListener(o,a,!1);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let h=l.target;if(this.logger.debug("Event listener triggered:",o,l.target),!h)return;let u=h,p=!1;for(;u;){if(u===d){p=!0;break}u=u.parentElement}if(!p)return;let v=`lvt-on:${o}`;for(u=h;u&&u!==d.parentElement;){let E=u.getAttribute(v),T=u,R=!1;if(!E&&o==="submit"&&u instanceof HTMLFormElement){let g=u.getAttribute("lvt-persist");g&&(E=`persist:${g}`,T=u)}if(!E&&o==="click"){let g=u instanceof HTMLButtonElement?u:null;g&&g.name&&!g.disabled&&g.type!=="reset"&&g.form===null&&!g.hasAttribute("commandfor")&&(E=g.name,T=g,R=!0)}if(!E&&o==="submit"&&u instanceof HTMLFormElement)if((0,no.hasNoInterceptOptOut)(u,"lvt-form:no-intercept",this.logger)){if(u.hasAttribute("lvt-form:emit-submitter")){let g=l.submitter;if(g?.name){u.method==="get"&&!this.warnedEmitSubmitterGETForms.has(u)&&(this.logger.warn('lvt-form:emit-submitter on a GET form serializes lvt-submitter into the URL query string, polluting browser history and any shared/bookmarked URLs. Use method="POST" or remove the directive if URL pollution is unacceptable.',u),this.warnedEmitSubmitterGETForms.add(u));let S=u.querySelector('input[type="hidden"][name="lvt-submitter"]');S||(S=document.createElement("input"),S.type="hidden",S.name="lvt-submitter",u.appendChild(S)),S.value=g.name}else u.querySelector('input[type="hidden"][name="lvt-submitter"]')?.remove()}}else{let g=u.getAttribute("lvt-form:action"),S=l.submitter;g?E=g:S instanceof HTMLButtonElement&&S.name?E=S.name:u.getAttribute("name")?E=u.getAttribute("name"):E="submit",T=u,S&&(u.__lvtSubmitter=S);let O=u.closest("dialog");O&&u.getAttribute("method")?.toLowerCase()==="dialog"&&(u.__lvtCloseDialog=O)}if(E!=null&&T){if(o==="submit"&&l.preventDefault(),oo.has(o)){let f=l;if(o==="dragstart"&&f.dataTransfer){let k=T.closest("[data-key]")?.getAttribute("data-key")??"";f.dataTransfer.setData(jn,k),f.dataTransfer.effectAllowed="move"}else if(o==="dragover")f.preventDefault(),f.dataTransfer&&(f.dataTransfer.dropEffect="move");else if(o==="drop")f.preventDefault();else if(o==="dragenter"||o==="dragleave"){let A=f.relatedTarget;if(A&&T.contains(A))return}if(E==="")return}if((o==="keydown"||o==="keyup")&&T.hasAttribute("lvt-key")){let f=T.getAttribute("lvt-key");if(f&&l.key!==f){u=u.parentElement;continue}}let g=T,S=()=>{this.logger.debug("handleAction called",{action:E,eventType:o,targetElement:g});let f={action:E,data:{}};if(g instanceof HTMLFormElement){this.logger.debug("Processing form element");let k=new FormData(g),y=Array.from(g.querySelectorAll('input[type="checkbox"][name]')),w=new Map;y.forEach(I=>{let m=w.get(I.name)||[];m.push(I),w.set(I.name,m)}),w.forEach((I,m)=>{I.length===1?f.data[m]=I[0].checked:f.data[m]=I.filter(b=>b.checked).map(b=>b.value)});let F=new Set(Array.from(g.querySelectorAll('input[type="password"][name]')).map(I=>I.name)),N=g.__lvtSubmitter?.name;k.forEach((I,m)=>{I instanceof File||N&&m===N||w.has(m)||(F.has(m)?f.data[m]=I:f.data[m]=this.context.parseValue(I))});let q=g.__lvtSubmitter;q&&(this.extractButtonData(q,f.data),q.name&&(f.submitter=q.name),delete g.__lvtSubmitter),this.logger.debug("Form data collected:",f.data)}else if(o==="change"||o==="input"||o==="search"){if(g instanceof HTMLInputElement){let k=g.name||"value";f.data[k]=this.context.parseValue(g.value)}else if(g instanceof HTMLSelectElement){let k=g.name||"value";f.data[k]=this.context.parseValue(g.value)}else if(g instanceof HTMLTextAreaElement){let k=g.name||"value";f.data[k]=this.context.parseValue(g.value)}}if(R&&this.extractButtonData(T,f.data),!(g instanceof HTMLFormElement)&&!R&&Array.from(T.attributes).forEach(k=>{if(k.name.startsWith("data-")&&k.name!=="data-key"&&k.name!=="data-lvt-id"){let y=k.name.slice(5);f.data[y]=this.context.parseValue(k.value)}}),o==="drop"){let k=l.dataTransfer?.getData(jn);k&&(f.data.dragSourceKey=k);let y=T.closest("[data-key]")?.getAttribute("data-key");y&&(f.data.dragTargetKey=y)}let A=null;if(o==="submit"&&g instanceof HTMLFormElement){let k=g.querySelectorAll('input[type="file"]:not([lvt-upload])');if(Array.from(k).some(w=>w.files&&w.files.length>0)){let w=l.submitter;A=new FormData(g),w?.name&&A.set(w.name,w.value),A.set("lvt-action",E),w?.name&&A.set("lvt-submitter",w.name)}}if(o==="submit"&&g instanceof HTMLFormElement){let y=l.submitter,w=null;y&&y.hasAttribute("lvt-form:disable-with")&&(w=y.textContent,y.disabled=!0,y.textContent=y.getAttribute("lvt-form:disable-with"),this.logger.debug("Disabled submit button")),this.context.setActiveSubmission(g,y||null,w),g.querySelectorAll('input[type="file"][lvt-upload]').forEach($=>{let N=$.getAttribute("lvt-upload");N&&(this.logger.debug("Triggering pending uploads for:",N),this.context.triggerPendingUploads(N))}),g.dispatchEvent(new CustomEvent("lvt:pending",{detail:f})),this.logger.debug("Emitted lvt:pending event")}if(this.logger.debug("About to send message:",f),this.logger.debug("WebSocket state:",this.context.getWebSocketReadyState()),A!==null){this.logger.debug("Tier 1 file upload detected, using HTTP fetch"),(0,Wn.redactFormData)(g,A),this.context.sendHTTPMultipart(g,E,A);return}if((0,Wn.redactActionData)(g,f.data),this.context.send(f),this.logger.debug("send() called"),g instanceof HTMLFormElement){let k=g.__lvtCloseDialog;k&&(k.close(),delete g.__lvtCloseDialog)}},O=T.getAttribute("lvt-mod:throttle"),H=T.getAttribute("lvt-mod:debounce");if((O||H)&&o!=="search"){r.has(T)||r.set(T,new Map);let f=r.get(T),A=`${o}:${E}`,k=`__lvt_callback_${A}`,y=T;y[k]||(y[k]={current:S}),y[k].current=S;let w=f.get(A);if(!w){let F=()=>y[k].current();if(O){let $=parseInt(O,10);w=(0,Qe.throttle)(F,$)}else if(H){let $=parseInt(H,10);w=(0,Qe.debounce)(F,$)}w&&f.set(A,w)}w&&w()}else S();return}u=u.parentElement}};document[s]=c,document.addEventListener(o,c,!1),this.logger.debug("Registered event listener:",o,"with key:",s)})}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(o=>{let s=`__lvt_window_${o}_${n}`,a=window[s];a&&window.removeEventListener(o,a);let c=l=>{let d=this.context.getWrapperElement();if(!d)return;let h=`lvt-on:window:${o}`;d.querySelectorAll((0,zn.lvtSelector)(h)).forEach(p=>{let v=p.getAttribute(h);if(!v)return;if((o==="keydown"||o==="keyup")&&p.hasAttribute("lvt-key")){let S=p.getAttribute("lvt-key");if(S&&l.key!==S)return}let E={action:v,data:{}};Array.from(p.attributes).forEach(S=>{if(S.name.startsWith("data-")&&S.name!=="data-key"&&S.name!=="data-lvt-id"){let O=S.name.slice(5);E.data[O]=this.context.parseValue(S.value)}});let T=p.getAttribute("lvt-mod:throttle"),R=p.getAttribute("lvt-mod:debounce"),g=()=>this.context.send(E);if(T||R){r.has(p)||r.set(p,new Map);let S=r.get(p),O=`window-${o}:${v}`,H=S.get(O);if(!H){if(T){let J=parseInt(T,10);H=(0,Qe.throttle)(g,J)}else if(R){let J=parseInt(R,10);H=(0,Qe.debounce)(g,J)}H&&S.set(O,H)}H&&H()}else g()})};window[s]=c,window.addEventListener(o,c)})}setupClickAwayDelegation(){let e=this.context.getWrapperElement();if(!e)return;let n=`__lvt_click_away_${e.getAttribute("data-lvt-id")}`,r=document[n];r&&document.removeEventListener("click",r);let o=s=>{let a=this.context.getWrapperElement();if(!a)return;let c=s.target,l=ro.map(h=>(0,zn.lvtSelector)(`lvt-el:${h}:on:click-away`)).join(", ");a.querySelectorAll(l).forEach(h=>{h.contains(c)||Array.from(h.attributes).forEach(u=>{if(!u.name.includes(":on:click-away"))return;let p=u.name.match(/^lvt-el:(\w+):on:click-away$/);if(!p)return;let v=Kn[p[1].toLowerCase()];v&&(0,fe.executeAction)((0,fe.resolveTarget)(h),v,u.value)})})};document[n]=o,document.addEventListener("click",o)}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}`,o=t[r]||new Set,s=`__lvt_el_listeners_${n}`,a=(t[s]||[]).filter(d=>d.el.isConnected),c=e||t,l=d=>{let h=new Set;for(let u of d.attributes){if(!u.name.startsWith("lvt-el:"))continue;let p=u.name.match(/^lvt-el:\w+:on:([a-z-]+)$/i);if(!p)continue;let v=p[1].toLowerCase();(0,fe.isDOMEventTrigger)(v)&&h.add(v)}for(let u of h)if(io.has(u)){let p=`__lvt_el_${u}`;if(d[p])continue;let v=()=>(0,fe.processElementInteraction)(d,u);d.addEventListener(u,v),d[p]=v,a.push({el:d,event:u,handler:v,guardKey:p})}else if(!o.has(u)){let p=u.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),v=new RegExp(`^lvt-el:\\w+:on:${p}$`,"i"),E=T=>{let R=T.target;for(;R&&R!==t;){let g=!1;for(let S of R.attributes)if(v.test(S.name)){g=!0;break}if(g){(0,fe.processElementInteraction)(R,u);return}R=R.parentElement}R===t&&(0,fe.processElementInteraction)(t,u)};t.addEventListener(u,E),o.add(u),a.push({el:t,event:u,handler:E})}};l(c),c.querySelectorAll("*").forEach(l),t[s]=a,t[r]=o}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:s,event:a,handler:c,guardKey:l})=>{s.removeEventListener(a,c),l&&delete s[l]}),delete e[n]);let o=`__lvt_el_delegated_${t}`;delete e[o]}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 o=a=>{let c=["a[href]:not([disabled])","button:not([disabled])","textarea:not([disabled])",'input:not([disabled]):not([type="hidden"])',"select:not([disabled])",'[tabindex]:not([tabindex="-1"]):not([disabled])','[contenteditable="true"]'].join(", ");return Array.from(a.querySelectorAll(c)).filter(l=>{let d=l,h=window.getComputedStyle(d),u=h.display!=="none",p=h.visibility!=="hidden",v=d.offsetParent!==null||h.position==="fixed"||h.position==="absolute"||typeof process<"u"&&!1;return u&&p&&v})},s=a=>{if(a.key!=="Tab")return;let c=this.context.getWrapperElement();if(!c)return;let l=c.querySelectorAll("[lvt-focus-trap]"),d=null;if(l.forEach(v=>{v.contains(document.activeElement)&&(!d||v.contains(d))&&(d=v)}),d||l.forEach(v=>{let E=v,T=window.getComputedStyle(E);T.display!=="none"&&T.visibility!=="hidden"&&(d=v)}),!d)return;let h=o(d);if(h.length===0)return;let u=h[0],p=h[h.length-1];a.shiftKey?document.activeElement===u&&(a.preventDefault(),p.focus()):document.activeElement===p&&(a.preventDefault(),u.focus())};document[n]=s,document.addEventListener("keydown",s),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 o=()=>{let a=this.context.getWrapperElement();if(!a)return;a.querySelectorAll("[lvt-autofocus]").forEach(l=>{let d=l,h=window.getComputedStyle(d),u=h.display!=="none",p=h.visibility!=="hidden",v=d.offsetParent!==null||h.position==="fixed"||h.position==="absolute"||d.tagName==="BODY"||typeof process<"u"&&!1,E=u&&p&&v,T=d.getAttribute("data-lvt-autofocused")==="true";E&&!T?(d.setAttribute("data-lvt-autofocused","true"),requestAnimationFrame(()=>{d.focus(),this.logger.debug("Autofocused element:",d.tagName,d.id||d.getAttribute("name"))})):!E&&T&&d.removeAttribute("data-lvt-autofocused")})};o();let s=new MutationObserver(a=>{let c=!1;a.forEach(l=>{l.type==="childList"&&l.addedNodes.length>0&&l.addedNodes.forEach(d=>{d instanceof Element&&(d.hasAttribute("lvt-autofocus")||d.querySelector("[lvt-autofocus]"))&&(c=!0)}),l.type==="attributes"&&(l.target.hasAttribute("lvt-autofocus")||l.attributeName==="hidden"||l.attributeName==="style"||l.attributeName==="class")&&(c=!0)}),c&&o()});s.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["hidden","style","class","lvt-autofocus"]}),e[n]=s,this.logger.debug("Autofocus delegation set up")}};te.EventDelegator=zt});var jt=_(re=>{"use strict";Object.defineProperty(re,"__esModule",{value:!0});re.safeMatchesPopoverOpen=Gn;re.openFromHash=Zn;re.isHashLinkTarget=lo;re.activateHashTarget=co;re.setupHashLink=uo;re.teardownHashLink=ho;function Gn(i){try{return i.matches(":popover-open")}catch{return!1}}var so=[{matches:i=>i instanceof HTMLDialogElement,isOpen:i=>i.open,open:i=>i.showModal(),close:i=>i.close()},{matches:i=>i instanceof HTMLElement&&i.hasAttribute("popover"),isOpen:i=>Gn(i),open:i=>{typeof i.showPopover=="function"&&i.showPopover()},close:i=>{typeof i.hidePopover=="function"&&i.hidePopover()}},{matches:i=>i instanceof HTMLDetailsElement,isOpen:i=>i.open,open:i=>{i.open=!0},close:i=>{i.open=!1}}];function ne(i){return so.find(e=>e.matches(i))}var ao=new Set(["show-modal","show-popover"]);function Yn(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[command][commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("command");if(!n)return;let r=t.getAttribute("commandfor");if(!r)return;let o=document.getElementById(r);if(!o)return;let s=ne(o);if(s){if(ao.has(n)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}else if(n==="toggle-popover"&&!s.isOpen(o)){if(location.hash==="#"+r)return;history.pushState(null,"","#"+r)}}}function Xn(i){let e=i.target;e instanceof Element&&e.id&&ne(e)&&location.hash==="#"+e.id&&history.replaceState(null,"",location.pathname+location.search)}function Jn(i){let e=i.target;if(!(e instanceof Element)||!e.id)return;let t=ne(e);if(t)if(t.isOpen(e)){if(location.hash==="#"+e.id)return;history.pushState(null,"","#"+e.id)}else{if(location.hash!=="#"+e.id)return;history.replaceState(null,"",location.pathname+location.search)}}function Qn(){let i=location.hash.slice(1);if(document.querySelectorAll("dialog, [popover]").forEach(e=>{let t=ne(e);t&&t.isOpen(e)&&e.id!==i&&t.close(e)}),i){let e=document.getElementById(i);if(e){let t=ne(e);t&&!t.isOpen(e)&&t.open(e)}}}function Zn(){let i=location.hash.slice(1);if(!i)return;let e=document.getElementById(i);if(!e)return;let t=ne(e);t&&(t.isOpen(e)||t.open(e))}function lo(i){let e=document.getElementById(i);return e?!!ne(e):!1}function co(i){let e=document.getElementById(i);if(!e)return;let t=ne(e);!t||t.isOpen(e)||(history.pushState(null,"","#"+i),t.open(e))}var Ze=!1;function uo(){Ze||(Ze=!0,document.addEventListener("click",Yn),document.addEventListener("close",Xn,!0),document.addEventListener("toggle",Jn,!0),window.addEventListener("popstate",Qn),Zn())}function ho(){Ze&&(Ze=!1,document.removeEventListener("click",Yn),document.removeEventListener("close",Xn,!0),document.removeEventListener("toggle",Jn,!0),window.removeEventListener("popstate",Qn))}});var tr=_(et=>{"use strict";Object.defineProperty(et,"__esModule",{value:!0});et.LinkInterceptor=void 0;var po=Je(),er=jt(),Kt=class{constructor(e,t){this.context=e,this.logger=t,this.popstateListener=null,this.abortController=null,this.currentHref=window.location.href}teardownForWrapper(e){if(this.abortController?.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 o=s=>{let a=s.target?.closest("a[href]");if(!a)return;let c=this.context.getWrapperElement();if(!(!c||!c.contains(a))&&!this.shouldSkip(a)){if(a.pathname===window.location.pathname&&a.search===window.location.search&&a.hash){let l=a.hash.slice(1);l&&(0,er.isHashLinkTarget)(l)&&(s.preventDefault(),(0,er.activateHashTarget)(l));return}s.preventDefault(),this.navigate(a.href)}};document.addEventListener("click",o),document[n]=o,this.popstateListener||(this.popstateListener=()=>{let s=this.currentHref;this.currentHref=window.location.href,this.navigate(window.location.href,!1,s)},window.addEventListener("popstate",this.popstateListener))}shouldSkip(e){if(e.origin!==window.location.origin||e.target&&e.target!=="_self"||e.hasAttribute("download")||(0,po.hasNoInterceptOptOut)(e,"lvt-nav:no-intercept",this.logger))return!0;let t=e.protocol;return t!=="http:"&&t!=="https:"}async navigate(e,t=!0,n=window.location.href){let r=new URL(e,window.location.origin),o=new URL(n,window.location.origin);if(r.origin===o.origin&&r.pathname===o.pathname){if(r.search===o.search){this.abortController?.abort(),this.abortController=null;return}if(t&&this.context.canSendNavigate()&&(this.abortController?.abort(),this.abortController=null,this.context.sendNavigate(e))){window.history.pushState(null,"",e),this.currentHref=e;return}}this.abortController?.abort(),this.abortController=new AbortController;try{let a=await fetch(e,{credentials:"include",headers:{Accept:"text/html"},signal:this.abortController.signal});if(!a.ok){window.location.href=e;return}let c=await a.text();t&&window.history.pushState(null,"",e),this.currentHref=e,this.context.handleNavigationResponse(c,e)}catch(a){if(a instanceof DOMException&&a.name==="AbortError")return;window.location.href=e}}};et.LinkInterceptor=Kt});var nr=_(nt=>{"use strict";Object.defineProperty(nt,"__esModule",{value:!0});nt.ObserverManager=void 0;var tt=class i{constructor(e,t){this.context=e,this.logger=t,this.infiniteScrollObserver=null,this.mutationObserver=null,this.observedSentinel=null,this.updatedListener=null,this.updatedListenerWrapper=null,this.loadMorePending=!1,this.loadMoreTimeoutId=null}setupInfiniteScrollObserver(){let e=this.context.getWrapperElement();if(!e)return;this.ensureUpdatedListener(e);let t=e.querySelector("[lvt-scroll-sentinel]");if(!t){this.infiniteScrollObserver&&(this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=null,this.observedSentinel=null),this.releaseLoadMore();return}this.infiniteScrollObserver&&this.observedSentinel===t||(this.infiniteScrollObserver&&this.infiniteScrollObserver.disconnect(),this.infiniteScrollObserver=new IntersectionObserver(n=>{if(n[0].isIntersecting){if(this.loadMorePending){this.logger.debug("Sentinel visible but load_more already pending, skipping");return}this.loadMorePending=!0,this.armLoadMoreTimeout(),this.logger.debug("Sentinel visible, sending load_more action"),this.context.send({action:"load_more"})}},{rootMargin:"200px"}),this.infiniteScrollObserver.observe(t),this.observedSentinel=t,this.logger.debug("Observer set up successfully"))}ensureUpdatedListener(e){this.updatedListener&&this.updatedListenerWrapper===e||(this.updatedListener&&this.updatedListenerWrapper&&this.updatedListenerWrapper.removeEventListener("lvt:updated",this.updatedListener),this.updatedListener=t=>{t.detail?.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 ${i.LOAD_MORE_TIMEOUT_MS}ms; releasing throttle`),this.loadMoreTimeoutId=null,this.loadMorePending=!1,this.observedSentinel=null,this.setupInfiniteScrollObserver()},i.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()}};nt.ObserverManager=tt;tt.LOAD_MORE_TIMEOUT_MS=3e4});var rr=_(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.LoadingIndicator=void 0;var Vt=class{constructor(){this.bar=null,this.actionTimer=null,this.pendingCount=0,this.pendingHandler=null,this.updatedHandler=null,this.currentDebounceMs=null}show(){if(this.bar)return;let e=document.createElement("div");if(e.className="lvt-loading-bar",e.style.cssText=` position: fixed; top: 0; left: 0; @@ -26,9 +26,9 @@ 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } } - `,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}enablePerActionIndicator(e){if(this.pendingHandler){if(this.currentDebounceMs===e)return;this.disablePerActionIndicator()}this.pendingCount=0,this.currentDebounceMs=e,this.pendingHandler=()=>{this.pendingCount++,this.pendingCount===1&&this.actionTimer===null&&this.bar===null&&(this.actionTimer=setTimeout(()=>{this.actionTimer=null,this.pendingCount>0&&this.show()},e))},this.updatedHandler=()=>{this.pendingCount=Math.max(0,this.pendingCount-1),this.pendingCount===0&&(this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.hide())},document.addEventListener("lvt:pending",this.pendingHandler,!0),document.addEventListener("lvt:updated",this.updatedHandler,!0)}disablePerActionIndicator(){this.pendingHandler&&(document.removeEventListener("lvt:pending",this.pendingHandler,!0),this.pendingHandler=null),this.updatedHandler&&(document.removeEventListener("lvt:updated",this.updatedHandler,!0),this.updatedHandler=null),this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.pendingCount=0,this.currentDebounceMs=null,this.hide()}};Je.LoadingIndicator=Ut});var Yn=L(Qe=>{"use strict";Object.defineProperty(Qe,"__esModule",{value:!0});Qe.FormDisabler=void 0;var qt=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(o=>{o.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(o=>{o.disabled=!1})})}};Qe.FormDisabler=qt});var Jn=L(et=>{"use strict";Object.defineProperty(et,"__esModule",{value:!0});et.setupInvokerPolyfill=ji;et.teardownInvokerPolyfill=Ki;var Ze=!1;function Xn(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),o=document.getElementById(n);o&&(o instanceof HTMLDialogElement?r==="show-modal"&&!o.open?o.showModal():r==="close"&&o.open&&o.close():o instanceof HTMLElement&&o.hasAttribute("popover")&&(r==="show-popover"&&typeof o.showPopover=="function"?o.showPopover():r==="hide-popover"&&typeof o.hidePopover=="function"?o.hidePopover():r==="toggle-popover"&&typeof o.togglePopover=="function"&&o.togglePopover()))}function ji(){"commandForElement"in HTMLButtonElement.prototype||Ze||(Ze=!0,document.addEventListener("click",Xn))}function Ki(){Ze&&(document.removeEventListener("click",Xn),Ze=!1)}});var Zn=L(tt=>{"use strict";Object.defineProperty(tt,"__esModule",{value:!0});tt.setupScrollAway=Yi;tt.teardownScrollAway=Xi;var Vi=de(),pe="__lvt_scroll_away",Q=[];function Gi(){for(let i=Q.length-1;i>=0;i--){let e=Q[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[pe],Q.splice(i,1))}}function Yi(i){Gi();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"&&n!=="top"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=(0,Vi.resolveTarget)(t);if(!r||r===t){let h=t[pe];h&&(h.target.removeEventListener("scroll",h.handler),Qn(h),delete t[pe]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let o=t[pe];if(o){if(o.target===r)return;o.target.removeEventListener("scroll",o.handler),Qn(o)}let s=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),a=isNaN(s)?200:s,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>a?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[pe]=d,Q.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function Qn(i){let e=Q.indexOf(i);e!==-1&&Q.splice(e,1)}function Xi(i){for(let e=Q.length-1;e>=0;e--){let t=Q[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[pe],Q.splice(e,1))}}});var sr=L(rt=>{"use strict";Object.defineProperty(rt,"__esModule",{value:!0});rt.setupSpy=no;rt.teardownSpy=ro;var er="lvt-active",zt="__lvt_spy",ge="__lvt_spy_link_handler",z=[],tr=new WeakSet;function Ji(){for(let i=z.length-1;i>=0;i--){let e=z[i];e.container.isConnected||(jt(e),z.splice(i,1))}if(z.length===0){let i=document[ge];i&&(document.removeEventListener("click",i),delete document[ge])}}function jt(i){fe(i,null),i.scrollTarget.removeEventListener("scroll",i.scrollHandler),window.removeEventListener("resize",i.resizeHandler),delete i.container[zt]}function Wt(i){let e=getComputedStyle(i).getPropertyValue("--lvt-spy-margin").trim(),t=Math.round(window.innerHeight*.25);if(!e)return t;let n=parseFloat(e);return isNaN(n)?t:e.endsWith("vh")?Math.round(n/100*window.innerHeight):e.endsWith("px")||/^-?\d+(\.\d+)?$/.test(e)?n:(console.warn(`lvt-spy: unsupported --lvt-spy-margin unit ${JSON.stringify(e)}; supported units are vh and px (or unitless). Falling back to 25vh.`),t)}function ir(i){let e=i.getAttribute("lvt-spy");if(e&&e.trim()!=="")try{return Array.from(i.querySelectorAll(e))}catch(t){return console.warn(`lvt-spy: invalid selector ${JSON.stringify(e)}:`,t),[]}return[i]}function fe(i,e){for(let t of i.links){let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";e!==null&&r===e?t.classList.add(er):t.classList.remove(er)}}function or(i){let e=new Set;for(let n of i.targets)n.id&&e.add(n.id);let t=[];document.querySelectorAll("[lvt-spy-link]").forEach(n=>{let r=n.getAttribute("href")||"",o=r.startsWith("#")?r.slice(1):"";e.has(o)&&t.push(n)}),i.links=t}function Qi(i){for(let e of z)for(let t of e.targets)if(t.id===i)return e;return null}function nt(i,e){let t=null;for(let n of i){if(!n.id)continue;n.getBoundingClientRect().top<=e&&(t=n.id)}return t}function Zi(i){let e=i.parentElement;for(;e&&e!==document.documentElement;){let t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="overlay")return e;e=e.parentElement}return window}function eo(i,e){if(i.length!==e.length)return!1;for(let t=0;t!s.id&&!tr.has(s));if(n.length>0){console.warn(`lvt-spy: ${n.length} target(s) without an id attribute; they cannot be linked from [lvt-spy-link]. Add id="..." or drop them from the selector. First offender:`,n[0]);for(let s of n)tr.add(s)}let r={container:i,targets:t,marginPx:Wt(i),links:[],scrollTarget:Zi(i),scrollHandler:()=>{},resizeHandler:()=>{}};or(r);let o=!1;r.scrollHandler=()=>{o||(o=!0,requestAnimationFrame(()=>{o=!1,fe(r,nt(r.targets,r.marginPx))}))},r.resizeHandler=()=>{r.marginPx=Wt(r.container),fe(r,nt(r.targets,r.marginPx))},r.scrollTarget.addEventListener("scroll",r.scrollHandler,{passive:!0}),window.addEventListener("resize",r.resizeHandler,{passive:!0}),i[zt]=r,z.push(r),fe(r,nt(r.targets,r.marginPx))}function rr(i){let e=i[zt];if(e){let t=ir(i);if(eo(e.targets,t)){e.marginPx=Wt(i),or(e),fe(e,nt(e.targets,e.marginPx));return}jt(e);let n=z.indexOf(e);n!==-1&&z.splice(n,1),nr(i,t);return}nr(i)}function to(){if(document[ge])return;let i=e=>{let t=e.target?.closest("[lvt-spy-link]");if(!t)return;let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";if(!r)return;let o=Qi(r);o&&fe(o,r)};document.addEventListener("click",i,{passive:!0}),document[ge]=i}function no(i){Ji(),to(),i.hasAttribute("lvt-spy")&&rr(i),i.querySelectorAll("[lvt-spy]").forEach(rr)}function ro(i){for(let e=z.length-1;e>=0;e--){let t=z[e];i&&t.container.isConnected&&!i.contains(t.container)||(jt(t),z.splice(e,1))}if(z.length===0){let e=document[ge];e&&(document.removeEventListener("click",e),delete document[ge])}}});var lr=L(it=>{"use strict";Object.defineProperty(it,"__esModule",{value:!0});it.TreeRenderer=void 0;function ar(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function io(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function Kt(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(io(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Kt(r,e+1))return!0}return!1}function oo(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(Kt(i)&&!Kt(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var Vt=class{constructor(e){this.logger=e,this.treeState={},this.rangeState={},this.rangeIdKeys={}}applyUpdate(e,t){let n=!1,r=[],o=new Set;for(let[c,l]of Object.entries(e))if(Array.isArray(l)&&l.length>0&&Array.isArray(l[0])&&typeof l[0][0]=="string"){let h=this.treeState[c];h&&typeof h=="object"&&!Array.isArray(h)&&Array.isArray(h.d)&&Array.isArray(h.s)?t?.canApplyTargeted?.(h,c)===!0?(this.applyDifferentialOpsToRange(h,l,c),r.push({rangePath:c,ops:l,statics:h.s,idKey:h.m?.idKey}),o.add(c)):(this.treeState[c]=ar(h),this.applyDifferentialOpsToRange(this.treeState[c],l,c)):this.treeState[c]=l,n=!0}else{let h=this.treeState[c],u=typeof l=="object"&&l!==null&&!Array.isArray(l)?this.deepMergeTreeNodes(h,l,c):l;JSON.stringify(h)!==JSON.stringify(u)&&(this.treeState[c]=u,n=!0)}let a={html:this.reconstructFromTree(this.treeState,"",o.size>0?o:void 0),changed:n};return r.length>0&&(a.targetedOps=r),a}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}renderState(){return this.reconstructFromTree(this.treeState,"")}deepMergeTreeNodes(e,t,n=""){if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(oo(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[o,s]of Object.entries(t)){let a=n?`${n}.${o}`:o,c=Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string",l=r[o]&&typeof r[o]=="object"&&!Array.isArray(r[o])&&Array.isArray(r[o].d)&&Array.isArray(r[o].s);c&&l?(r[o]=ar(r[o]),this.logger.debug(`[deepMerge] Applying diff ops at path ${a}`,{ops:s,rangeItems:r[o].d?.length}),this.applyDifferentialOpsToRange(r[o],s,a)):typeof s=="object"&&s!==null&&!Array.isArray(s)&&typeof r[o]=="object"&&r[o]!==null&&!Array.isArray(r[o])?r[o]=this.deepMergeTreeNodes(r[o],s,a):r[o]=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}),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 o of t){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let a=o[1],c=this.findItemIndexByKey(r,a,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${a}, index=${c}, total=${r.length}`),c>=0?(r.splice(c,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${a} not found`);break}case"u":{let a=this.findItemIndexByKey(r,o[1],e.s,n),c=o[2];a>=0&&c&&(r[a]=this.mergeRangeItem(r[a],c,n));break}case"a":{let a=Array.isArray(o[1])?o[1]:[o[1]];o[2]&&(e.s=o[2]),r.push(...a),o[3]&&typeof o[3]=="object"&&o[3].idKey&&(this.rangeIdKeys[n]=o[3].idKey);break}case"p":{let a=Array.isArray(o[1])?o[1]:[o[1]];o[2]&&(e.s=o[2]),r.unshift(...a);break}case"i":{let a=this.findItemIndexByKey(r,o[1],e.s,n);if(a>=0){let c=Array.isArray(o[2])?o[2]:[o[2]];r.splice(a+1,0,...c)}break}case"o":{let a=o[1],c=[],l=new Map;for(let d of r){let h=this.getItemKey(d,e.s,n);h&&l.set(h,d)}for(let d of a){let h=l.get(d);h&&c.push(h)}r.length=0,r.push(...c);break}default:break}}this.rangeState[n]={items:r,statics:e.s}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let o=0;o`;continue}r+=this.renderValue(e[a],a,c)}}}return r=r.replace(//g,"").replace(/<\/root>/g,""),r}return this.renderValue(e,"",t)}renderValue(e,t,n){if(e==null||typeof e=="string"&&e.startsWith("{{")&&e.endsWith("}}"))return"";if(typeof e=="object"&&!Array.isArray(e)){if(e.d&&Array.isArray(e.d)&&e.s&&Array.isArray(e.s)){let s=n||t||"";return s&&(this.rangeState[s]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[s]=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),o=r.filter(s=>/^\d+$/.test(s)).sort((s,a)=>parseInt(s)-parseInt(a));if(o.length>0&&o.length===r.length)return o.map(s=>{let a=n?`${n}.${s}`:s;return this.renderValue(e[s],s,a)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,o)=>{let s=o.toString(),a=n?`${n}.${s}`:s;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,a):this.renderValue(r,s,a)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s:o}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let s="else",a=n?`${n}.else`:"else";return this.renderValue(e.else,s,a)}return""}return o&&Array.isArray(o)?r.map((s,a)=>this.renderRangeItem(s,a,o,n)).join(""):r.map((s,a)=>{let c=a.toString(),l=n?`${n}.${c}`:c;return this.renderValue(s,c,l)}).join("")}renderRangeItem(e,t,n,r){let o=n,s="";for(let a=0;a=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,a[1],o,t),d=a[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,a[1],a[2],n,!1),a[3]&&typeof a[3]=="object"&&a[3].idKey&&(this.rangeIdKeys[t||""]=a[3].idKey);break}case"p":{this.addItemsToRange(r,a[1],a[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,a[1],o,t);if(l>=0){let d=Array.isArray(a[2])?a[2]:[a[2]];r.splice(l+1,0,...d)}break}case"o":{let l=a[1],d=[],h=new Map;for(let u of r){let g=this.getItemKey(u,o,t);g&&h.set(g,u)}for(let u of l){let g=h.get(u);g&&d.push(g)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics},this.treeState[t]={d:r,s:n.statics};let s=this.getCurrentRangeStructure(t);return s&&s.s?this.renderItemsWithStatics(r,s.s,t):r.map(a=>this.renderValue(a)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n){let r=e.map((o,s)=>this.renderRangeItem(o,s,t,n)).join("");return this.logger.isDebugEnabled()&&(this.logger.debug("[renderItemsWithStatics] statics:",t),this.logger.debug("[renderItemsWithStatics] items count:",e.length),this.logger.debug("[renderItemsWithStatics] result snippet:",r.substring(0,200))),r}addItemsToRange(e,t,n,r,o){if(n&&(r.statics=n),!t)return;let s=Array.isArray(t)?t:[t];o?e.unshift(...s):e.push(...s)}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(o=>this.getItemKey(o,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};it.TreeRenderer=Vt});var cr=L(O=>{"use strict";var so=O&&O.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(O,"__esModule",{value:!0});O.RangeDomApplier=O.TARGETED_SKIP_ATTR=O.TARGETED_APPLIED_ATTR=void 0;var ao=so(At()),Gt=["data-key","data-lvt-key"],lo=Gt.map(i=>new RegExp(`(?:^|[\\s<])${i}\\s*=`));O.TARGETED_APPLIED_ATTR="data-lvt-targeted-applied";O.TARGETED_SKIP_ATTR="data-lvt-targeted-skip";var Yt=class{constructor(e){this.ctx=e,this.containerCache=new Map}invalidate(){this.containerCache.clear()}invalidatePath(e){this.containerCache.delete(e)}findContainer(e,t,n){let r=this.containerCache.get(t);if(r&&r.isConnected&&e.contains(r))return r;if(r&&this.containerCache.delete(t),n===void 0)return null;let o=this.findItemByKey(e,n);if(!o||!o.parentElement)return null;let s=o.parentElement;return this.containerCache.set(t,s),s}canApplyTargeted(e,t,n){if(!t||typeof t!="object")return{ok:!1,reason:"no range structure"};if(!Array.isArray(t.s)||t.s.length===0)return{ok:!1,reason:"no statics"};let r=[t.s];if(t.sm&&typeof t.sm=="object")for(let d of Object.values(t.sm))Array.isArray(d)&&r.push(d);if(!r.some(d=>this.staticsContainKeyAttribute(d)))return{ok:!1,reason:"no data-key attribute in statics"};let s=t.d;if(Array.isArray(s)){for(let d of s)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let a=this.extractItemKey(s?.[0],t),c=this.findContainer(e,n,a);if(!c)return{ok:!1,reason:"container not found in DOM"};let l=c;for(;l;){if(l.hasAttribute("lvt-ignore"))return{ok:!1,reason:"lvt-ignore ancestor"};if(l===e)break;l=l.parentElement}return{ok:!0,container:c,containerKey:a}}apply(e,t,n){let{rangePath:r,ops:o,statics:s}=t,a=this.firstKnownKey(o),c=this.findContainer(e,r,a);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of o){if(!Array.isArray(d)||d.length<1)continue;let h=d[0];try{let u=!0;switch(h){case"r":u=this.applyRemove(c,d[1]);break;case"u":u=this.applyUpdateRow(c,d[1],s,r,n);break;case"i":u=this.applyInsertAfter(c,d[1],d[2],s,r);break;case"a":u=this.applyAppend(c,d[1],s,r);break;case"p":u=this.applyPrepend(c,d[1],s,r);break;case"o":u=this.applyReorder(c,d[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${h}; falling back`),u=!1}u||(l=!1)}catch(u){return this.ctx.logger.error(`[RangeDomApplier] op ${h} failed for range ${r}`,u),null}}return l?(typeof window<"u"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,c):null}cleanupMarkers(e){e.querySelectorAll(`[${O.TARGETED_APPLIED_ATTR}]`).forEach(r=>r.removeAttribute(O.TARGETED_APPLIED_ATTR)),e.hasAttribute(O.TARGETED_APPLIED_ATTR)&&e.removeAttribute(O.TARGETED_APPLIED_ATTR),e.querySelectorAll(`[${O.TARGETED_SKIP_ATTR}]`).forEach(r=>r.removeAttribute(O.TARGETED_SKIP_ATTR)),e.hasAttribute(O.TARGETED_SKIP_ATTR)&&e.removeAttribute(O.TARGETED_SKIP_ATTR)}applyRemove(e,t){let n=this.findItemByKey(e,t);return n?(this.fireHookOnSubtree(n,"lvt-destroyed"),n.remove(),!0):(this.ctx.logger.debug(`[RangeDomApplier] r: row with key ${t} not found (idempotent no-op)`),!0)}applyUpdateRow(e,t,n,r,o){let s=this.findItemByKey(e,t);if(!s)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let a=this.indexOfChild(e,s),c=this.lookupCurrentItem(r,t);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let l=this.ctx.renderItem(c,a,n,r),d=this.parseSingleRow(l);return d?(o?(0,ao.default)(s,d,{...o,childrenOnly:!1}):(this.fireHookOnSubtree(s,"lvt-destroyed"),s.replaceWith(d),this.ctx.onNodeAdded?.(d),this.fireHookOnSubtree(d,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,o){let s=this.findItemByKey(e,t);return s?this.renderItemsAtomic(n,r,o,this.indexOfChild(e,s)+1,a=>e.insertBefore(a,s.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r){return this.renderItemsAtomic(t,n,r,e.children.length,o=>e.appendChild(o))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,o=>e.insertBefore(o,e.firstChild))}renderItemsAtomic(e,t,n,r,o){let s=Array.isArray(e)?e:[e],a=document.createDocumentFragment(),c=[];for(let l=0;l{for(let a of Gt){let c=s.getAttribute(a);if(c!==null){n.set(c,s);break}}});let r=document.createDocumentFragment(),o=new Set(t);for(let s of t){let a=n.get(s);a&&r.appendChild(a)}if(o.size~+*=^$|! \t\n\r]/.test(t)&&this.ctx.logger.warn(`[RangeDomApplier] CSS.escape unavailable; key "${t}" contains characters that need escaping. Lookup may miss the row.`),n=t.replace(/(["\\])/g,"\\$1"));for(let r of Gt){let o=e.querySelector(`[${r}="${n}"]`);if(o)return o}return null}indexOfChild(e,t){let n=0,r=e.firstElementChild;for(;r;){if(r===t)return n;n++,r=r.nextElementSibling}return-1}firstKnownKey(e){for(let t of e){if(!Array.isArray(t)||t.length<2)continue;let n=t[0];if(n==="r"||n==="u"||n==="i")return typeof t[1]=="string"?t[1]:void 0;if(n==="o"&&Array.isArray(t[1])&&t[1].length>0)return typeof t[1][0]=="string"?t[1][0]:void 0;if(n==="a"||n==="p"){let r=Array.isArray(t[1])?t[1]:[t[1]];for(let o of r)if(o&&typeof o=="object"&&o._k!==void 0)return String(o._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of lo)if(n.test(t))return!0}return!1}itemHasNestedRange(e){if(!e||typeof e!="object")return!1;for(let[t,n]of Object.entries(e))if(!t.startsWith("_")&&n&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.d)&&Array.isArray(r.s)||this.itemHasNestedRange(r))return!0}return!1}extractItemKey(e,t){if(!e||typeof e!="object")return;if(e._k!==void 0)return String(e._k);let n=t?.m?.idKey;if(n&&e[n]!==void 0)return String(e[n])}lookupCurrentItem(e,t){return this.ctx.itemLookup(e,t)}fireHookOnSubtree(e,t){e.hasAttribute(t)&&this.ctx.executeLifecycleHook(e,t),e.querySelectorAll(`[${t}]`).forEach(r=>this.ctx.executeLifecycleHook(r,t))}};O.RangeDomApplier=Yt});var dr=L(ot=>{"use strict";Object.defineProperty(ot,"__esModule",{value:!0});ot.FormLifecycleManager=void 0;var Xt=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}};ot.FormLifecycleManager=Xt});var ur=L(st=>{"use strict";Object.defineProperty(st,"__esModule",{value:!0});st.ChangeAutoWirer=void 0;var co=Ht(),uo=Tt(),ho=je(),Jt=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 o=this.escapeCSSSelector(n),s=e.querySelectorAll(`[name="${o}"]`);for(let a of s){if(this.wiredElements.has(a)||a.hasAttribute("lvt-input")||a.hasAttribute("lvt-change"))continue;let c=a.closest("form");c&&(c.hasAttribute("lvt-change")||(0,ho.hasNoInterceptOptOut)(c,"lvt-form:no-intercept",this.logger))||a instanceof HTMLInputElement&&(a.type==="hidden"||a.type==="submit"||a.type==="button")||a instanceof HTMLButtonElement||(this.attachListener(a,n,r),this.wiredElements.add(a))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let o=n.getAttribute("name");o&&(this.attachListener(n,o,"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");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("]*\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||!/^{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},c=(0,co.debounce)(a,s),l=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(l,c),this.elementCleanups.set(e,()=>{e.removeEventListener(l,c)}),this.logger.debug(`Auto-wired ${l} listener on [name="${t}"] (debounce: ${s}ms)`)}};st.ChangeAutoWirer=Jt});var pr=L(oe=>{"use strict";Object.defineProperty(oe,"__esModule",{value:!0});oe.WebSocketManager=oe.WebSocketTransport=void 0;oe.checkWebSocketAvailability=hr;oe.fetchInitialState=Zt;var at=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=()=>{this.reconnectAttempts=0,this.options.onOpen?.(e)},e.onmessage=t=>{this.options.onMessage?.(t)},e.onclose=t=>{this.options.onClose?.(t),!this.manuallyClosed&&this.options.autoReconnect&&this.scheduleReconnect()},e.onerror=t=>{this.options.onError?.(t)}}send(e){this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}disconnect(){this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.readyState!==WebSocket.CLOSED&&this.options.onClose?.(new CloseEvent("close",{code:1e3,reason:"",wasClean:this.socket.readyState===WebSocket.OPEN})),this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){this.clearReconnectTimer();let e=this.options.maxReconnectAttempts??10;if(e>0&&this.reconnectAttempts>=e){this.options.onReconnectFailed?.();return}this.reconnectAttempts++;let t=this.options.reconnectDelay??1e3,n=this.options.maxReconnectDelay??16e3,r=t*Math.pow(2,this.reconnectAttempts-1),o=Math.random()*1e3,s=Math.min(r+o,n);this.reconnectTimer=window.setTimeout(()=>{this.options.onReconnectAttempt?.(this.reconnectAttempts,s),this.connect()},s)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}};oe.WebSocketTransport=at;var Qt=class{constructor(e){this.config=e,this.transport=null,this.liveUrlOverride=null}setLiveUrl(e){this.liveUrlOverride=e}async connect(){let e=this.getLiveUrl();if(!await hr(e,this.config.logger))return{usingWebSocket:!1,initialState:await Zt(e,this.config.logger)};let n,r,o=new Promise((d,h)=>{n=d,r=h}),s=!1,a=!1,c=null,l=d=>{s||(s=!0,c!==null&&(clearTimeout(c),c=null),d?r(d):n({usingWebSocket:!0}))};c=setTimeout(()=>{l(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new at({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{a=!0,this.config.onConnected(),l()},onMessage:d=>{try{let h=JSON.parse(d.data);this.config.onMessage(h,d)}catch(h){this.config.logger.error("Failed to parse WebSocket message:",h)}},onClose:()=>{a?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(d,h)=>{this.config.onReconnectAttempt?.(d,h)},onReconnectFailed:()=>{this.config.onReconnectFailed?.()},onError:d=>{this.config.onError?.(d),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await o}catch(d){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",d),this.transport?.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await Zt(e,this.config.logger)}}}disconnect(){this.transport?.disconnect(),this.transport=null}send(e){this.transport?.send(e)}getReadyState(){return this.transport?.getSocket()?.readyState}getSocket(){return this.transport?.getSocket()??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}};oe.WebSocketManager=Qt;async function hr(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e?.warn("Failed to check WebSocket availability:",t),!0}}async function Zt(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e?.warn("Failed to fetch initial state:",t),null}}});var fr=L(lt=>{"use strict";Object.defineProperty(lt,"__esModule",{value:!0});lt.S3Uploader=void 0;var en=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let o=new XMLHttpRequest;o.upload.addEventListener("progress",a=>{a.lengthComputable&&(e.bytesUploaded=a.loaded,e.progress=Math.round(a.loaded/a.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{o.abort()});let s=new Promise((a,c)=>{o.addEventListener("load",()=>{o.status>=200&&o.status<300?(e.done=!0,e.progress=100,a()):c(new Error(`S3 upload failed with status ${o.status}: ${o.statusText}`))}),o.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),o.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(o.open("PUT",t.url),t.headers)for(let[a,c]of Object.entries(t.headers))o.setRequestHeader(a,c);o.send(r),await s}catch(o){throw e.error=o instanceof Error?o.message:String(o),o}}};lt.S3Uploader=en});var gr=L(ct=>{"use strict";Object.defineProperty(ct,"__esModule",{value:!0});ct.UploadHandler=void 0;var po=fr(),tn=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 po.S3Uploader)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let o=this.inputHandlers.get(n);o&&n.removeEventListener("change",o);let s=a=>{let c=a.target.files;!c||c.length===0||this.startUpload(r,Array.from(c))};n.addEventListener("change",s),this.inputHandlers.set(n,s)})}async startUpload(e,t){this.pendingFiles.set(e,t);let n=t.map(o=>({name:o.name,type:o.type||"application/octet-stream",size:o.size})),r={action:"upload_start",upload_name:e,files:n};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 o=new Map;for(let a of r)o.set(a.name,a);let s=[];for(let a of n){let c=o.get(a.client_name);if(!c){console.warn(`No file found for entry ${a.entry_id} (client_name: ${a.client_name})`);continue}let l={id:a.entry_id,file:c,uploadName:t,progress:0,bytesUploaded:0,valid:a.valid,done:!1,error:a.error,external:a.external};if(this.entries.set(l.id,l),s.push(l),!a.valid){this.onError&&a.error&&this.onError(l,a.error);continue}a.auto_upload&&(a.external?this.uploadExternal(l,a.external):this.uploadChunked(l))}}async uploadExternal(e,t){try{let n=this.uploaders.get(t.uploader);if(!n)throw new Error(`Unknown uploader: ${t.uploader}`);await n.upload(e,t,this.onProgress);let r={action:"upload_complete",upload_name:e.uploadName,entry_ids:[e.id]};this.sendMessage(r),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}catch(n){let r=n instanceof Error?n.message:String(n);e.error=r,this.onError&&this.onError(e,r),this.cleanupEntries(e.uploadName)}}async uploadChunked(e){let{file:t,id:n}=e,r=0;e.abortController=new AbortController;try{for(;r{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,o]of this.entries)e&&o.uploadName!==e||(o.done||o.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 s=r.result.split(",")[1];t(s)},r.onerror=n,r.readAsDataURL(e)})}};ct.UploadHandler=tn});var vr=L(De=>{"use strict";Object.defineProperty(De,"__esModule",{value:!0});De.Logger=void 0;De.createLogger=fo;var mr={silent:0,error:1,warn:2,info:3,debug:4},br="LiveTemplate",dt=class i{constructor(e,t=[],n=console){this.state=e,this.scope=t,this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return mr[e]<=mr[this.state.level]}formatPrefix(){return this.scope.length===0?`[${br}]`:`[${br}:${this.scope.join(":")}]`}};De.Logger=dt;function fo(i={}){let e={level:i.level??"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new dt(e,t,i.sink??console)}});var yr=L(ut=>{"use strict";Object.defineProperty(ut,"__esModule",{value:!0});ut.loadAndApplyUpdate=go;ut.compareHTML=mo;async function go(i,e){try{let t=globalThis?.require;if(typeof t=="function"){let o=t("fs"),s=JSON.parse(o.readFileSync(e,"utf8"));return i.applyUpdate(s)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function mo(i,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+<").trim(),r=n(i),o=n(e);if(r===o)return{match:!0,differences:[]};let s=r.split(` + `,document.head.appendChild(t)}document.body.insertBefore(e,document.body.firstChild),this.bar=e}hide(){this.bar&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.bar=null)}enablePerActionIndicator(e){if(this.pendingHandler){if(this.currentDebounceMs===e)return;this.disablePerActionIndicator()}this.pendingCount=0,this.currentDebounceMs=e,this.pendingHandler=()=>{this.pendingCount++,this.pendingCount===1&&this.actionTimer===null&&this.bar===null&&(this.actionTimer=setTimeout(()=>{this.actionTimer=null,this.pendingCount>0&&this.show()},e))},this.updatedHandler=()=>{this.pendingCount=Math.max(0,this.pendingCount-1),this.pendingCount===0&&(this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.hide())},document.addEventListener("lvt:pending",this.pendingHandler,!0),document.addEventListener("lvt:updated",this.updatedHandler,!0)}disablePerActionIndicator(){this.pendingHandler&&(document.removeEventListener("lvt:pending",this.pendingHandler,!0),this.pendingHandler=null),this.updatedHandler&&(document.removeEventListener("lvt:updated",this.updatedHandler,!0),this.updatedHandler=null),this.actionTimer!==null&&(clearTimeout(this.actionTimer),this.actionTimer=null),this.pendingCount=0,this.currentDebounceMs=null,this.hide()}};rt.LoadingIndicator=Vt});var ir=_(it=>{"use strict";Object.defineProperty(it,"__esModule",{value:!0});it.FormDisabler=void 0;var Gt=class{disable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(o=>{o.disabled=!0})})}enable(e){if(!e)return;e.querySelectorAll("form").forEach(n=>{n.querySelectorAll("input, textarea, select, button").forEach(o=>{o.disabled=!1})})}};it.FormDisabler=Gt});var sr=_(st=>{"use strict";Object.defineProperty(st,"__esModule",{value:!0});st.setupInvokerPolyfill=fo;st.teardownInvokerPolyfill=go;var ot=!1;function or(i){let e=i.target;if(!e||!(e instanceof Element))return;let t=e.closest("button[commandfor]");if(!t||t.disabled)return;let n=t.getAttribute("commandfor");if(!n)return;let r=t.getAttribute("command"),o=document.getElementById(n);o&&(o instanceof HTMLDialogElement?r==="show-modal"&&!o.open?o.showModal():r==="close"&&o.open&&o.close():o instanceof HTMLElement&&o.hasAttribute("popover")&&(r==="show-popover"&&typeof o.showPopover=="function"?o.showPopover():r==="hide-popover"&&typeof o.hidePopover=="function"?o.hidePopover():r==="toggle-popover"&&typeof o.togglePopover=="function"&&o.togglePopover()))}function fo(){"commandForElement"in HTMLButtonElement.prototype||ot||(ot=!0,document.addEventListener("click",or))}function go(){ot&&(document.removeEventListener("click",or),ot=!1)}});var lr=_(at=>{"use strict";Object.defineProperty(at,"__esModule",{value:!0});at.setupScrollAway=bo;at.teardownScrollAway=yo;var mo=ue(),ge="__lvt_scroll_away",Z=[];function vo(){for(let i=Z.length-1;i>=0;i--){let e=Z[i];e.trigger.isConnected||(e.target.removeEventListener("scroll",e.handler),delete e.trigger[ge],Z.splice(i,1))}}function bo(i){vo();let e=t=>{let n=t.getAttribute("lvt-scroll-away");if(!n)return;if(n!=="bottom"&&n!=="top"){console.warn(`Unknown lvt-scroll-away edge: ${n}`);return}let r=(0,mo.resolveTarget)(t);if(!r||r===t){let h=t[ge];h&&(h.target.removeEventListener("scroll",h.handler),ar(h),delete t[ge]),console.warn("lvt-scroll-away requires data-lvt-target pointing to a scrollable container");return}let o=t[ge];if(o){if(o.target===r)return;o.target.removeEventListener("scroll",o.handler),ar(o)}let s=parseInt(getComputedStyle(t).getPropertyValue("--lvt-scroll-threshold").trim(),10),a=isNaN(s)?200:s,c=!1,l=()=>{c||(c=!0,requestAnimationFrame(()=>{c=!1,(n==="top"?r.scrollTop:r.scrollHeight-r.scrollTop-r.clientHeight)>a?t.classList.add("visible"):t.classList.remove("visible")}))};r.addEventListener("scroll",l,{passive:!0}),l();let d={trigger:t,target:r,handler:l};t[ge]=d,Z.push(d)};e(i),i.querySelectorAll("[lvt-scroll-away]").forEach(e)}function ar(i){let e=Z.indexOf(i);e!==-1&&Z.splice(e,1)}function yo(i){for(let e=Z.length-1;e>=0;e--){let t=Z[e];i&&t.trigger.isConnected&&!i.contains(t.trigger)||(t.target.removeEventListener("scroll",t.handler),t.trigger.classList.remove("visible"),delete t.trigger[ge],Z.splice(e,1))}}});var gr=_(ct=>{"use strict";Object.defineProperty(ct,"__esModule",{value:!0});ct.setupSpy=Ao;ct.teardownSpy=To;var cr="lvt-active",Xt="__lvt_spy",ve="__lvt_spy_link_handler",z=[],dr=new WeakSet;function wo(){for(let i=z.length-1;i>=0;i--){let e=z[i];e.container.isConnected||(Jt(e),z.splice(i,1))}if(z.length===0){let i=document[ve];i&&(document.removeEventListener("click",i),delete document[ve])}}function Jt(i){me(i,null),i.scrollTarget.removeEventListener("scroll",i.scrollHandler),window.removeEventListener("resize",i.resizeHandler),delete i.container[Xt]}function Yt(i){let e=getComputedStyle(i).getPropertyValue("--lvt-spy-margin").trim(),t=Math.round(window.innerHeight*.25);if(!e)return t;let n=parseFloat(e);return isNaN(n)?t:e.endsWith("vh")?Math.round(n/100*window.innerHeight):e.endsWith("px")||/^-?\d+(\.\d+)?$/.test(e)?n:(console.warn(`lvt-spy: unsupported --lvt-spy-margin unit ${JSON.stringify(e)}; supported units are vh and px (or unitless). Falling back to 25vh.`),t)}function pr(i){let e=i.getAttribute("lvt-spy");if(e&&e.trim()!=="")try{return Array.from(i.querySelectorAll(e))}catch(t){return console.warn(`lvt-spy: invalid selector ${JSON.stringify(e)}:`,t),[]}return[i]}function me(i,e){for(let t of i.links){let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";e!==null&&r===e?t.classList.add(cr):t.classList.remove(cr)}}function fr(i){let e=new Set;for(let n of i.targets)n.id&&e.add(n.id);let t=[];document.querySelectorAll("[lvt-spy-link]").forEach(n=>{let r=n.getAttribute("href")||"",o=r.startsWith("#")?r.slice(1):"";e.has(o)&&t.push(n)}),i.links=t}function ko(i){for(let e of z)for(let t of e.targets)if(t.id===i)return e;return null}function lt(i,e){let t=null;for(let n of i){if(!n.id)continue;n.getBoundingClientRect().top<=e&&(t=n.id)}return t}function Eo(i){let e=i.parentElement;for(;e&&e!==document.documentElement;){let t=getComputedStyle(e).overflowY;if(t==="auto"||t==="scroll"||t==="overlay")return e;e=e.parentElement}return window}function xo(i,e){if(i.length!==e.length)return!1;for(let t=0;t!s.id&&!dr.has(s));if(n.length>0){console.warn(`lvt-spy: ${n.length} target(s) without an id attribute; they cannot be linked from [lvt-spy-link]. Add id="..." or drop them from the selector. First offender:`,n[0]);for(let s of n)dr.add(s)}let r={container:i,targets:t,marginPx:Yt(i),links:[],scrollTarget:Eo(i),scrollHandler:()=>{},resizeHandler:()=>{}};fr(r);let o=!1;r.scrollHandler=()=>{o||(o=!0,requestAnimationFrame(()=>{o=!1,me(r,lt(r.targets,r.marginPx))}))},r.resizeHandler=()=>{r.marginPx=Yt(r.container),me(r,lt(r.targets,r.marginPx))},r.scrollTarget.addEventListener("scroll",r.scrollHandler,{passive:!0}),window.addEventListener("resize",r.resizeHandler,{passive:!0}),i[Xt]=r,z.push(r),me(r,lt(r.targets,r.marginPx))}function hr(i){let e=i[Xt];if(e){let t=pr(i);if(xo(e.targets,t)){e.marginPx=Yt(i),fr(e),me(e,lt(e.targets,e.marginPx));return}Jt(e);let n=z.indexOf(e);n!==-1&&z.splice(n,1),ur(i,t);return}ur(i)}function So(){if(document[ve])return;let i=e=>{let t=e.target?.closest("[lvt-spy-link]");if(!t)return;let n=t.getAttribute("href")||"",r=n.startsWith("#")?n.slice(1):"";if(!r)return;let o=ko(r);o&&me(o,r)};document.addEventListener("click",i,{passive:!0}),document[ve]=i}function Ao(i){wo(),So(),i.hasAttribute("lvt-spy")&&hr(i),i.querySelectorAll("[lvt-spy]").forEach(hr)}function To(i){for(let e=z.length-1;e>=0;e--){let t=z[e];i&&t.container.isConnected&&!i.contains(t.container)||(Jt(t),z.splice(e,1))}if(z.length===0){let e=document[ve];e&&(document.removeEventListener("click",e),delete document[ve])}}});var vr=_(dt=>{"use strict";Object.defineProperty(dt,"__esModule",{value:!0});dt.TreeRenderer=void 0;function mr(i){return typeof structuredClone=="function"?structuredClone(i):JSON.parse(JSON.stringify(i))}function Co(i){return i!=null&&typeof i=="object"&&Array.isArray(i.d)&&Array.isArray(i.s)}function Qt(i,e=0){if(e>50||i==null||typeof i!="object"||Array.isArray(i))return!1;if(Co(i))return!0;for(let n of Object.keys(i))if(/^\d+$/.test(n)){let r=i[n];if(r!=null&&typeof r=="object"&&!Array.isArray(r)&&Qt(r,e+1))return!0}return!1}function Lo(i,e){if(!e.s||!Array.isArray(e.s))return!1;if(Qt(i)&&!Qt(e))return!0;for(let t of Object.keys(i))if(/^\d+$/.test(t)&&!(t in e))return!0;return!1}var Zt=class{constructor(e){this.logger=e,this.treeState={},this.rangeState={},this.rangeIdKeys={}}applyUpdate(e,t){let n=!1,r=[],o=new Set;for(let[c,l]of Object.entries(e))if(Array.isArray(l)&&l.length>0&&Array.isArray(l[0])&&typeof l[0][0]=="string"){let h=this.treeState[c];h&&typeof h=="object"&&!Array.isArray(h)&&Array.isArray(h.d)&&Array.isArray(h.s)?t?.canApplyTargeted?.(h,c)===!0?(this.applyDifferentialOpsToRange(h,l,c),r.push({rangePath:c,ops:l,statics:h.s,idKey:h.m?.idKey}),o.add(c)):(this.treeState[c]=mr(h),this.applyDifferentialOpsToRange(this.treeState[c],l,c)):this.treeState[c]=l,n=!0}else{let h=this.treeState[c],u=typeof l=="object"&&l!==null&&!Array.isArray(l)?this.deepMergeTreeNodes(h,l,c):l;JSON.stringify(h)!==JSON.stringify(u)&&(this.treeState[c]=u,n=!0)}let a={html:this.reconstructFromTree(this.treeState,"",o.size>0?o:void 0),changed:n};return r.length>0&&(a.targetedOps=r),a}reset(){this.treeState={},this.rangeState={},this.rangeIdKeys={}}getTreeState(){return{...this.treeState}}getStaticStructure(){return this.treeState.s||null}renderState(){return this.reconstructFromTree(this.treeState,"")}deepMergeTreeNodes(e,t,n=""){if(typeof t!="object"||t===null||Array.isArray(t)||typeof e!="object"||e===null||Array.isArray(e))return t;if(Lo(e,t))return this.logger.debug(`[deepMerge] Structure transition at path ${n}, replacing instead of merging`),t;let r={...e};for(let[o,s]of Object.entries(t)){let a=n?`${n}.${o}`:o,c=Array.isArray(s)&&s.length>0&&Array.isArray(s[0])&&typeof s[0][0]=="string",l=r[o]&&typeof r[o]=="object"&&!Array.isArray(r[o])&&Array.isArray(r[o].d)&&Array.isArray(r[o].s);c&&l?(r[o]=mr(r[o]),this.logger.debug(`[deepMerge] Applying diff ops at path ${a}`,{ops:s,rangeItems:r[o].d?.length}),this.applyDifferentialOpsToRange(r[o],s,a)):typeof s=="object"&&s!==null&&!Array.isArray(s)&&typeof r[o]=="object"&&r[o]!==null&&!Array.isArray(r[o])?r[o]=this.deepMergeTreeNodes(r[o],s,a):r[o]=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}),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 o of t){if(!Array.isArray(o)||o.length<2)continue;switch(o[0]){case"r":{let a=o[1],c=this.findItemIndexByKey(r,a,e.s,n);this.logger.debug(`[applyDiffOpsToRange] Remove: key=${a}, index=${c}, total=${r.length}`),c>=0?(r.splice(c,1),this.logger.debug(`[applyDiffOpsToRange] After removal: ${r.length} items`)):this.logger.debug(`[applyDiffOpsToRange] Remove failed: key ${a} not found`);break}case"u":{let a=this.findItemIndexByKey(r,o[1],e.s,n),c=o[2];a>=0&&c&&(r[a]=this.mergeRangeItem(r[a],c,n));break}case"a":{let a=Array.isArray(o[1])?o[1]:[o[1]];o[2]&&(e.s=o[2]),r.push(...a),o[3]&&typeof o[3]=="object"&&o[3].idKey&&(this.rangeIdKeys[n]=o[3].idKey);break}case"p":{let a=Array.isArray(o[1])?o[1]:[o[1]];o[2]&&(e.s=o[2]),r.unshift(...a);break}case"i":{let a=this.findItemIndexByKey(r,o[1],e.s,n);if(a>=0){let c=Array.isArray(o[2])?o[2]:[o[2]];r.splice(a+1,0,...c)}break}case"o":{let a=o[1],c=[],l=new Map;for(let d of r){let h=this.getItemKey(d,e.s,n);h&&l.set(h,d)}for(let d of a){let h=l.get(d);h&&c.push(h)}r.length=0,r.push(...c);break}default:break}}this.rangeState[n]={items:r,statics:e.s}}reconstructFromTree(e,t,n){if(e.s&&Array.isArray(e.s)){let r="";for(let o=0;o`;continue}r+=this.renderValue(e[a],a,c)}}}return r=r.replace(//g,"").replace(/<\/root>/g,""),r}return this.renderValue(e,"",t)}renderValue(e,t,n){if(e==null||typeof e=="string"&&e.startsWith("{{")&&e.endsWith("}}"))return"";if(typeof e=="object"&&!Array.isArray(e)){if(e.d&&Array.isArray(e.d)&&e.s&&Array.isArray(e.s)){let s=n||t||"";return s&&(this.rangeState[s]={items:e.d,statics:e.s},e.m&&typeof e.m=="object"&&typeof e.m.idKey=="string"&&(this.rangeIdKeys[s]=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),o=r.filter(s=>/^\d+$/.test(s)).sort((s,a)=>parseInt(s)-parseInt(a));if(o.length>0&&o.length===r.length)return o.map(s=>{let a=n?`${n}.${s}`:s;return this.renderValue(e[s],s,a)}).join("")}return Array.isArray(e)?e.length>0&&Array.isArray(e[0])&&typeof e[0][0]=="string"?this.applyDifferentialOperations(e,n):e.map((r,o)=>{let s=o.toString(),a=n?`${n}.${s}`:s;return typeof r=="object"&&r&&r.s?this.reconstructFromTree(r,a):this.renderValue(r,s,a)}).join(""):typeof e=="object"?(this.logger.debug("Skipping plain object value (not a tree node) - this is normal for state-only data"),""):String(e)}renderRangeStructure(e,t,n){let{d:r,s:o}=e;if(!r||!Array.isArray(r))return"";if(r.length===0){if(e.else){let s="else",a=n?`${n}.else`:"else";return this.renderValue(e.else,s,a)}return""}return o&&Array.isArray(o)?r.map((s,a)=>this.renderRangeItem(s,a,o,n)).join(""):r.map((s,a)=>{let c=a.toString(),l=n?`${n}.${c}`:c;return this.renderValue(s,c,l)}).join("")}renderRangeItem(e,t,n,r){let o=n,s="";for(let a=0;a=0&&r.splice(l,1);break}case"u":{let l=this.findItemIndexByKey(r,a[1],o,t),d=a[2];l>=0&&d&&(r[l]=this.mergeRangeItem(r[l],d,t||""));break}case"a":{this.addItemsToRange(r,a[1],a[2],n,!1),a[3]&&typeof a[3]=="object"&&a[3].idKey&&(this.rangeIdKeys[t||""]=a[3].idKey);break}case"p":{this.addItemsToRange(r,a[1],a[2],n,!0);break}case"i":{let l=this.findItemIndexByKey(r,a[1],o,t);if(l>=0){let d=Array.isArray(a[2])?a[2]:[a[2]];r.splice(l+1,0,...d)}break}case"o":{let l=a[1],d=[],h=new Map;for(let u of r){let p=this.getItemKey(u,o,t);p&&h.set(p,u)}for(let u of l){let p=h.get(u);p&&d.push(p)}r.length=0,r.push(...d);break}default:break}}this.rangeState[t]={items:r,statics:n.statics},this.treeState[t]={d:r,s:n.statics};let s=this.getCurrentRangeStructure(t);return s&&s.s?this.renderItemsWithStatics(r,s.s,t):r.map(a=>this.renderValue(a)).join("")}getCurrentRangeStructure(e){if(this.rangeState[e])return{d:this.rangeState[e].items,s:this.rangeState[e].statics};let t=this.treeState[e];return t&&typeof t=="object"&&t.s?t:null}renderItemsWithStatics(e,t,n){let r=e.map((o,s)=>this.renderRangeItem(o,s,t,n)).join("");return this.logger.isDebugEnabled()&&(this.logger.debug("[renderItemsWithStatics] statics:",t),this.logger.debug("[renderItemsWithStatics] items count:",e.length),this.logger.debug("[renderItemsWithStatics] result snippet:",r.substring(0,200))),r}addItemsToRange(e,t,n,r,o){if(n&&(r.statics=n),!t)return;let s=Array.isArray(t)?t:[t];o?e.unshift(...s):e.push(...s)}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(o=>this.getItemKey(o,n,r)===t)}mergeRangeItem(e,t,n){return this.deepMergeTreeNodes(e,t,`${n}.item`)}};dt.TreeRenderer=Zt});var br=_(P=>{"use strict";var Mo=P&&P.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(P,"__esModule",{value:!0});P.RangeDomApplier=P.TARGETED_SKIP_ATTR=P.TARGETED_APPLIED_ATTR=void 0;var _o=Mo(_t()),en=["data-key","data-lvt-key"],Ro=en.map(i=>new RegExp(`(?:^|[\\s<])${i}\\s*=`));P.TARGETED_APPLIED_ATTR="data-lvt-targeted-applied";P.TARGETED_SKIP_ATTR="data-lvt-targeted-skip";var tn=class{constructor(e){this.ctx=e,this.containerCache=new Map}invalidate(){this.containerCache.clear()}invalidatePath(e){this.containerCache.delete(e)}findContainer(e,t,n){let r=this.containerCache.get(t);if(r&&r.isConnected&&e.contains(r))return r;if(r&&this.containerCache.delete(t),n===void 0)return null;let o=this.findItemByKey(e,n);if(!o||!o.parentElement)return null;let s=o.parentElement;return this.containerCache.set(t,s),s}canApplyTargeted(e,t,n){if(!t||typeof t!="object")return{ok:!1,reason:"no range structure"};if(!Array.isArray(t.s)||t.s.length===0)return{ok:!1,reason:"no statics"};let r=[t.s];if(t.sm&&typeof t.sm=="object")for(let d of Object.values(t.sm))Array.isArray(d)&&r.push(d);if(!r.some(d=>this.staticsContainKeyAttribute(d)))return{ok:!1,reason:"no data-key attribute in statics"};let s=t.d;if(Array.isArray(s)){for(let d of s)if(this.itemHasNestedRange(d))return{ok:!1,reason:"nested-range item"}}let a=this.extractItemKey(s?.[0],t),c=this.findContainer(e,n,a);if(!c)return{ok:!1,reason:"container not found in DOM"};let l=c;for(;l;){if(l.hasAttribute("lvt-ignore"))return{ok:!1,reason:"lvt-ignore ancestor"};if(l===e)break;l=l.parentElement}return{ok:!0,container:c,containerKey:a}}apply(e,t,n){let{rangePath:r,ops:o,statics:s}=t,a=this.firstKnownKey(o),c=this.findContainer(e,r,a);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] container not found for range ${r}; cannot apply`),null;let l=!0;for(let d of o){if(!Array.isArray(d)||d.length<1)continue;let h=d[0];try{let u=!0;switch(h){case"r":u=this.applyRemove(c,d[1]);break;case"u":u=this.applyUpdateRow(c,d[1],s,r,n);break;case"i":u=this.applyInsertAfter(c,d[1],d[2],s,r);break;case"a":u=this.applyAppend(c,d[1],s,r);break;case"p":u=this.applyPrepend(c,d[1],s,r);break;case"o":u=this.applyReorder(c,d[1]);break;default:this.ctx.logger.warn(`[RangeDomApplier] unknown op type ${h}; falling back`),u=!1}u||(l=!1)}catch(u){return this.ctx.logger.error(`[RangeDomApplier] op ${h} failed for range ${r}`,u),null}}return l?(typeof window<"u"&&"__lvtTargetedHits"in window&&window.__lvtTargetedHits++,c):null}cleanupMarkers(e){e.querySelectorAll(`[${P.TARGETED_APPLIED_ATTR}]`).forEach(r=>r.removeAttribute(P.TARGETED_APPLIED_ATTR)),e.hasAttribute(P.TARGETED_APPLIED_ATTR)&&e.removeAttribute(P.TARGETED_APPLIED_ATTR),e.querySelectorAll(`[${P.TARGETED_SKIP_ATTR}]`).forEach(r=>r.removeAttribute(P.TARGETED_SKIP_ATTR)),e.hasAttribute(P.TARGETED_SKIP_ATTR)&&e.removeAttribute(P.TARGETED_SKIP_ATTR)}applyRemove(e,t){let n=this.findItemByKey(e,t);return n?(this.fireHookOnSubtree(n,"lvt-destroyed"),n.remove(),!0):(this.ctx.logger.debug(`[RangeDomApplier] r: row with key ${t} not found (idempotent no-op)`),!0)}applyUpdateRow(e,t,n,r,o){let s=this.findItemByKey(e,t);if(!s)return this.ctx.logger.debug(`[RangeDomApplier] u: row with key ${t} not found in DOM; falling back`),!1;let a=this.indexOfChild(e,s),c=this.lookupCurrentItem(r,t);if(!c)return this.ctx.logger.debug(`[RangeDomApplier] u: item state for key ${t} not available; falling back`),!1;let l=this.ctx.renderItem(c,a,n,r),d=this.parseSingleRow(l);return d?(o?(0,_o.default)(s,d,{...o,childrenOnly:!1}):(this.fireHookOnSubtree(s,"lvt-destroyed"),s.replaceWith(d),this.ctx.onNodeAdded?.(d),this.fireHookOnSubtree(d,"lvt-mounted")),!0):(this.ctx.logger.warn("[RangeDomApplier] u: failed to parse rendered row HTML; falling back"),!1)}applyInsertAfter(e,t,n,r,o){let s=this.findItemByKey(e,t);return s?this.renderItemsAtomic(n,r,o,this.indexOfChild(e,s)+1,a=>e.insertBefore(a,s.nextSibling)):(this.ctx.logger.debug(`[RangeDomApplier] i: anchor key ${t} not found; falling back`),!1)}applyAppend(e,t,n,r){return this.renderItemsAtomic(t,n,r,e.children.length,o=>e.appendChild(o))}applyPrepend(e,t,n,r){return this.renderItemsAtomic(t,n,r,0,o=>e.insertBefore(o,e.firstChild))}renderItemsAtomic(e,t,n,r,o){let s=Array.isArray(e)?e:[e],a=document.createDocumentFragment(),c=[];for(let l=0;l{for(let a of en){let c=s.getAttribute(a);if(c!==null){n.set(c,s);break}}});let r=document.createDocumentFragment(),o=new Set(t);for(let s of t){let a=n.get(s);a&&r.appendChild(a)}if(o.size~+*=^$|! \t\n\r]/.test(t)&&this.ctx.logger.warn(`[RangeDomApplier] CSS.escape unavailable; key "${t}" contains characters that need escaping. Lookup may miss the row.`),n=t.replace(/(["\\])/g,"\\$1"));for(let r of en){let o=e.querySelector(`[${r}="${n}"]`);if(o)return o}return null}indexOfChild(e,t){let n=0,r=e.firstElementChild;for(;r;){if(r===t)return n;n++,r=r.nextElementSibling}return-1}firstKnownKey(e){for(let t of e){if(!Array.isArray(t)||t.length<2)continue;let n=t[0];if(n==="r"||n==="u"||n==="i")return typeof t[1]=="string"?t[1]:void 0;if(n==="o"&&Array.isArray(t[1])&&t[1].length>0)return typeof t[1][0]=="string"?t[1][0]:void 0;if(n==="a"||n==="p"){let r=Array.isArray(t[1])?t[1]:[t[1]];for(let o of r)if(o&&typeof o=="object"&&o._k!==void 0)return String(o._k)}}}staticsContainKeyAttribute(e){for(let t of e)if(typeof t=="string"){for(let n of Ro)if(n.test(t))return!0}return!1}itemHasNestedRange(e){if(!e||typeof e!="object")return!1;for(let[t,n]of Object.entries(e))if(!t.startsWith("_")&&n&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.d)&&Array.isArray(r.s)||this.itemHasNestedRange(r))return!0}return!1}extractItemKey(e,t){if(!e||typeof e!="object")return;if(e._k!==void 0)return String(e._k);let n=t?.m?.idKey;if(n&&e[n]!==void 0)return String(e[n])}lookupCurrentItem(e,t){return this.ctx.itemLookup(e,t)}fireHookOnSubtree(e,t){e.hasAttribute(t)&&this.ctx.executeLifecycleHook(e,t),e.querySelectorAll(`[${t}]`).forEach(r=>this.ctx.executeLifecycleHook(r,t))}};P.RangeDomApplier=tn});var yr=_(ut=>{"use strict";Object.defineProperty(ut,"__esModule",{value:!0});ut.FormLifecycleManager=void 0;var nn=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}};ut.FormLifecycleManager=nn});var wr=_(ht=>{"use strict";Object.defineProperty(ht,"__esModule",{value:!0});ht.ChangeAutoWirer=void 0;var Io=Bt(),Do=Rt(),Ho=Je(),rn=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 o=this.escapeCSSSelector(n),s=e.querySelectorAll(`[name="${o}"]`);for(let a of s){if(this.wiredElements.has(a)||a.hasAttribute("lvt-input")||a.hasAttribute("lvt-change"))continue;let c=a.closest("form");c&&(c.hasAttribute("lvt-change")||(0,Ho.hasNoInterceptOptOut)(c,"lvt-form:no-intercept",this.logger))||a instanceof HTMLInputElement&&(a.type==="hidden"||a.type==="submit"||a.type==="button")||a instanceof HTMLButtonElement||(this.attachListener(a,n,r),this.wiredElements.add(a))}}let t=e.querySelectorAll("select[name]");for(let n of t){if(this.wiredElements.has(n)||n.hasAttribute("lvt-input")||n.hasAttribute("lvt-change"))continue;let r=n.closest("form");if(r&&(r.hasAttribute("lvt-change")||r.hasAttribute("lvt-form:no-intercept")))continue;let o=n.getAttribute("name");o&&(this.attachListener(n,o,"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");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("]*\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||!/^{if(!this.enabled)return;let d=n==="attribute"&&e.type==="checkbox"?e.checked:e.value;this.context.send({action:"change",data:{[t]:d}})},c=(0,Io.debounce)(a,s),l=n==="attribute"||e instanceof HTMLSelectElement?"change":"input";e.addEventListener(l,c),this.elementCleanups.set(e,()=>{e.removeEventListener(l,c)}),this.logger.debug(`Auto-wired ${l} listener on [name="${t}"] (debounce: ${s}ms)`)}};ht.ChangeAutoWirer=rn});var Er=_(ie=>{"use strict";Object.defineProperty(ie,"__esModule",{value:!0});ie.WebSocketManager=ie.WebSocketTransport=void 0;ie.checkWebSocketAvailability=kr;ie.fetchInitialState=sn;var pt=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=()=>{this.reconnectAttempts=0,this.options.onOpen?.(e)},e.onmessage=t=>{this.options.onMessage?.(t)},e.onclose=t=>{this.options.onClose?.(t),!this.manuallyClosed&&this.options.autoReconnect&&this.scheduleReconnect()},e.onerror=t=>{this.options.onError?.(t)}}send(e){this.socket&&this.socket.readyState===WebSocket.OPEN&&this.socket.send(e)}disconnect(){this.manuallyClosed=!0,this.clearReconnectTimer(),this.socket&&(this.socket.readyState!==WebSocket.CLOSED&&this.options.onClose?.(new CloseEvent("close",{code:1e3,reason:"",wasClean:this.socket.readyState===WebSocket.OPEN})),this.socket.onopen=null,this.socket.onmessage=null,this.socket.onclose=null,this.socket.onerror=null,this.socket.close(),this.socket=null)}getSocket(){return this.socket}scheduleReconnect(){this.clearReconnectTimer();let e=this.options.maxReconnectAttempts??10;if(e>0&&this.reconnectAttempts>=e){this.options.onReconnectFailed?.();return}this.reconnectAttempts++;let t=this.options.reconnectDelay??1e3,n=this.options.maxReconnectDelay??16e3,r=t*Math.pow(2,this.reconnectAttempts-1),o=Math.random()*1e3,s=Math.min(r+o,n);this.reconnectTimer=window.setTimeout(()=>{this.options.onReconnectAttempt?.(this.reconnectAttempts,s),this.connect()},s)}clearReconnectTimer(){this.reconnectTimer!==null&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}};ie.WebSocketTransport=pt;var on=class{constructor(e){this.config=e,this.transport=null,this.liveUrlOverride=null}setLiveUrl(e){this.liveUrlOverride=e}async connect(){let e=this.getLiveUrl();if(!await kr(e,this.config.logger))return{usingWebSocket:!1,initialState:await sn(e,this.config.logger)};let n,r,o=new Promise((d,h)=>{n=d,r=h}),s=!1,a=!1,c=null,l=d=>{s||(s=!0,c!==null&&(clearTimeout(c),c=null),d?r(d):n({usingWebSocket:!0}))};c=setTimeout(()=>{l(new Error("WebSocket open timed out after 10s"))},1e4),this.transport=new pt({url:this.getWebSocketUrl(),autoReconnect:this.config.options.autoReconnect,reconnectDelay:this.config.options.reconnectDelay,maxReconnectDelay:16e3,maxReconnectAttempts:10,onOpen:()=>{a=!0,this.config.onConnected(),l()},onMessage:d=>{try{let h=JSON.parse(d.data);this.config.onMessage(h,d)}catch(h){this.config.logger.error("Failed to parse WebSocket message:",h)}},onClose:()=>{a?this.config.onDisconnected():l(new Error("WebSocket closed before it opened"))},onReconnectAttempt:(d,h)=>{this.config.onReconnectAttempt?.(d,h)},onReconnectFailed:()=>{this.config.onReconnectFailed?.()},onError:d=>{this.config.onError?.(d),l(new Error("WebSocket errored before it opened"))}}),this.transport.connect();try{return await o}catch(d){return this.config.logger.warn("WebSocket open failed, falling back to HTTP",d),this.transport?.disconnect(),this.transport=null,{usingWebSocket:!1,initialState:await sn(e,this.config.logger)}}}disconnect(){this.transport?.disconnect(),this.transport=null}send(e){this.transport?.send(e)}getReadyState(){return this.transport?.getSocket()?.readyState}getSocket(){return this.transport?.getSocket()??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}};ie.WebSocketManager=on;async function kr(i,e){try{let n=(await fetch(i,{method:"HEAD"})).headers.get("X-LiveTemplate-WebSocket");return n?n==="enabled":!0}catch(t){return e?.warn("Failed to check WebSocket availability:",t),!0}}async function sn(i,e){try{let t=await fetch(i,{method:"GET",credentials:"include",headers:{Accept:"application/json"}});if(!t.ok)throw new Error(`Failed to fetch initial state: ${t.status}`);return await t.json()}catch(t){return e?.warn("Failed to fetch initial state:",t),null}}});var xr=_(ft=>{"use strict";Object.defineProperty(ft,"__esModule",{value:!0});ft.S3Uploader=void 0;var an=class{async upload(e,t,n){let{file:r}=e;e.abortController=new AbortController;try{let o=new XMLHttpRequest;o.upload.addEventListener("progress",a=>{a.lengthComputable&&(e.bytesUploaded=a.loaded,e.progress=Math.round(a.loaded/a.total*100),n&&n(e))}),e.abortController.signal.addEventListener("abort",()=>{o.abort()});let s=new Promise((a,c)=>{o.addEventListener("load",()=>{o.status>=200&&o.status<300?(e.done=!0,e.progress=100,a()):c(new Error(`S3 upload failed with status ${o.status}: ${o.statusText}`))}),o.addEventListener("error",()=>{c(new Error("S3 upload failed: Network error"))}),o.addEventListener("abort",()=>{c(new Error("S3 upload cancelled"))})});if(o.open("PUT",t.url),t.headers)for(let[a,c]of Object.entries(t.headers))o.setRequestHeader(a,c);o.send(r),await s}catch(o){throw e.error=o instanceof Error?o.message:String(o),o}}};ft.S3Uploader=an});var Sr=_(gt=>{"use strict";Object.defineProperty(gt,"__esModule",{value:!0});gt.UploadHandler=void 0;var Oo=xr(),ln=class{constructor(e,t={}){this.sendMessage=e,this.entries=new Map,this.pendingFiles=new Map,this.pendingInputs=new Map,this.autoUploadConfig=new Map,this.uploaders=new Map,this.pendingHandshakes=new Set,this.pendingUploads=new Set,this.previewUrls=new Map,this.inputHandlers=new WeakMap,this.chunkSize=t.chunkSize||256*1024,this.onProgress=t.onProgress,this.onComplete=t.onComplete,this.onError=t.onError,this.postMultipartUpload=t.postMultipartUpload,this.isConnected=t.isConnected,this.postUploadStart=t.postUploadStart,this.postUploadComplete=t.postUploadComplete,this.uploaders.set("s3",new Oo.S3Uploader)}connected(){return this.isConnected?this.isConnected():!0}dispatchUpload(e){switch(e.mode){case"preview":this.uploadPreview(e);return;case"proxied":this.uploadMultipart(e);return;case"direct":if(e.external)this.uploadExternal(e,e.external);else{let t="direct upload mode requires presigned upload metadata";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName)}return;case"volume":default:this.connected()?this.uploadChunked(e):this.uploadMultipart(e)}}finishUpload(e){e.done=!0,e.progress=100,this.onProgress&&this.onProgress(e),this.onComplete&&this.onComplete(e.uploadName,[e]),this.clearFileInput(e.uploadName),this.cleanupEntries(e.uploadName)}initializeFileInputs(e){e.querySelectorAll('input[type="file"][lvt-upload]').forEach(n=>{let r=n.getAttribute("lvt-upload");if(!r)return;let o=this.inputHandlers.get(n);o&&n.removeEventListener("change",o);let s=a=>{let c=a.target.files;!c||c.length===0||this.startUpload(r,Array.from(c),n)};n.addEventListener("change",s),this.inputHandlers.set(n,s)})}async startUpload(e,t,n){this.pendingFiles.set(e,t),n?this.pendingInputs.set(e,n):this.pendingInputs.delete(e);let r=t.map(a=>({name:a.name,type:a.type||"application/octet-stream",size:a.size})),o={action:"upload_start",upload_name:e,files:r};if(!this.connected()){if(!this.postUploadStart){this.failStart(e,t,"upload unavailable: WebSocket is closed and no HTTP fallback is configured");return}let a=new AbortController;this.pendingHandshakes.add(a);try{let c=await this.postUploadStart(o,a.signal);a.signal.aborted||await this.handleUploadStartResponse(c)}catch(c){this.failStart(e,t,c instanceof Error?c.message:String(c))}finally{this.pendingHandshakes.delete(a)}return}this.sendMessage(o)}failStart(e,t,n){this.pendingFiles.delete(e),this.pendingInputs.delete(e);let r=this.onError;r&&t.forEach((o,s)=>{r({id:`pending-${e}-${s}`,file:o,uploadName:e,progress:0,bytesUploaded:0,valid:!1,done:!1},n)})}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 o=this.pendingInputs.get(t);this.pendingInputs.delete(t);let s=new Map;for(let c of r)s.set(c.name,c);let a=[];for(let c of n){let l=s.get(c.client_name);if(!l){console.warn(`No file found for entry ${c.entry_id} (client_name: ${c.client_name})`);continue}let d={id:c.entry_id,file:l,uploadName:t,progress:0,bytesUploaded:0,valid:c.valid,done:!1,error:c.error,mode:c.mode??(c.external?"direct":"volume"),external:c.external,sourceInput:o};if(this.entries.set(d.id,d),a.push(d),!c.valid){this.onError&&c.error&&this.onError(d,c.error);continue}c.auto_upload&&this.dispatchUpload(d)}}async uploadExternal(e,t){try{let n=this.uploaders.get(t.uploader);if(!n)throw new Error(`Unknown uploader: ${t.uploader}`);let r=this.connected();if(await n.upload(e,t,this.onProgress),r){let o={action:"upload_complete",upload_name:e.uploadName,entry_ids:[e.id]};this.sendMessage(o)}else{if(!this.postUploadComplete){let s="upload_complete unavailable: WebSocket is down and no HTTP transport configured";e.error=s,this.onError&&this.onError(e,s),this.cleanupEntries(e.uploadName);return}let o={action:"upload_complete",upload_name:e.uploadName,entries:[{client_name:e.file.name,type:e.file.type,size:e.file.size,ref:t.url}]};await this.postUploadComplete(o,e.abortController?.signal)}this.finishUpload(e)}catch(n){let r=n instanceof Error?n.message:String(n);e.error=r,this.onError&&this.onError(e,r),this.cleanupEntries(e.uploadName)}}async uploadMultipart(e){if(!this.postMultipartUpload){let t="Multipart upload unavailable: no multipart transport configured";e.error=t,this.onError&&this.onError(e,t),this.cleanupEntries(e.uploadName);return}e.abortController=new AbortController,this.pendingUploads.add(e.abortController),this.onProgress&&this.onProgress(e);try{let t=new FormData;t.set("lvt-action",`upload_${e.uploadName}_complete`),this.appendFormFields(t,e),t.set(e.uploadName,e.file,e.file.name),await this.postMultipartUpload(t,e.abortController.signal),this.finishUpload(e)}catch(t){let n=t instanceof Error?t.message:String(t);e.error=n,this.onError&&this.onError(e,n),this.cleanupEntries(e.uploadName)}finally{e.abortController&&this.pendingUploads.delete(e.abortController),e.sourceInput=void 0}}appendFormFields(e,t){let n=t.sourceInput?.form;if(!n)return;let r=new Set;for(let o of Array.from(n.elements)){let s=o;s.type==="password"&&s.name&&r.add(s.name)}for(let[o,s]of new FormData(n).entries())o==="lvt-action"||s instanceof File||r.has(o)||e.append(o,s)}uploadPreview(e){let t=this.previewUrls.get(e.uploadName);t&&URL.revokeObjectURL(t);let n=URL.createObjectURL(e.file);this.previewUrls.set(e.uploadName,n),this.applyPreview(e.uploadName,n),this.finishUpload(e)}applyPreview(e,t){let n;if(typeof CSS<"u"&&CSS.escape)n=CSS.escape(e);else if(/^[\w-]+$/.test(e))n=e;else return;document.querySelectorAll(`[data-lvt-upload-preview="${n}"]`).forEach(o=>{o instanceof HTMLImageElement?o.src!==t&&(o.src=t):o.getAttribute("src")!==t&&o.setAttribute("src",t)})}hydratePreviews(e){let t=n=>{let r=n.getAttribute("data-lvt-upload-preview");if(!r)return;let o=this.previewUrls.get(r);o&&(n instanceof HTMLImageElement?n.src!==o&&(n.src=o):n.getAttribute("src")!==o&&n.setAttribute("src",o))};e.matches("[data-lvt-upload-preview]")&&t(e),e.querySelectorAll("[data-lvt-upload-preview]").forEach(t)}revokePreviews(){for(let e of this.pendingHandshakes)e.abort();this.pendingHandshakes.clear();for(let e of this.pendingUploads)e.abort();this.pendingUploads.clear();for(let e of this.previewUrls.values())URL.revokeObjectURL(e);this.previewUrls.clear()}async uploadChunked(e){let{file:t,id:n}=e,r=0;e.abortController=new AbortController;try{for(;r{n.value=""})}cleanupEntries(e,t=5e3){setTimeout(()=>{let n=[];for(let[r,o]of this.entries)e&&o.uploadName!==e||(o.done||o.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 s=r.result.split(",")[1];t(s)},r.onerror=n,r.readAsDataURL(e)})}};gt.UploadHandler=ln});var Cr=_(Ne=>{"use strict";Object.defineProperty(Ne,"__esModule",{value:!0});Ne.Logger=void 0;Ne.createLogger=Po;var Ar={silent:0,error:1,warn:2,info:3,debug:4},Tr="LiveTemplate",mt=class i{constructor(e,t=[],n=console){this.state=e,this.scope=t,this.sink=n}setLevel(e){this.state.level=e}getLevel(){return this.state.level}child(e){return new i(this.state,[...this.scope,e],this.sink)}isDebugEnabled(){return this.shouldLog("debug")}error(...e){this.log("error","error",e)}warn(...e){this.log("warn","warn",e)}info(...e){this.log("info","info",e)}debug(...e){this.log("debug","debug",e)}log(e,t,n){if(!this.shouldLog(e))return;(this.sink[t]||console[t]||console.log).apply(this.sink,[this.formatPrefix(),...n])}shouldLog(e){return Ar[e]<=Ar[this.state.level]}formatPrefix(){return this.scope.length===0?`[${Tr}]`:`[${Tr}:${this.scope.join(":")}]`}};Ne.Logger=mt;function Po(i={}){let e={level:i.level??"info"},t=Array.isArray(i.scope)?i.scope:i.scope?[i.scope]:[];return new mt(e,t,i.sink??console)}});var Lr=_(vt=>{"use strict";Object.defineProperty(vt,"__esModule",{value:!0});vt.loadAndApplyUpdate=No;vt.compareHTML=Fo;async function No(i,e){try{let t=globalThis?.require;if(typeof t=="function"){let o=t("fs"),s=JSON.parse(o.readFileSync(e,"utf8"));return i.applyUpdate(s)}let r=await(await fetch(e)).json();return i.applyUpdate(r)}catch(t){throw new Error(`Failed to load update from ${e}: ${t}`)}}function Fo(i,e){let t=[],n=l=>l.replace(/\s+/g," ").replace(/>\s+<").trim(),r=n(i),o=n(e);if(r===o)return{match:!0,differences:[]};let s=r.split(` `),a=o.split(` -`),c=Math.max(s.length,a.length);for(let l=0;l{"use strict";var bo=j&&j.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(j,"__esModule",{value:!0});j.LiveTemplateClient=j.setupReactiveAttributeListeners=j.compareHTML=j.loadAndApplyUpdate=void 0;var vo=bo(At()),yo=hn(),P=Tn(),wo=Fn(),ko=Kn(),Eo=Vn(),xo=Gn(),So=Yn(),Ao=de(),To=Jn(),ht=$t(),wr=Zn(),kr=sr(),Co=Ot(),Lo=lr(),He=cr(),Mo=dr(),_o=ur(),Io=pr(),Ro=gr(),Er=vr(),xr=yr();Object.defineProperty(j,"loadAndApplyUpdate",{enumerable:!0,get:function(){return xr.loadAndApplyUpdate}});Object.defineProperty(j,"compareHTML",{enumerable:!0,get:function(){return xr.compareHTML}});var Do=de();Object.defineProperty(j,"setupReactiveAttributeListeners",{enumerable:!0,get:function(){return Do.setupReactiveAttributeListeners}});var pt=class i{constructor(e={}){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1,this.lvtId=null,this.ws=null,this.wrapperElement=null,this.useHTTP=!1,this.sessionCookie=null,this.rateLimitedHandlers=new WeakMap,this.isInitialized=!1,this.messageCount=0,this.navigationEpoch=0,this.liveUrlOverride=null,this.visibilityHandlerAttached=!1,this.hiddenAt=0,this.reconnecting=!1,this.visibilityHandler=null,this.pageshowHandler=null,this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...o}=e,s=n??(r?"debug":"info"),a=t??(0,Er.createLogger)({level:s});t?n?t.setLevel(n):r&&t.setLevel("debug"):a.setLevel(s),this.logger=a.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...o},this.treeRenderer=new Lo.TreeRenderer(this.logger.child("TreeRenderer")),this.rangeDomApplier=new He.RangeDomApplier({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,h)=>this.treeRenderer.renderRangeItem(c,l,d,h),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let h=d.m?.idKey;for(let u of d.d)if(!(!u||typeof u!="object")&&(u._k===l||h&&u[h]!==void 0&&String(u[h])===l))return u;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new yo.FocusManager(this.logger.child("FocusManager")),this.formLifecycleManager=new Mo.FormLifecycleManager,this.loadingIndicator=new xo.LoadingIndicator,this.formDisabler=new So.FormDisabler,this.uploadHandler=new Ro.UploadHandler(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))}}),this.eventDelegator=new wo.EventDelegator({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new ko.LinkInterceptor({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new Eo.ObserverManager({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new _o.ChangeAutoWirer({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Io.WebSocketManager({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),this.options.onConnect?.(),this.wrapperElement?.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{this.ws=null,this.logger.info("WebSocket disconnected"),this.options.onDisconnect?.(),this.wrapperElement?.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{this.logger.error("WebSocket error:",c),this.options.onError?.(c)}})}static autoInit(){let e=(0,Er.createLogger)({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new i;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement));let s=n.getAttribute("data-lvt-loading-debounce-ms")??document.body?.getAttribute("data-lvt-loading-debounce-ms")??null;if(s!==null&&/^\d+$/.test(s)){let a=parseInt(s,10);Number.isFinite(a)&&a>=0&&n.addEventListener("lvt:updated",()=>{r.loadingIndicator.enablePerActionIndicator(a)},{once:!0,capture:!0})}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){let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let o=r;try{this.handleUploadStartResponse(o)}catch(s){this.logger.error("Error handling upload start response:",s)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,(0,ht.openFromHash)()),this.wrapperElement&&(e.meta?.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:e.meta?.action,success:e.meta?.success}})))}async connect(e="[data-lvt-id]"){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"),this.options.onConnect?.(),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),(0,P.setupToastClickOutside)(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),(0,Ao.setupReactiveAttributeListeners)(),(0,To.setupInvokerPolyfill)(),(0,ht.setupHashLink)(),this.wrapperElement&&(0,P.handleURLHashDirective)(this.wrapperElement,n=>this.send(n)),(0,P.setupFxLifecycleListeners)(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.eventDelegator.teardownDOMEventTriggerDelegation(),(0,ht.teardownHashLink)(),(0,P.teardownAutoClickTimers)(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&((0,P.teardownFxDOMEventTriggers)(this.wrapperElement),(0,P.teardownFxLifecycleListeners)(this.wrapperElement),(0,wr.teardownScrollAway)(this.wrapperElement),(0,kr.teardownSpy)(this.wrapperElement),(0,P.teardownAreaSelectForRoot)(this.wrapperElement),(0,P.teardownURLHashForRoot)(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document>"u"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document>"u")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let e=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!e.usingWebSocket,this.useHTTP&&(this.ws=null,e.initialState&&this.wrapperElement&&this.handleWebSocketPayload(e.initialState)),this.wrapperElement?.dispatchEvent(new Event("lvt:reconnected"))}catch(e){this.logger.error("Visibility reconnect failed:",e)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((s,a)=>{r.has(a)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:a,href:e}),r.add(a),n[a]=s});let o=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let s=this.webSocketManager.getReadyState();return s===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:s}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:s}),!1}return this.liveUrlOverride=o,this.webSocketManager.setLiveUrl(o),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(),o=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!o.ok)throw new Error(`HTTP multipart request failed: ${o.status}`);let s=await o.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,s.tree,s.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let o=e.querySelectorAll('link[rel~="stylesheet"][href]'),s=new Set;if(o.forEach(c=>{let l=c.getAttribute("href");if(l)try{s.add(new URL(l,t).href)}catch{s.add(l)}}),r.size!==s.size)return!0;let a=!1;return r.forEach(c=>{s.has(c)||(a=!0)}),a}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),o=this.wrapperElement.getAttribute("data-lvt-id"),s=r.querySelector("title")?.textContent;if(s&&(document.title=s),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let a=r.querySelector("[data-lvt-id]");if(a){let l=a.getAttribute("data-lvt-id");if(!l){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(o),this.eventDelegator.teardownForWrapper(o);let d=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",l),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 h=window.location.pathname+window.location.search;if(this.liveUrlOverride=h,this.webSocketManager.setLiveUrl(h),!this.useHTTP){let g=`[data-lvt-id="${l.replace(/[\\"]/g,"\\$&")}"]`;this.connect(g).catch(v=>{d===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",v),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(o),this.eventDelegator.teardownForWrapper(o),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(l=>l.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/([\s\S]*?)<\/body>/))return e;let c=`
`+r+"
";return e.replace(/[\s\S]*?<\/body>/,`${c}`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),o=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>o(d));if(!r.changed&&!o(t)){n&&this.formLifecycleManager.handleResponse(n);return}let s=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 tag:",r.html.includes("
")),this.logger.debug("[updateDOM] Has tag:",r.html.includes("")),this.logger.debug("[updateDOM] Has tag:",r.html.includes("]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,u=new DOMParser().parseFromString(`<${d}>${r.html}`,"text/html"),g=u.body.firstElementChild;g?s.replaceChildren(...Array.from(g.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),s.replaceChildren(...Array.from(u.body.childNodes)))}else s.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",s.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has
:",s.innerHTML.includes("
")),this.logger.debug("[updateDOM] tempWrapper has :",s.innerHTML.includes("")),this.logger.debug("[updateDOM] tempWrapper has :",s.innerHTML.includes("{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(He.TARGETED_SKIP_ATTR))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let h=d.attributes,u=l;for(let g=0;g4&&v.charCodeAt(0)===108&&v.charCodeAt(1)===118&&v.charCodeAt(2)===116&&v.charCodeAt(3)===45&&!u.hasAttribute(v)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let h=l.attributes,u=d;for(let g=0;g{l instanceof HTMLTextAreaElement&&(l.value=l.textContent??""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{l instanceof HTMLTextAreaElement&&(l.value=l.textContent??""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let h of r.targetedOps){let u=this.rangeDomApplier.apply(e,h,c);u?(u.setAttribute(He.TARGETED_APPLIED_ATTR,""),l.push(u)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let u of l)u.removeAttribute(He.TARGETED_APPLIED_ATTR);let h=this.treeRenderer.renderState();s.innerHTML=h}else this.replaceTargetedSkipPlaceholders(s)}try{(0,vo.default)(e,s,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}(0,Co.hydrateRedactedTokens)(e),this.focusManager.restoreFocusedElement(),(0,P.handleScrollDirectives)(e),(0,P.handleHighlightDirectives)(e),(0,P.handleAnimateDirectives)(e),(0,P.handleToastDirectives)(e),(0,P.handleAutoClickDirectives)(e),(0,P.handleAreaSelectDirectives)(e,l=>this.send(l)),(0,P.handleURLHashDirective)(e,l=>this.send(l)),(0,P.handleShadowRootHydration)(e),(0,wr.setupScrollAway)(e),(0,kr.setupSpy)(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&((0,P.setupFxDOMEventTriggers)(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let o=r;o.nodeValue&&/^lvt-targeted-skip:.+$/.test(o.nodeValue)&&n.push(o)}for(let o of n){let s=o.nodeValue.match(/^lvt-targeted-skip:(.+)$/),a=s?s[1]:"",c=o.parentElement;c&&c.setAttribute(He.TARGETED_SKIP_ATTR,a),o.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};j.LiveTemplateClient=pt;typeof window<"u"&&pt.autoInit()});var Fo={};Or(Fo,{BaseBlock:()=>K,InteractiveBlock:()=>we,MessageRouter:()=>me,MonacoEditor:()=>Ee,OutputPanel:()=>xe,PersistenceManager:()=>be,RunButton:()=>Se,ServerBlock:()=>ye,TabsController:()=>ve,TinkerdownClient:()=>Ce,TinyGoExecutor:()=>Ae,WasmBlock:()=>Te,hasEditableBlocks:()=>mt,initializeWasm:()=>Tr,isMonacoLoaded:()=>Ar,loadMonaco:()=>Pe,preloadMonaco:()=>gt});var Lr=xt(ft());var Ho="__expressions__",me=class{constructor(e=!1){this.handlers=new Map;this.debug=e}register(e,t){this.handlers.has(e)&&console.warn(`[MessageRouter] Overwriting handler for block: ${e}`),this.handlers.set(e,t),this.debug&&console.log(`[MessageRouter] Registered handler for block: ${e}`)}unregister(e){this.handlers.delete(e),this.debug&&console.log(`[MessageRouter] Unregistered handler for block: ${e}`)}route(e){try{let t=typeof e=="string"?JSON.parse(e):e,{blockID:n,action:r,data:o,execMeta:s,cacheMeta:a}=t;if(r==="reload"){this.handleReload(o?.filePath||"");return}if(n===Ho&&r==="expr-update"){this.handleExpressionUpdate(o);return}if(!n){console.error("[MessageRouter] Message missing blockID:",t);return}let c=this.handlers.get(n);if(!c){console.warn(`[MessageRouter] No handler for block: ${n}`);return}this.debug&&console.log(`[MessageRouter] Routing to ${n}:`,{action:r,data:o}),c(r,o,s,a)}catch(t){console.error("[MessageRouter] Error routing message:",t)}}handleExpressionUpdate(e){this.debug&&console.log("[MessageRouter] Expression update received:",e);for(let[t,n]of Object.entries(e)){let r=document.querySelector(`.tinkerdown-expr[data-expr-id="${t}"]`);if(!r){this.debug&&console.warn(`[MessageRouter] Expression element not found: ${t}`);continue}for(;r.firstChild;)r.removeChild(r.firstChild);if(n&&typeof n=="object"&&"error"in n){let o=document.createElement("span");o.className="expr-error",o.title=String(n.error),o.textContent="\u26A0",r.appendChild(o),r.classList.add("has-error"),r.classList.remove("has-value")}else{let o=this.formatExprValue(n),s=document.createElement("span");s.className="expr-value",s.textContent=o,r.appendChild(s),r.classList.add("has-value"),r.classList.remove("has-error")}r.classList.remove("loading")}}formatExprValue(e){if(e==null)return"\u2013";if(typeof e=="boolean")return e?"\u2713":"\u2717";if(typeof e=="number")return Number.isNaN(e)?"NaN":Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():e.toLocaleString(void 0,{minimumFractionDigits:0,maximumFractionDigits:2}):e>0?"\u221E":"-\u221E";if(typeof e=="string")return e;if(Array.isArray(e))return e.length===0?"[]":e.length<=3?e.map(t=>this.formatExprValue(t)).join(", "):`[${e.length} items]`;if(typeof e=="object"){let t=Object.keys(e);return t.length===0?"{}":`{${t.length} fields}`}return String(e)}handleReload(e){console.log(`[MessageRouter] Page reloading: ${e} changed`),this.showReloadNotification(e),setTimeout(()=>{window.location.reload()},500)}showReloadNotification(e){let t=document.getElementById("livemdtools-reload-notification");t&&t.remove();let n=document.createElement("div");n.id="livemdtools-reload-notification",n.innerHTML=` +`),c=Math.max(s.length,a.length);for(let l=0;l{"use strict";var $o=j&&j.__importDefault||function(i){return i&&i.__esModule?i:{default:i}};Object.defineProperty(j,"__esModule",{value:!0});j.LiveTemplateClient=j.setupReactiveAttributeListeners=j.compareHTML=j.loadAndApplyUpdate=void 0;var Bo=$o(_t()),Uo=bn(),D=On(),qo=Vn(),Wo=tr(),zo=nr(),jo=rr(),Ko=ir(),Vo=ue(),Go=sr(),bt=jt(),Mr=lr(),_r=gr(),Yo=Ut(),Xo=vr(),Fe=br(),Jo=yr(),Qo=wr(),Zo=Er(),es=Sr(),Rr=Cr(),Ir=Lr();Object.defineProperty(j,"loadAndApplyUpdate",{enumerable:!0,get:function(){return Ir.loadAndApplyUpdate}});Object.defineProperty(j,"compareHTML",{enumerable:!0,get:function(){return Ir.compareHTML}});var ts=ue();Object.defineProperty(j,"setupReactiveAttributeListeners",{enumerable:!0,get:function(){return ts.setupReactiveAttributeListeners}});var yt=class i{constructor(e={}){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1,this.lvtId=null,this.ws=null,this.wrapperElement=null,this.useHTTP=!1,this.sessionCookie=null,this.rateLimitedHandlers=new WeakMap,this.isInitialized=!1,this.messageCount=0,this.navigationEpoch=0,this.liveUrlOverride=null,this.visibilityHandlerAttached=!1,this.hiddenAt=0,this.reconnecting=!1,this.visibilityHandler=null,this.pageshowHandler=null,this.visibilityReconnectTimer=null;let{logger:t,logLevel:n,debug:r,...o}=e,s=n??(r?"debug":"info"),a=t??(0,Rr.createLogger)({level:s});t?n?t.setLevel(n):r&&t.setLevel("debug"):a.setLevel(s),this.logger=a.child("Client"),this.options={autoReconnect:!1,reconnectDelay:1e3,liveUrl:window.location.pathname+window.location.search,...o},this.treeRenderer=new Xo.TreeRenderer(this.logger.child("TreeRenderer")),this.rangeDomApplier=new Fe.RangeDomApplier({logger:this.logger.child("RangeDomApplier"),renderItem:(c,l,d,h)=>this.treeRenderer.renderRangeItem(c,l,d,h),executeLifecycleHook:(c,l)=>this.executeLifecycleHook(c,l),itemLookup:(c,l)=>{let d=this.treeRenderer.getTreeState()[c];if(!d||!Array.isArray(d.d))return null;let h=d.m?.idKey;for(let u of d.d)if(!(!u||typeof u!="object")&&(u._k===l||h&&u[h]!==void 0&&String(u[h])===l))return u;return null},onNodeAdded:()=>{this.nodesAddedThisRender++}}),this.focusManager=new Uo.FocusManager(this.logger.child("FocusManager")),this.formLifecycleManager=new Jo.FormLifecycleManager,this.loadingIndicator=new jo.LoadingIndicator,this.formDisabler=new Ko.FormDisabler,this.uploadHandler=new es.UploadHandler(c=>this.send(c),{chunkSize:256*1024,onProgress:c=>{this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:progress",{detail:{entry:c}}))},onComplete:(c,l)=>{this.logger.info(`Upload complete: ${c}`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:complete",{detail:{uploadName:c,entries:l}}))},onError:(c,l)=>{this.logger.error(`Upload error for ${c.id}:`,l),this.wrapperElement&&this.wrapperElement.dispatchEvent(new CustomEvent("lvt:upload:error",{detail:{entry:c,error:l}}))},postMultipartUpload:(c,l)=>this.postUploadMultipart(c,l),isConnected:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1,postUploadStart:(c,l)=>this.postUploadStartHTTP(c,l),postUploadComplete:(c,l)=>this.postUploadCompleteHTTP(c,l)}),this.eventDelegator=new qo.EventDelegator({getWrapperElement:()=>this.wrapperElement,getRateLimitedHandlers:()=>this.rateLimitedHandlers,parseValue:c=>this.parseValue(c),send:c=>this.send(c),sendHTTPMultipart:(c,l,d)=>this.sendHTTPMultipart(c,l,d),setActiveSubmission:(c,l,d)=>this.formLifecycleManager.setActiveSubmission(c,l,d),getWebSocketReadyState:()=>this.webSocketManager.getReadyState(),triggerPendingUploads:c=>this.uploadHandler.triggerPendingUploads(c)},this.logger.child("EventDelegator")),this.linkInterceptor=new Wo.LinkInterceptor({getWrapperElement:()=>this.wrapperElement,handleNavigationResponse:(c,l)=>this.handleNavigationResponse(c,l),sendNavigate:c=>this.sendNavigate(c),canSendNavigate:()=>!this.useHTTP&&this.webSocketManager.getReadyState()===1},this.logger.child("LinkInterceptor")),this.observerManager=new zo.ObserverManager({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ObserverManager")),this.changeAutoWirer=new Qo.ChangeAutoWirer({getWrapperElement:()=>this.wrapperElement,send:c=>this.send(c)},this.logger.child("ChangeAutoWirer")),this.webSocketManager=new Zo.WebSocketManager({options:this.options,logger:this.logger.child("Transport"),onConnected:()=>{this.ws=this.webSocketManager.getSocket(),this.logger.info("WebSocket connected"),this.clearFlashQueryParams(),this.options.onConnect?.(),this.wrapperElement?.dispatchEvent(new Event("lvt:connected"))},onDisconnected:()=>{this.ws=null,this.logger.info("WebSocket disconnected"),this.options.onDisconnect?.(),this.wrapperElement?.dispatchEvent(new Event("lvt:disconnected"))},onMessage:(c,l)=>{this.handleWebSocketPayload(c,l)},onReconnectAttempt:()=>{this.logger.info("Attempting to reconnect...")},onError:c=>{this.logger.error("WebSocket error:",c),this.options.onError?.(c)}})}static autoInit(){let e=(0,Rr.createLogger)({scope:"Client:autoInit"}),t=()=>{let n=document.querySelector("[data-lvt-id]");if(n){let r=new i;r.wrapperElement=n,n.getAttribute("data-lvt-loading")==="true"&&(r.loadingIndicator.show(),r.formDisabler.disable(r.wrapperElement));let s=n.getAttribute("data-lvt-loading-debounce-ms")??document.body?.getAttribute("data-lvt-loading-debounce-ms")??null;if(s!==null&&/^\d+$/.test(s)){let a=parseInt(s,10);Number.isFinite(a)&&a>=0&&n.addEventListener("lvt:updated",()=>{r.loadingIndicator.enablePerActionIndicator(a)},{once:!0,capture:!0})}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){let n=e;if(n.type==="error"){if(typeof n.code!="string"){this.logger.warn("Malformed error envelope (missing string `code`) \u2014 dropping",n);return}this.wrapperElement?this.wrapperElement.dispatchEvent(new CustomEvent("lvt:error",{detail:{code:n.code,topic:n.topic}})):this.logger.warn("lvt:error envelope arrived before wrapperElement was set; dropping",{code:n.code,topic:n.topic});return}let r=e;if(r.type==="upload_progress"){this.uploadHandler.handleProgressMessage(r);return}if(r.upload_name&&r.entries){let o=r;try{this.handleUploadStartResponse(o)}catch(s){this.logger.error("Error handling upload start response:",s)}return}if(r.upload_name&&r.hasOwnProperty("success")){r.success?this.logger.info(`Upload complete: ${r.upload_name}`):this.logger.error(`Upload failed: ${r.upload_name}`,r.error);return}this.isInitialized||(this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.wrapperElement&&this.wrapperElement.hasAttribute("data-lvt-loading")&&this.wrapperElement.removeAttribute("data-lvt-loading"),this.isInitialized=!0,(0,bt.openFromHash)()),this.wrapperElement&&(e.meta?.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:e.meta?.action,success:e.meta?.success}})))}async connect(e="[data-lvt-id]"){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"),this.options.onConnect?.(),t.initialState&&this.wrapperElement&&this.handleWebSocketPayload(t.initialState)),this.eventDelegator.setupEventDelegation(),this.wrapperElement&&this.uploadHandler.initializeFileInputs(this.wrapperElement),this.eventDelegator.setupWindowEventDelegation(),this.eventDelegator.setupClickAwayDelegation(),this.eventDelegator.setupDOMEventTriggerDelegation(),(0,D.setupToastClickOutside)(),this.eventDelegator.setupFocusTrapDelegation(),this.eventDelegator.setupAutofocusDelegation(),this.linkInterceptor.setup(this.wrapperElement),(0,Vo.setupReactiveAttributeListeners)(),(0,Go.setupInvokerPolyfill)(),(0,bt.setupHashLink)(),this.wrapperElement&&(0,D.handleURLHashDirective)(this.wrapperElement,n=>this.send(n)),(0,D.setupFxLifecycleListeners)(this.wrapperElement),this.focusManager.attach(this.wrapperElement),this.observerManager.setupInfiniteScrollObserver(),this.observerManager.setupInfiniteScrollMutationObserver(),this.setupVisibilityReconnect()}disconnect(){this.webSocketManager.disconnect(),this.ws=null,this.useHTTP=!1,this.hiddenAt=0,this.reconnecting=!1,this.teardownVisibilityReconnect(),this.uploadHandler.revokePreviews(),this.eventDelegator.teardownDOMEventTriggerDelegation(),(0,bt.teardownHashLink)(),(0,D.teardownAutoClickTimers)(),this.loadingIndicator.disablePerActionIndicator(),this.wrapperElement&&((0,D.teardownFxDOMEventTriggers)(this.wrapperElement),(0,D.teardownFxLifecycleListeners)(this.wrapperElement),(0,Mr.teardownScrollAway)(this.wrapperElement),(0,_r.teardownSpy)(this.wrapperElement),(0,D.teardownAreaSelectForRoot)(this.wrapperElement),(0,D.teardownRegionSelectForRoot)(this.wrapperElement),(0,D.teardownProxyBridgeForRoot)(this.wrapperElement),(0,D.teardownIframeAutoHeightForRoot)(this.wrapperElement),(0,D.teardownURLHashForRoot)(this.wrapperElement)),this.resetSessionState()}resetSessionState(){this.treeRenderer.reset(),this.rangeDomApplier.invalidate(),this.focusManager.reset(),this.observerManager.teardown(),this.changeAutoWirer.teardown(),this.formLifecycleManager.reset(),this.loadingIndicator.hide(),this.formDisabler.enable(this.wrapperElement),this.lvtId=null,this.isInitialized=!1}setupVisibilityReconnect(){this.visibilityHandlerAttached||typeof document>"u"||(this.visibilityHandlerAttached=!0,this.visibilityHandler=()=>{if(document.hidden){!this.useHTTP&&this.webSocketManager.getReadyState()===1&&(this.hiddenAt=Date.now());return}if(this.hiddenAt===0)return;let e=Date.now()-this.hiddenAt;this.hiddenAt=0,!(e<3e3)&&this.scheduleVisibilityReconnect()},this.pageshowHandler=e=>{e.persisted&&this.scheduleVisibilityReconnect()},document.addEventListener("visibilitychange",this.visibilityHandler),window.addEventListener("pageshow",this.pageshowHandler))}teardownVisibilityReconnect(){this.visibilityReconnectTimer!==null&&(clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=null),!(!this.visibilityHandlerAttached||typeof document>"u")&&(this.visibilityHandler&&(document.removeEventListener("visibilitychange",this.visibilityHandler),this.visibilityHandler=null),this.pageshowHandler&&(window.removeEventListener("pageshow",this.pageshowHandler),this.pageshowHandler=null),this.visibilityHandlerAttached=!1)}scheduleVisibilityReconnect(){this.visibilityReconnectTimer!==null&&clearTimeout(this.visibilityReconnectTimer),this.visibilityReconnectTimer=setTimeout(()=>{this.visibilityReconnectTimer=null,this.wrapperElement&&!this.useHTTP&&!this.reconnecting&&this.webSocketManager.getReadyState()!==void 0&&this.performVisibilityReconnect()},500)}async performVisibilityReconnect(){if(!this.reconnecting){this.reconnecting=!0;try{this.logger.info("Reconnecting after visibility change"),this.webSocketManager.disconnect(),this.ws=null,this.resetSessionState();let e=await this.webSocketManager.connect();if(!this.reconnecting)return;this.useHTTP=!e.usingWebSocket,this.useHTTP&&(this.ws=null,e.initialState&&this.wrapperElement&&this.handleWebSocketPayload(e.initialState)),this.wrapperElement?.dispatchEvent(new Event("lvt:reconnected"))}catch(e){this.logger.error("Visibility reconnect failed:",e)}finally{this.reconnecting=!1}}}clearFlashQueryParams(){let e=new URL(window.location.href),t=["error","success"],n=!1;for(let r of t)e.searchParams.has(r)&&(e.searchParams.delete(r),n=!0);n&&(this.logger.debug("Clearing flash query params from URL"),window.history.replaceState(null,"",e.toString()))}isReady(){let e=this.wrapperElement;return!e||e.hasAttribute("data-lvt-loading")?!1:this.useHTTP?!0:this.webSocketManager.getReadyState()===1}send(e){let t=this.webSocketManager.getReadyState();this.logger.isDebugEnabled()&&this.logger.debug("send() invoked",{message:e,useHTTP:this.useHTTP,hasWebSocket:t!==void 0,readyState:t}),this.useHTTP?(this.logger.debug("Using HTTP mode for send"),this.sendHTTP(e)):t===1?(this.logger.debug("Sending via WebSocket"),this.webSocketManager.send(JSON.stringify(e))):t!==void 0?(this.logger.warn(`WebSocket not ready (state: ${t}), using HTTP fallback`),this.sendHTTP(e)):this.logger.error("No transport available")}getLiveUrl(){return this.liveUrlOverride||this.options.liveUrl||"/live"}sendNavigate(e){let t=new URL(e,window.location.origin),n={},r=new Set;t.searchParams.forEach((s,a)=>{r.has(a)&&this.logger.warn("sendNavigate: duplicate query param key \u2014 last value wins; server may receive incomplete data",{key:a,href:e}),r.add(a),n[a]=s});let o=t.pathname+t.search;if(this.webSocketManager.getReadyState()!==1){let s=this.webSocketManager.getReadyState();return s===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:s}):this.logger.error("sendNavigate: WS not open and autoReconnect is disabled; navigate may be permanently lost",{href:e,readyState:s}),!1}return this.liveUrlOverride=o,this.webSocketManager.setLiveUrl(o),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(),o=await fetch(r,{method:"POST",credentials:"include",headers:{Accept:"application/json"},body:n});if(!o.ok)throw new Error(`HTTP multipart request failed: ${o.status}`);let s=await o.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,s.tree,s.meta)}catch(r){this.logger.error("Failed to send HTTP multipart request:",r)}}async postUploadMultipart(e,t){let n=this.getLiveUrl(),r=await fetch(n,{method:"POST",credentials:"include",headers:{Accept:"application/json","X-Lvt-Upload":"proxied"},body:e,signal:t});if(!r.ok){let s=(await r.text().catch(()=>"")).trim();throw new Error(`Multipart upload failed: ${r.status}${s?` \u2014 ${s}`:""}`)}let o=await r.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,o.tree,o.meta)}async postUploadStartHTTP(e,t){let n=await fetch(this.getLiveUrl(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json","X-Lvt-Upload":"start"},body:JSON.stringify(e),signal:t});if(!n.ok){let r=(await n.text().catch(()=>"")).trim();throw new Error(`upload_start handshake failed: ${n.status}${r?` \u2014 ${r}`:""}`)}return await n.json()}async postUploadCompleteHTTP(e,t){let n=await fetch(this.getLiveUrl(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json","X-Lvt-Upload":"complete"},body:JSON.stringify(e),signal:t});if(!n.ok){let o=(await n.text().catch(()=>"")).trim();throw new Error(`upload_complete handshake failed: ${n.status}${o?` \u2014 ${o}`:""}`)}let r=await n.json();this.wrapperElement&&this.updateDOM(this.wrapperElement,r.tree,r.meta)}stylesheetsDiffer(e,t){let n=document.querySelectorAll('link[rel~="stylesheet"][href]'),r=new Set;n.forEach(c=>{let l=c.href;l&&r.add(l)});let o=e.querySelectorAll('link[rel~="stylesheet"][href]'),s=new Set;if(o.forEach(c=>{let l=c.getAttribute("href");if(l)try{s.add(new URL(l,t).href)}catch{s.add(l)}}),r.size!==s.size)return!0;let a=!1;return r.forEach(c=>{s.has(c)||(a=!0)}),a}performFullNavigation(e){window.location.href=e}handleNavigationResponse(e,t){if(!this.wrapperElement)return;let r=new DOMParser().parseFromString(e,"text/html"),o=this.wrapperElement.getAttribute("data-lvt-id"),s=r.querySelector("title")?.textContent;if(s&&(document.title=s),this.stylesheetsDiffer(r,t)){this.logger.info('Cross-app navigation detected (different set in fetched HTML); falling back to full navigation'),this.performFullNavigation(t);return}let a=r.querySelector("[data-lvt-id]");if(a){let l=a.getAttribute("data-lvt-id");if(!l){this.logger.warn("Cross-handler navigation: new wrapper has empty data-lvt-id"),window.location.reload();return}this.linkInterceptor.teardownForWrapper(o),this.eventDelegator.teardownForWrapper(o);let d=++this.navigationEpoch;this.disconnect(),this.wrapperElement.setAttribute("data-lvt-id",l),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 h=window.location.pathname+window.location.search;if(this.liveUrlOverride=h,this.webSocketManager.setLiveUrl(h),!this.useHTTP){let p=`[data-lvt-id="${l.replace(/[\\"]/g,"\\$&")}"]`;this.connect(p).catch(v=>{d===this.navigationEpoch&&(this.logger.error("Cross-handler reconnect failed:",v),window.location.reload())})}return}this.linkInterceptor.teardownForWrapper(o),this.eventDelegator.teardownForWrapper(o),this.disconnect();let c=r.querySelector("body");c&&this.wrapperElement.replaceChildren(...Array.from(c.childNodes).map(l=>l.cloneNode(!0))),this.eventDelegator.setupEventDelegation(),this.linkInterceptor.setup(this.wrapperElement)}parseValue(e){let t=e.trim(),n=parseFloat(t);if(!isNaN(n)){if(Number.isInteger(n)&&Math.abs(n)>Number.MAX_SAFE_INTEGER)return t;if(t===n.toString())return n}return e==="true"?!0:e==="false"?!1:e}applyUpdate(e){return this.treeRenderer.applyUpdate(e)}applyUpdateToHTML(e,t){let n=this.applyUpdate(t);if(!this.lvtId){let l=e.match(/data-lvt-id="([^"]+)"/);l&&(this.lvtId=l[1])}let r=n.html;if(!e.match(/([\s\S]*?)<\/body>/))return e;let c=`
`+r+"
";return e.replace(/[\s\S]*?<\/body>/,`${c}`)}updateDOM(e,t,n){this.nodesAddedThisRender=0,this.directiveTouchedThisRender=!1;let r=this.treeRenderer.applyUpdate(t,{canApplyTargeted:(l,d)=>this.rangeDomApplier.canApplyTargeted(e,l,d).ok}),o=l=>!l||typeof l!="object"?!1:l.s&&Array.isArray(l.s)?!0:Object.values(l).some(d=>o(d));if(!r.changed&&!o(t)){n&&this.formLifecycleManager.handleResponse(n);return}let s=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
tag:",r.html.includes("
")),this.logger.debug("[updateDOM] Has tag:",r.html.includes("")),this.logger.debug("[updateDOM] Has tag:",r.html.includes("]/i.test(r.html)){let l=e.tagName.toLowerCase(),d=l==="body"||l==="html"?"div":l,u=new DOMParser().parseFromString(`<${d}>${r.html}`,"text/html"),p=u.body.firstElementChild;p?s.replaceChildren(...Array.from(p.childNodes)):(this.logger.warn("[updateDOM] DOMParser: no wrapper root element; using doc.body children"),s.replaceChildren(...Array.from(u.body.childNodes)))}else s.innerHTML=r.html;this.logger.isDebugEnabled()&&(this.logger.debug("[updateDOM] tempWrapper.innerHTML (first 500 chars):",s.innerHTML.substring(0,500)),this.logger.debug("[updateDOM] tempWrapper has
:",s.innerHTML.includes("
")),this.logger.debug("[updateDOM] tempWrapper has :",s.innerHTML.includes("")),this.logger.debug("[updateDOM] tempWrapper has :",s.innerHTML.includes("{if(l.nodeType===1)return l.getAttribute("data-key")||l.getAttribute("data-lvt-key")||void 0},onBeforeElUpdated:(l,d)=>{if(d.nodeType===Node.ELEMENT_NODE&&d.hasAttribute(Fe.TARGETED_SKIP_ATTR))return!1;if(d.nodeType===Node.ELEMENT_NODE&&l.nodeType===Node.ELEMENT_NODE){let h=d.attributes,u=l;for(let p=0;p4&&v.charCodeAt(0)===108&&v.charCodeAt(1)===118&&v.charCodeAt(2)===116&&v.charCodeAt(3)===45&&!u.hasAttribute(v)){this.directiveTouchedThisRender=!0;break}}}if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore")&&!d.hasAttribute("data-lvt-force-update"))return!1;if(l.nodeType===Node.ELEMENT_NODE&&l.hasAttribute("lvt-ignore-attrs")&&!d.hasAttribute("data-lvt-force-update")&&d.nodeType===Node.ELEMENT_NODE){let h=l.attributes,u=d;for(let p=0;p{l instanceof HTMLTextAreaElement&&(l.value=l.textContent??""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update")},onNodeAdded:l=>{l instanceof HTMLTextAreaElement&&(l.value=l.textContent??""),l instanceof HTMLElement&&l.hasAttribute("data-lvt-force-update")&&l.removeAttribute("data-lvt-force-update"),l.nodeType===Node.ELEMENT_NODE&&(this.executeLifecycleHook(l,"lvt-mounted"),this.nodesAddedThisRender++)},onBeforeNodeDiscarded:l=>(l.nodeType===Node.ELEMENT_NODE&&this.executeLifecycleHook(l,"lvt-destroyed"),!0)};if(r.targetedOps&&r.targetedOps.length>0){let l=[],d=!1;for(let h of r.targetedOps){let u=this.rangeDomApplier.apply(e,h,c);u?(u.setAttribute(Fe.TARGETED_APPLIED_ATTR,""),l.push(u)):d=!0}if(d){this.logger.warn("[updateDOM] one or more targeted DOM ops failed; rebuilding tempWrapper from treeState for a full morphdom sync");for(let u of l)u.removeAttribute(Fe.TARGETED_APPLIED_ATTR);let h=this.treeRenderer.renderState();s.innerHTML=h}else this.replaceTargetedSkipPlaceholders(s)}try{(0,Bo.default)(e,s,c)}finally{this.rangeDomApplier.cleanupMarkers(e)}(0,Yo.hydrateRedactedTokens)(e),this.uploadHandler.hydratePreviews(e),this.focusManager.restoreFocusedElement(),(0,D.handleScrollDirectives)(e),(0,D.handleHighlightDirectives)(e),(0,D.handleAnimateDirectives)(e),(0,D.handleToastDirectives)(e),(0,D.handleAutoClickDirectives)(e),(0,D.handleAreaSelectDirectives)(e,l=>this.send(l)),(0,D.handleRegionSelectDirectives)(e,l=>this.send(l)),(0,D.handleProxyBridgeDirectives)(e,l=>this.send(l)),(0,D.handleIframeAutoHeightDirectives)(e),(0,D.handleURLHashDirective)(e,l=>this.send(l)),(0,D.handleShadowRootHydration)(e),(0,Mr.setupScrollAway)(e),(0,_r.setupSpy)(e),(this.nodesAddedThisRender>0||this.directiveTouchedThisRender)&&((0,D.setupFxDOMEventTriggers)(e,this.wrapperElement||void 0),this.eventDelegator.setupDOMEventTriggerDelegation(e),this.uploadHandler.initializeFileInputs(e)),this.changeAutoWirer.wireElements(),n&&this.formLifecycleManager.handleResponse(n)}handleUploadStartResponse(e){this.uploadHandler.handleUploadStartResponse(e)}replaceTargetedSkipPlaceholders(e){let t=document.createTreeWalker(e,NodeFilter.SHOW_COMMENT),n=[],r;for(;r=t.nextNode();){let o=r;o.nodeValue&&/^lvt-targeted-skip:.+$/.test(o.nodeValue)&&n.push(o)}for(let o of n){let s=o.nodeValue.match(/^lvt-targeted-skip:(.+)$/),a=s?s[1]:"",c=o.parentElement;c&&c.setAttribute(Fe.TARGETED_SKIP_ATTR,a),o.remove()}}executeLifecycleHook(e,t){let n=e.getAttribute(t);if(n)try{new Function("element",n).call(e,e)}catch(r){this.logger.error(`Error executing ${t} hook:`,r)}}reset(){this.resetSessionState()}getTreeState(){return this.treeRenderer.getTreeState()}getStaticStructure(){return this.treeRenderer.getStaticStructure()}};j.LiveTemplateClient=yt;typeof window<"u"&&yt.autoInit()});var ss={};zr(ss,{BaseBlock:()=>K,InteractiveBlock:()=>Ee,MessageRouter:()=>be,MonacoEditor:()=>Se,OutputPanel:()=>Ae,PersistenceManager:()=>ye,RunButton:()=>Te,ServerBlock:()=>ke,TabsController:()=>we,TinkerdownClient:()=>Me,TinyGoExecutor:()=>Ce,WasmBlock:()=>Le,hasEditableBlocks:()=>Et,initializeWasm:()=>Or,isMonacoLoaded:()=>Hr,loadMonaco:()=>Be,preloadMonaco:()=>kt});var Nr=Lt(wt());var ns="__expressions__",be=class{constructor(e=!1){this.handlers=new Map;this.debug=e}register(e,t){this.handlers.has(e)&&console.warn(`[MessageRouter] Overwriting handler for block: ${e}`),this.handlers.set(e,t),this.debug&&console.log(`[MessageRouter] Registered handler for block: ${e}`)}unregister(e){this.handlers.delete(e),this.debug&&console.log(`[MessageRouter] Unregistered handler for block: ${e}`)}route(e){try{let t=typeof e=="string"?JSON.parse(e):e,{blockID:n,action:r,data:o,execMeta:s,cacheMeta:a}=t;if(r==="reload"){this.handleReload(o?.filePath||"");return}if(n===ns&&r==="expr-update"){this.handleExpressionUpdate(o);return}if(!n){console.error("[MessageRouter] Message missing blockID:",t);return}let c=this.handlers.get(n);if(!c){console.warn(`[MessageRouter] No handler for block: ${n}`);return}this.debug&&console.log(`[MessageRouter] Routing to ${n}:`,{action:r,data:o}),c(r,o,s,a)}catch(t){console.error("[MessageRouter] Error routing message:",t)}}handleExpressionUpdate(e){this.debug&&console.log("[MessageRouter] Expression update received:",e);for(let[t,n]of Object.entries(e)){let r=document.querySelector(`.tinkerdown-expr[data-expr-id="${t}"]`);if(!r){this.debug&&console.warn(`[MessageRouter] Expression element not found: ${t}`);continue}for(;r.firstChild;)r.removeChild(r.firstChild);if(n&&typeof n=="object"&&"error"in n){let o=document.createElement("span");o.className="expr-error",o.title=String(n.error),o.textContent="\u26A0",r.appendChild(o),r.classList.add("has-error"),r.classList.remove("has-value")}else{let o=this.formatExprValue(n),s=document.createElement("span");s.className="expr-value",s.textContent=o,r.appendChild(s),r.classList.add("has-value"),r.classList.remove("has-error")}r.classList.remove("loading")}}formatExprValue(e){if(e==null)return"\u2013";if(typeof e=="boolean")return e?"\u2713":"\u2717";if(typeof e=="number")return Number.isNaN(e)?"NaN":Number.isFinite(e)?Number.isInteger(e)?e.toLocaleString():e.toLocaleString(void 0,{minimumFractionDigits:0,maximumFractionDigits:2}):e>0?"\u221E":"-\u221E";if(typeof e=="string")return e;if(Array.isArray(e))return e.length===0?"[]":e.length<=3?e.map(t=>this.formatExprValue(t)).join(", "):`[${e.length} items]`;if(typeof e=="object"){let t=Object.keys(e);return t.length===0?"{}":`{${t.length} fields}`}return String(e)}handleReload(e){console.log(`[MessageRouter] Page reloading: ${e} changed`),this.showReloadNotification(e),setTimeout(()=>{window.location.reload()},500)}showReloadNotification(e){let t=document.getElementById("livemdtools-reload-notification");t&&t.remove();let n=document.createElement("div");n.id="livemdtools-reload-notification",n.innerHTML=`
{let n=t.dataset.tabsId;if(!n)return;let r=Array.from(t.querySelectorAll(".tinkerdown-tab")),o=t.querySelector("[data-tabs-content]");if(r.length===0)return;let s={id:n,container:t,tabs:r,activeIndex:0,contentPanel:o};this.tabGroups.set(n,s),r.forEach((a,c)=>{a.addEventListener("click",()=>this.handleTabClick(n,c)),a.addEventListener("keydown",l=>this.handleTabKeydown(l,n,c))}),this.wrapContent(t,o),this.log("Registered tab group:",n,"with",r.length,"tabs")}),this.log("Initialized with",this.tabGroups.size,"tab groups")}wrapContent(e,t){if(!t)return;let n=[],r=e.nextSibling;for(;r&&!(r instanceof HTMLElement&&r.classList.contains("tinkerdown-tabs")||r instanceof HTMLElement&&/^H[1-6]$/.test(r.tagName)&&!r.classList.contains("tinkerdown-tabs-heading"));)n.push(r),r=r.nextSibling;n.forEach(o=>{t.appendChild(o)})}handleTabClick(e,t){let n=this.tabGroups.get(e);if(!n)return;this.setActiveTab(n,t);let o=n.tabs[t].dataset.filter||"";this.log("Tab clicked:",e,"index:",t,"filter:",o),this.applyFilter(n,o)}handleTabKeydown(e,t,n){let r=this.tabGroups.get(t);if(!r)return;let o;switch(e.key){case"ArrowLeft":o=n===0?r.tabs.length-1:n-1;break;case"ArrowRight":o=n===r.tabs.length-1?0:n+1;break;case"Home":o=0;break;case"End":o=r.tabs.length-1;break;default:return}e.preventDefault(),this.setActiveTab(r,o),r.tabs[o].focus();let s=r.tabs[o].dataset.filter||"";this.applyFilter(r,s)}setActiveTab(e,t){e.tabs.forEach((n,r)=>{let o=r===t;n.classList.toggle("active",o),n.setAttribute("aria-selected",o?"true":"false"),n.setAttribute("tabindex",o?"0":"-1")}),e.activeIndex=t,e.contentPanel&&e.contentPanel.setAttribute("aria-labelledby",e.tabs[t].id||"")}applyFilter(e,t){let n=e.contentPanel?.querySelector(".tinkerdown-interactive-block");if(!n){this.log("No interactive block found for filtering");return}let r=n.dataset.blockId;if(!r){this.log("Interactive block has no ID");return}this.sendMessage?(this.log("Sending Filter action to block:",r,"filter:",t),this.sendMessage(r,"Filter",{filter:t})):this.log("No message sender configured")}getActiveIndex(e){return this.tabGroups.get(e)?.activeIndex??0}setTab(e,t){let n=this.tabGroups.get(e);!n||t<0||t>=n.tabs.length||this.handleTabClick(e,t)}};var K=class{constructor(e,t,n=!1){this.element=e.element,this.metadata=e.metadata,this.persistence=t,this.initialCode=e.initialCode||"",this.currentCode=this.initialCode,this.debug=n}get id(){return this.metadata.id}get type(){return this.metadata.type}getCode(){return this.currentCode}setCode(e){this.currentCode=e,this.metadata.editable&&this.persistence.saveCode(this.id,e)}reset(){this.setCode(this.initialCode),this.debug&&console.log(`[Block:${this.id}] Reset to initial code`)}loadPersistedCode(){if(!this.metadata.editable)return this.initialCode;let e=this.persistence.loadCode(this.id);return e?(this.debug&&console.log(`[Block:${this.id}] Loaded persisted code`),e):this.initialCode}createBlockWrapper(){let e=document.createElement("div");return e.className=`livemdtools-block livemdtools-block-${this.type}`,e.dataset.blockId=this.id,e.dataset.blockType=this.type,e}log(...e){this.debug&&console.log(`[Block:${this.id}]`,...e)}error(...e){console.error(`[Block:${this.id}]`,...e)}};var ye=class extends K{constructor(t,n,r=!1){super(t,n,r);this.codeElement=null}initialize(){this.log("Initializing server block"),this.codeElement=this.element.querySelector("code")||this.element,this.element.classList.add("livemdtools-server-block"),this.metadata.readonly&&this.element.classList.add("readonly"),this.element.dataset.blockId=this.id,this.element.dataset.language=this.metadata.language,this.render(),this.log("Server block initialized")}destroy(){this.log("Destroying server block")}handleMessage(t,n,r,o){this.log("Received message:",t,n),console.warn(`[ServerBlock:${this.id}] Received unexpected message:`,t)}render(){this.codeElement&&this.log("Rendered server block")}};var Sr=xt(ft());var we=class extends K{constructor(t,n,r=!1){super(t,n,r);this.client=null;this.containerElement=null;this.sendMessage=null;this.pendingForm=null;this.pendingAction=null;this._handleClick=t=>this.handleClick(t);this._handleSubmit=t=>this.handleSubmit(t);this._handleChange=t=>this.handleChange(t);this.execToolbar=null;this.outputPanel=null;this.outputExpanded=!1}initialize(){this.log("Initializing interactive block");let t=this.element.querySelector("[data-interactive-content]");if(t)this.containerElement=t;else{let n=document.createElement("div");for(n.className="exec-content-wrapper",n.dataset.interactiveContent="true";this.element.firstChild;)n.appendChild(this.element.firstChild);this.element.appendChild(n),this.containerElement=n}this.element.classList.add("livemdtools-interactive-block"),this.element.dataset.blockId=this.id,this.metadata.stateRef&&(this.element.dataset.stateRef=this.metadata.stateRef),this.client=new Sr.LiveTemplateClient,this.attachEventHandlers(),this.element.dataset.execSource==="true"&&this.injectExecToolbar(),this.log("Interactive block initialized")}destroy(){this.log("Destroying interactive block"),this.element.removeEventListener("click",this._handleClick,!0),this.element.removeEventListener("submit",this._handleSubmit,!0),this.element.removeEventListener("change",this._handleChange,!0),this.client=null,this.pendingForm=null,this.pendingAction=null}handleMessage(t,n,r,o){switch(this.log("Received message:",t,n),t){case"tree":if(n&&this.containerElement&&this.client&&(this.client.updateDOM(this.containerElement,n),this.log("DOM updated with tree"),o&&this.updateCacheAttributes(o),this.execToolbar&&r&&this.updateExecToolbar(r),this.pendingForm)){let s={success:!0,errors:{},action:this.pendingAction};this.pendingForm.dispatchEvent(new CustomEvent("lvt:success",{bubbles:!0,detail:s})),this.log("Dispatched lvt:success event"),this.pendingForm=null,this.pendingAction=null}break;case"error":if(this.error("Server error:",n.message),this.pendingForm){let s={success:!1,errors:n.errors||{},action:this.pendingAction};this.pendingForm.dispatchEvent(new CustomEvent("lvt:error",{bubbles:!0,detail:s})),this.pendingForm=null,this.pendingAction=null}break;default:this.log("Unknown action:",t)}}setMessageSender(t){this.sendMessage=t}attachEventHandlers(){this.element&&(this.element.addEventListener("click",this._handleClick,!0),this.element.addEventListener("submit",this._handleSubmit,!0),this.element.addEventListener("change",this._handleChange,!0))}handleClick(t){let n=t.target,r=n.closest("button[name]");if(r&&r.form===null&&this.element.contains(r)){if(t.preventDefault(),!this.checkConfirm(r)){this.log("Click action cancelled by user:",r.name);return}let s=this.extractData(r);this.sendAction(r.name,s),this.log("Click action (button name):",r.name,s);return}let o=n.closest("[lvt-on\\:click]");if(o&&this.element.contains(o)){let s=o.getAttribute("lvt-on:click");if(s){if(t.preventDefault(),!this.checkConfirm(o)){this.log("Click action cancelled by user:",s);return}let a=this.extractData(o);this.sendAction(s,a),this.log("Click action (lvt-on:click):",s,a)}}}handleSubmit(t){let n=t.target,r=t.submitter,o="";if(r instanceof HTMLButtonElement&&r.name)o=r.name;else if(n.getAttribute("name"))o=n.getAttribute("name");else return;t.preventDefault();let s=new FormData(n),a={};s.forEach((c,l)=>{r instanceof HTMLButtonElement&&l===r.name||(a[l]=c)}),this.pendingForm=n,this.pendingAction=o,n.dispatchEvent(new CustomEvent("lvt:pending",{bubbles:!0,detail:{action:o}})),this.sendAction(o,a),this.log("Submit action:",o,a)}handleChange(t){let n=t.target,r=n.getAttribute("lvt-on:change");if(r){let o={value:n.value};this.sendAction(r,o),this.log("Change action:",r,o)}}checkConfirm(t){let n=t.dataset.confirm;return!(n&&!window.confirm(n))}extractData(t){let n={};for(let r of Object.keys(t.dataset)){if(r==="confirm")continue;let o=t.dataset[r];o!==void 0&&(n[r]=o)}return n}sendAction(t,n={}){if(!this.sendMessage){this.error("Cannot send action - no message sender configured");return}this.sendMessage(this.id,t,n)}injectExecToolbar(){let t=this.element.dataset.execCommand||"...";this.execToolbar=document.createElement("div"),this.execToolbar.className="exec-toolbar",this.execToolbar.innerHTML=` + `,document.head.appendChild(r),document.body.appendChild(n)}createEnvelope(e,t,n={}){return{blockID:e,action:t,data:n}}getRegisteredBlocks(){return Array.from(this.handlers.keys())}clear(){this.handlers.clear(),this.debug&&console.log("[MessageRouter] Cleared all handlers")}};var ye=class{constructor(e="livemdtools:persistence",t=!0,n=!1){this.storageKey=e,this.enabled=t&&this.isLocalStorageAvailable(),this.debug=n,!this.enabled&&t&&console.warn("[PersistenceManager] localStorage not available, persistence disabled")}isLocalStorageAvailable(){try{let e="__localStorage_test__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return!1}}saveCode(e,t){if(this.enabled)try{let n=this.loadAll();n.code[e]=t,n.timestamp=Date.now(),localStorage.setItem(this.storageKey,JSON.stringify(n)),this.debug&&console.log(`[PersistenceManager] Saved code for block: ${e}`)}catch(n){console.error("[PersistenceManager] Error saving code:",n)}}loadCode(e){if(!this.enabled)return null;try{return this.loadAll().code[e]||null}catch(t){return console.error("[PersistenceManager] Error loading code:",t),null}}loadAll(){if(!this.enabled)return{code:{},timestamp:Date.now()};try{let e=localStorage.getItem(this.storageKey);if(!e)return{code:{},timestamp:Date.now()};let t=JSON.parse(e);return!t.code||typeof t.code!="object"?(console.warn("[PersistenceManager] Invalid data structure, resetting"),{code:{},timestamp:Date.now()}):t}catch(e){return console.error("[PersistenceManager] Error loading data:",e),{code:{},timestamp:Date.now()}}}clearCode(e){if(this.enabled)try{let t=this.loadAll();delete t.code[e],t.timestamp=Date.now(),localStorage.setItem(this.storageKey,JSON.stringify(t)),this.debug&&console.log(`[PersistenceManager] Cleared code for block: ${e}`)}catch(t){console.error("[PersistenceManager] Error clearing code:",t)}}clearAll(){if(this.enabled)try{localStorage.removeItem(this.storageKey),this.debug&&console.log("[PersistenceManager] Cleared all persisted data")}catch(e){console.error("[PersistenceManager] Error clearing all data:",e)}}getPersistedBlocks(){if(!this.enabled)return[];let e=this.loadAll();return Object.keys(e.code)}hasPersistedCode(e){if(!this.enabled)return!1;let t=this.loadAll();return e in t.code}getLastUpdate(){return this.enabled?this.loadAll().timestamp:null}};var we=class{constructor(e=!1){this.tabGroups=new Map;this.sendMessage=null;this.debug=e,this.init()}log(...e){this.debug&&console.log("[TabsController]",...e)}setMessageSender(e){this.sendMessage=e}init(){document.querySelectorAll(".tinkerdown-tabs").forEach(t=>{let n=t.dataset.tabsId;if(!n)return;let r=Array.from(t.querySelectorAll(".tinkerdown-tab")),o=t.querySelector("[data-tabs-content]");if(r.length===0)return;let s={id:n,container:t,tabs:r,activeIndex:0,contentPanel:o};this.tabGroups.set(n,s),r.forEach((a,c)=>{a.addEventListener("click",()=>this.handleTabClick(n,c)),a.addEventListener("keydown",l=>this.handleTabKeydown(l,n,c))}),this.wrapContent(t,o),this.log("Registered tab group:",n,"with",r.length,"tabs")}),this.log("Initialized with",this.tabGroups.size,"tab groups")}wrapContent(e,t){if(!t)return;let n=[],r=e.nextSibling;for(;r&&!(r instanceof HTMLElement&&r.classList.contains("tinkerdown-tabs")||r instanceof HTMLElement&&/^H[1-6]$/.test(r.tagName)&&!r.classList.contains("tinkerdown-tabs-heading"));)n.push(r),r=r.nextSibling;n.forEach(o=>{t.appendChild(o)})}handleTabClick(e,t){let n=this.tabGroups.get(e);if(!n)return;this.setActiveTab(n,t);let o=n.tabs[t].dataset.filter||"";this.log("Tab clicked:",e,"index:",t,"filter:",o),this.applyFilter(n,o)}handleTabKeydown(e,t,n){let r=this.tabGroups.get(t);if(!r)return;let o;switch(e.key){case"ArrowLeft":o=n===0?r.tabs.length-1:n-1;break;case"ArrowRight":o=n===r.tabs.length-1?0:n+1;break;case"Home":o=0;break;case"End":o=r.tabs.length-1;break;default:return}e.preventDefault(),this.setActiveTab(r,o),r.tabs[o].focus();let s=r.tabs[o].dataset.filter||"";this.applyFilter(r,s)}setActiveTab(e,t){e.tabs.forEach((n,r)=>{let o=r===t;n.classList.toggle("active",o),n.setAttribute("aria-selected",o?"true":"false"),n.setAttribute("tabindex",o?"0":"-1")}),e.activeIndex=t,e.contentPanel&&e.contentPanel.setAttribute("aria-labelledby",e.tabs[t].id||"")}applyFilter(e,t){let n=e.contentPanel?.querySelector(".tinkerdown-interactive-block");if(!n){this.log("No interactive block found for filtering");return}let r=n.dataset.blockId;if(!r){this.log("Interactive block has no ID");return}this.sendMessage?(this.log("Sending Filter action to block:",r,"filter:",t),this.sendMessage(r,"Filter",{filter:t})):this.log("No message sender configured")}getActiveIndex(e){return this.tabGroups.get(e)?.activeIndex??0}setTab(e,t){let n=this.tabGroups.get(e);!n||t<0||t>=n.tabs.length||this.handleTabClick(e,t)}};var K=class{constructor(e,t,n=!1){this.element=e.element,this.metadata=e.metadata,this.persistence=t,this.initialCode=e.initialCode||"",this.currentCode=this.initialCode,this.debug=n}get id(){return this.metadata.id}get type(){return this.metadata.type}getCode(){return this.currentCode}setCode(e){this.currentCode=e,this.metadata.editable&&this.persistence.saveCode(this.id,e)}reset(){this.setCode(this.initialCode),this.debug&&console.log(`[Block:${this.id}] Reset to initial code`)}loadPersistedCode(){if(!this.metadata.editable)return this.initialCode;let e=this.persistence.loadCode(this.id);return e?(this.debug&&console.log(`[Block:${this.id}] Loaded persisted code`),e):this.initialCode}createBlockWrapper(){let e=document.createElement("div");return e.className=`livemdtools-block livemdtools-block-${this.type}`,e.dataset.blockId=this.id,e.dataset.blockType=this.type,e}log(...e){this.debug&&console.log(`[Block:${this.id}]`,...e)}error(...e){console.error(`[Block:${this.id}]`,...e)}};var ke=class extends K{constructor(t,n,r=!1){super(t,n,r);this.codeElement=null}initialize(){this.log("Initializing server block"),this.codeElement=this.element.querySelector("code")||this.element,this.element.classList.add("livemdtools-server-block"),this.metadata.readonly&&this.element.classList.add("readonly"),this.element.dataset.blockId=this.id,this.element.dataset.language=this.metadata.language,this.render(),this.log("Server block initialized")}destroy(){this.log("Destroying server block")}handleMessage(t,n,r,o){this.log("Received message:",t,n),console.warn(`[ServerBlock:${this.id}] Received unexpected message:`,t)}render(){this.codeElement&&this.log("Rendered server block")}};var Dr=Lt(wt());var Ee=class extends K{constructor(t,n,r=!1){super(t,n,r);this.client=null;this.containerElement=null;this.sendMessage=null;this.pendingForm=null;this.pendingAction=null;this._handleClick=t=>this.handleClick(t);this._handleSubmit=t=>this.handleSubmit(t);this._handleChange=t=>this.handleChange(t);this.execToolbar=null;this.outputPanel=null;this.outputExpanded=!1}initialize(){this.log("Initializing interactive block");let t=this.element.querySelector("[data-interactive-content]");if(t)this.containerElement=t;else{let n=document.createElement("div");for(n.className="exec-content-wrapper",n.dataset.interactiveContent="true";this.element.firstChild;)n.appendChild(this.element.firstChild);this.element.appendChild(n),this.containerElement=n}this.element.classList.add("livemdtools-interactive-block"),this.element.dataset.blockId=this.id,this.metadata.stateRef&&(this.element.dataset.stateRef=this.metadata.stateRef),this.client=new Dr.LiveTemplateClient,this.attachEventHandlers(),this.element.dataset.execSource==="true"&&this.injectExecToolbar(),this.log("Interactive block initialized")}destroy(){this.log("Destroying interactive block"),this.element.removeEventListener("click",this._handleClick,!0),this.element.removeEventListener("submit",this._handleSubmit,!0),this.element.removeEventListener("change",this._handleChange,!0),this.client=null,this.pendingForm=null,this.pendingAction=null}handleMessage(t,n,r,o){switch(this.log("Received message:",t,n),t){case"tree":if(n&&this.containerElement&&this.client&&(this.client.updateDOM(this.containerElement,n),this.log("DOM updated with tree"),o&&this.updateCacheAttributes(o),this.execToolbar&&r&&this.updateExecToolbar(r),this.pendingForm)){let s={success:!0,errors:{},action:this.pendingAction};this.pendingForm.dispatchEvent(new CustomEvent("lvt:success",{bubbles:!0,detail:s})),this.log("Dispatched lvt:success event"),this.pendingForm=null,this.pendingAction=null}break;case"error":if(this.error("Server error:",n.message),this.pendingForm){let s={success:!1,errors:n.errors||{},action:this.pendingAction};this.pendingForm.dispatchEvent(new CustomEvent("lvt:error",{bubbles:!0,detail:s})),this.pendingForm=null,this.pendingAction=null}break;default:this.log("Unknown action:",t)}}setMessageSender(t){this.sendMessage=t}attachEventHandlers(){this.element&&(this.element.addEventListener("click",this._handleClick,!0),this.element.addEventListener("submit",this._handleSubmit,!0),this.element.addEventListener("change",this._handleChange,!0))}handleClick(t){let n=t.target,r=n.closest("button[name]");if(r&&r.form===null&&this.element.contains(r)){if(t.preventDefault(),!this.checkConfirm(r)){this.log("Click action cancelled by user:",r.name);return}let s=this.extractData(r);this.sendAction(r.name,s),this.log("Click action (button name):",r.name,s);return}let o=n.closest("[lvt-on\\:click]");if(o&&this.element.contains(o)){let s=o.getAttribute("lvt-on:click");if(s){if(t.preventDefault(),!this.checkConfirm(o)){this.log("Click action cancelled by user:",s);return}let a=this.extractData(o);this.sendAction(s,a),this.log("Click action (lvt-on:click):",s,a)}}}handleSubmit(t){let n=t.target,r=t.submitter,o="";if(r instanceof HTMLButtonElement&&r.name)o=r.name;else if(n.getAttribute("name"))o=n.getAttribute("name");else return;t.preventDefault();let s=new FormData(n),a={};s.forEach((c,l)=>{r instanceof HTMLButtonElement&&l===r.name||(a[l]=c)}),this.pendingForm=n,this.pendingAction=o,n.dispatchEvent(new CustomEvent("lvt:pending",{bubbles:!0,detail:{action:o}})),this.sendAction(o,a),this.log("Submit action:",o,a)}handleChange(t){let n=t.target,r=n.getAttribute("lvt-on:change");if(r){let o={value:n.value};this.sendAction(r,o),this.log("Change action:",r,o)}}checkConfirm(t){let n=t.dataset.confirm;return!(n&&!window.confirm(n))}extractData(t){let n={};for(let r of Object.keys(t.dataset)){if(r==="confirm")continue;let o=t.dataset[r];o!==void 0&&(n[r]=o)}return n}sendAction(t,n={}){if(!this.sendMessage){this.error("Cannot send action - no message sender configured");return}this.sendMessage(this.id,t,n)}injectExecToolbar(){let t=this.element.dataset.execCommand||"...";this.execToolbar=document.createElement("div"),this.execToolbar.className="exec-toolbar",this.execToolbar.innerHTML=`
${this.escapeHtml(t)}
Ready
@@ -93,15 +93,15 @@ Run - `));let a=this.outputPanel?.querySelector(".exec-output-stdout"),c=this.outputPanel?.querySelector(".exec-output-stderr");a&&(a.textContent=t.output||""),c&&(c.textContent=t.stderr||"",c.style.display=t.stderr?"block":"none"),this.log("Exec toolbar updated:",n,t.duration)}updateCacheAttributes(t){this.element&&(t.stale?this.element.dataset.cacheStale="true":delete this.element.dataset.cacheStale,t.refreshing?this.element.dataset.cacheRefreshing="true":delete this.element.dataset.cacheRefreshing,t.cached?(this.element.dataset.cacheCached="true",t.age&&(this.element.dataset.cacheAge=t.age),t.expires_in&&(this.element.dataset.cacheExpiresIn=t.expires_in)):(delete this.element.dataset.cacheCached,delete this.element.dataset.cacheAge,delete this.element.dataset.cacheExpiresIn),this.log("Cache attributes updated:",t))}escapeHtml(t){let n=document.createElement("div");return n.textContent=t,n.innerHTML}};var Oo="0.45.0",ae=`https://cdn.jsdelivr.net/npm/monaco-editor@${Oo}/min`,Oe=null,ke=null;function Po(){return new Promise((i,e)=>{if(typeof window.require=="function"){i();return}let t=document.createElement("script");t.src=`${ae}/vs/loader.js`,t.async=!0,t.onload=()=>i(),t.onerror=()=>e(new Error("Failed to load Monaco loader from CDN")),document.head.appendChild(t)})}function No(){window.MonacoEnvironment={getWorkerUrl:function(i,e){let t=`${ae}/vs/base/worker/workerMain.js`;return e==="json"?`${ae}/vs/language/json/json.worker.js`:e==="css"||e==="scss"||e==="less"?`${ae}/vs/language/css/css.worker.js`:e==="html"||e==="handlebars"||e==="razor"?`${ae}/vs/language/html/html.worker.js`:e==="typescript"||e==="javascript"?`${ae}/vs/language/typescript/ts.worker.js`:t}}}async function Pe(){if(Oe)return Oe;if(ke)return ke;console.log("[MonacoLoader] Loading Monaco Editor from CDN...");let i=performance.now();return ke=(async()=>{try{await Po();let e=window.require;if(!e)throw new Error("AMD loader not available after loading");return e.config({paths:{vs:`${ae}/vs`}}),No(),await new Promise((t,n)=>{e(["vs/editor/editor.main"],r=>{if(!r){n(new Error("Monaco module loaded but is undefined"));return}Oe=r;let o=Math.round(performance.now()-i);console.log(`[MonacoLoader] Monaco Editor loaded from CDN in ${o}ms`),t(r)})})}catch(e){throw ke=null,e}})(),ke}function Ar(){return Oe!==null}function gt(){!Oe&&!ke&&Pe().catch(i=>{console.error("[MonacoLoader] Failed to preload Monaco from CDN:",i)})}function mt(){return document.querySelectorAll('[data-block-type="wasm"]').length>0}var Ee=class{constructor(e,t,n){this.editor=null;this.monaco=null;this.onChangeCallback=null;this.editorDiv=null;this.initPromise=null;this.container=e,this.initialCode=t,this.options=n,this.initPromise=this.initialize()}async initialize(){let e=document.createElement("div");e.className="livemdtools-monaco-loading",e.style.padding="2rem",e.style.textAlign="center",e.style.color="#999",e.textContent="Loading editor...",this.container.appendChild(e);try{this.monaco=await Pe(),e.remove(),this.editorDiv=document.createElement("div"),this.editorDiv.className="livemdtools-monaco-editor",this.editorDiv.style.height="300px",this.editorDiv.style.width="100%",this.container.appendChild(this.editorDiv),this.editor=this.monaco.editor.create(this.editorDiv,{value:this.initialCode,language:this.options.language,theme:this.options.theme||"vs-dark",readOnly:this.options.readonly,minimap:{enabled:this.options.minimap??!0},lineNumbers:this.options.lineNumbers!==!1?"on":"off",scrollBeyondLastLine:!1,automaticLayout:!0,fontSize:14,tabSize:4,insertSpaces:!1}),this.editor.onDidChangeModelContent(()=>{this.onChangeCallback&&this.editor&&this.onChangeCallback(this.editor.getValue())})}catch(t){console.error("[MonacoEditor] Failed to load Monaco:",t),e.textContent="Failed to load editor",e.style.color="#f44"}}async ensureReady(){this.initPromise&&await this.initPromise}getValue(){return this.editor?.getValue()||""}async setValue(e){await this.ensureReady(),this.editor?.setValue(e)}onChange(e){this.onChangeCallback=e}async setReadOnly(e){await this.ensureReady(),this.editor?.updateOptions({readOnly:e})}async focus(){await this.ensureReady(),this.editor?.focus()}async layout(){await this.ensureReady(),this.editor?.layout()}destroy(){this.editor?.dispose(),this.editor=null}async getEditor(){return await this.ensureReady(),this.editor}};var xe=class{constructor(e,t=1e3,n=!0){this.lines=[];this.maxLines=t,this.autoScroll=n,this.element=this.createPanel(),e.appendChild(this.element)}createPanel(){let e=document.createElement("div");e.className="livemdtools-output-panel",e.innerHTML=` + `));let a=this.outputPanel?.querySelector(".exec-output-stdout"),c=this.outputPanel?.querySelector(".exec-output-stderr");a&&(a.textContent=t.output||""),c&&(c.textContent=t.stderr||"",c.style.display=t.stderr?"block":"none"),this.log("Exec toolbar updated:",n,t.duration)}updateCacheAttributes(t){this.element&&(t.stale?this.element.dataset.cacheStale="true":delete this.element.dataset.cacheStale,t.refreshing?this.element.dataset.cacheRefreshing="true":delete this.element.dataset.cacheRefreshing,t.cached?(this.element.dataset.cacheCached="true",t.age&&(this.element.dataset.cacheAge=t.age),t.expires_in&&(this.element.dataset.cacheExpiresIn=t.expires_in)):(delete this.element.dataset.cacheCached,delete this.element.dataset.cacheAge,delete this.element.dataset.cacheExpiresIn),this.log("Cache attributes updated:",t))}escapeHtml(t){let n=document.createElement("div");return n.textContent=t,n.innerHTML}};var rs="0.45.0",le=`https://cdn.jsdelivr.net/npm/monaco-editor@${rs}/min`,$e=null,xe=null;function is(){return new Promise((i,e)=>{if(typeof window.require=="function"){i();return}let t=document.createElement("script");t.src=`${le}/vs/loader.js`,t.async=!0,t.onload=()=>i(),t.onerror=()=>e(new Error("Failed to load Monaco loader from CDN")),document.head.appendChild(t)})}function os(){window.MonacoEnvironment={getWorkerUrl:function(i,e){let t=`${le}/vs/base/worker/workerMain.js`;return e==="json"?`${le}/vs/language/json/json.worker.js`:e==="css"||e==="scss"||e==="less"?`${le}/vs/language/css/css.worker.js`:e==="html"||e==="handlebars"||e==="razor"?`${le}/vs/language/html/html.worker.js`:e==="typescript"||e==="javascript"?`${le}/vs/language/typescript/ts.worker.js`:t}}}async function Be(){if($e)return $e;if(xe)return xe;console.log("[MonacoLoader] Loading Monaco Editor from CDN...");let i=performance.now();return xe=(async()=>{try{await is();let e=window.require;if(!e)throw new Error("AMD loader not available after loading");return e.config({paths:{vs:`${le}/vs`}}),os(),await new Promise((t,n)=>{e(["vs/editor/editor.main"],r=>{if(!r){n(new Error("Monaco module loaded but is undefined"));return}$e=r;let o=Math.round(performance.now()-i);console.log(`[MonacoLoader] Monaco Editor loaded from CDN in ${o}ms`),t(r)})})}catch(e){throw xe=null,e}})(),xe}function Hr(){return $e!==null}function kt(){!$e&&!xe&&Be().catch(i=>{console.error("[MonacoLoader] Failed to preload Monaco from CDN:",i)})}function Et(){return document.querySelectorAll('[data-block-type="wasm"]').length>0}var Se=class{constructor(e,t,n){this.editor=null;this.monaco=null;this.onChangeCallback=null;this.editorDiv=null;this.initPromise=null;this.container=e,this.initialCode=t,this.options=n,this.initPromise=this.initialize()}async initialize(){let e=document.createElement("div");e.className="livemdtools-monaco-loading",e.style.padding="2rem",e.style.textAlign="center",e.style.color="#999",e.textContent="Loading editor...",this.container.appendChild(e);try{this.monaco=await Be(),e.remove(),this.editorDiv=document.createElement("div"),this.editorDiv.className="livemdtools-monaco-editor",this.editorDiv.style.height="300px",this.editorDiv.style.width="100%",this.container.appendChild(this.editorDiv),this.editor=this.monaco.editor.create(this.editorDiv,{value:this.initialCode,language:this.options.language,theme:this.options.theme||"vs-dark",readOnly:this.options.readonly,minimap:{enabled:this.options.minimap??!0},lineNumbers:this.options.lineNumbers!==!1?"on":"off",scrollBeyondLastLine:!1,automaticLayout:!0,fontSize:14,tabSize:4,insertSpaces:!1}),this.editor.onDidChangeModelContent(()=>{this.onChangeCallback&&this.editor&&this.onChangeCallback(this.editor.getValue())})}catch(t){console.error("[MonacoEditor] Failed to load Monaco:",t),e.textContent="Failed to load editor",e.style.color="#f44"}}async ensureReady(){this.initPromise&&await this.initPromise}getValue(){return this.editor?.getValue()||""}async setValue(e){await this.ensureReady(),this.editor?.setValue(e)}onChange(e){this.onChangeCallback=e}async setReadOnly(e){await this.ensureReady(),this.editor?.updateOptions({readOnly:e})}async focus(){await this.ensureReady(),this.editor?.focus()}async layout(){await this.ensureReady(),this.editor?.layout()}destroy(){this.editor?.dispose(),this.editor=null}async getEditor(){return await this.ensureReady(),this.editor}};var Ae=class{constructor(e,t=1e3,n=!0){this.lines=[];this.maxLines=t,this.autoScroll=n,this.element=this.createPanel(),e.appendChild(this.element)}createPanel(){let e=document.createElement("div");e.className="livemdtools-output-panel",e.innerHTML=`
Output
- `;let t=e.querySelector(".output-clear");return t&&t.addEventListener("click",()=>this.clear()),e}append(e,t){let n={type:e,text:t,timestamp:Date.now()};this.lines.push(n),this.lines.length>this.maxLines&&(this.lines=this.lines.slice(-this.maxLines)),this.render()}stdout(e){this.append("stdout",e)}stderr(e){this.append("stderr",e)}error(e){this.append("error",e)}info(e){this.append("info",e)}clear(){this.lines=[],this.render()}show(){this.element.style.display="block"}hide(){this.element.style.display="none"}render(){let e=this.element.querySelector(".output-content");if(e){e.innerHTML="";for(let t of this.lines){let n=document.createElement("div");n.className=`output-line output-${t.type}`,n.textContent=t.text,e.appendChild(n)}this.autoScroll&&(e.scrollTop=e.scrollHeight)}}getElement(){return this.element}destroy(){this.element.remove()}};var Se=class{constructor(e,t="Run"){this.callback=null;this.isRunning=!1;this.element=this.createButton(t),e.appendChild(this.element)}createButton(e){let t=document.createElement("button");return t.className="livemdtools-run-button",t.textContent=e,t.addEventListener("click",()=>this.handleClick()),t}onClick(e){this.callback=e}async handleClick(){if(!(this.isRunning||!this.callback)){this.setRunning(!0);try{await this.callback()}catch(e){console.error("[RunButton] Error executing callback:",e)}finally{this.setRunning(!1)}}}setRunning(e){this.isRunning=e,this.element.disabled=e,e?(this.element.classList.add("running"),this.element.textContent="Running..."):(this.element.classList.remove("running"),this.element.textContent="Run")}enable(){this.element.disabled=!1}disable(){this.element.disabled=!0}getElement(){return this.element}destroy(){this.element.remove()}};var Ae=class{constructor(e="/api/compile",t=!1){this.serverUrl=e,this.debug=t}async execute(e){this.debug&&console.log("[TinyGoExecutor] Executing code:",e);try{let t=await fetch(this.serverUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok){let r=await t.text();return{stdout:"",stderr:r,error:`Compilation failed: ${r}`,exitCode:1}}let n=await t.arrayBuffer();return await this.executeWasm(n)}catch(t){return{stdout:"",stderr:"",error:`Execution failed: ${t instanceof Error?t.message:String(t)}`,exitCode:1}}}async executeWasm(e){let t="",n="";try{let r=new window.Go,o=console.log,s=console.error;console.log=(...c)=>{t+=c.join(" ")+` + `;let t=e.querySelector(".output-clear");return t&&t.addEventListener("click",()=>this.clear()),e}append(e,t){let n={type:e,text:t,timestamp:Date.now()};this.lines.push(n),this.lines.length>this.maxLines&&(this.lines=this.lines.slice(-this.maxLines)),this.render()}stdout(e){this.append("stdout",e)}stderr(e){this.append("stderr",e)}error(e){this.append("error",e)}info(e){this.append("info",e)}clear(){this.lines=[],this.render()}show(){this.element.style.display="block"}hide(){this.element.style.display="none"}render(){let e=this.element.querySelector(".output-content");if(e){e.innerHTML="";for(let t of this.lines){let n=document.createElement("div");n.className=`output-line output-${t.type}`,n.textContent=t.text,e.appendChild(n)}this.autoScroll&&(e.scrollTop=e.scrollHeight)}}getElement(){return this.element}destroy(){this.element.remove()}};var Te=class{constructor(e,t="Run"){this.callback=null;this.isRunning=!1;this.element=this.createButton(t),e.appendChild(this.element)}createButton(e){let t=document.createElement("button");return t.className="livemdtools-run-button",t.textContent=e,t.addEventListener("click",()=>this.handleClick()),t}onClick(e){this.callback=e}async handleClick(){if(!(this.isRunning||!this.callback)){this.setRunning(!0);try{await this.callback()}catch(e){console.error("[RunButton] Error executing callback:",e)}finally{this.setRunning(!1)}}}setRunning(e){this.isRunning=e,this.element.disabled=e,e?(this.element.classList.add("running"),this.element.textContent="Running..."):(this.element.classList.remove("running"),this.element.textContent="Run")}enable(){this.element.disabled=!1}disable(){this.element.disabled=!0}getElement(){return this.element}destroy(){this.element.remove()}};var Ce=class{constructor(e="/api/compile",t=!1){this.serverUrl=e,this.debug=t}async execute(e){this.debug&&console.log("[TinyGoExecutor] Executing code:",e);try{let t=await fetch(this.serverUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e})});if(!t.ok){let r=await t.text();return{stdout:"",stderr:r,error:`Compilation failed: ${r}`,exitCode:1}}let n=await t.arrayBuffer();return await this.executeWasm(n)}catch(t){return{stdout:"",stderr:"",error:`Execution failed: ${t instanceof Error?t.message:String(t)}`,exitCode:1}}}async executeWasm(e){let t="",n="";try{let r=new window.Go,o=console.log,s=console.error;console.log=(...c)=>{t+=c.join(" ")+` `},console.error=(...c)=>{n+=c.join(" ")+` -`};let a=await WebAssembly.instantiate(e,r.importObject);return await r.run(a.instance),console.log=o,console.error=s,{stdout:t,stderr:n,exitCode:0}}catch(r){let o=r instanceof Error?r.message:String(r);return{stdout:t,stderr:n,error:`WASM execution failed: ${o}`,exitCode:1}}}static isSupported(){return typeof WebAssembly<"u"&&typeof window.Go<"u"}};async function Tr(){if(!window.Go)try{let i=document.createElement("script");i.src="/assets/wasm_exec.js",await new Promise((e,t)=>{i.onload=()=>e(),i.onerror=()=>t(new Error("Failed to load wasm_exec.js")),document.head.appendChild(i)}),console.log("[TinyGoExecutor] WASM environment initialized")}catch(i){throw console.error("[TinyGoExecutor] Failed to initialize WASM:",i),i}}var Te=class extends K{constructor(t,n,r=!1){super(t,n,r);this.editor=null;this.outputPanel=null;this.runButton=null;this.executor=null;this.containerElement=null;this.editorContainer=null;this.controlsContainer=null}initialize(){this.log("Initializing WASM block"),this.currentCode=this.loadPersistedCode(),this.createBlockStructure(),this.initializeEditor(),this.initializeControls(),this.initializeExecutor(),this.log("WASM block initialized")}destroy(){this.log("Destroying WASM block"),this.editor?.destroy(),this.outputPanel?.destroy(),this.runButton?.destroy(),this.editor=null,this.outputPanel=null,this.runButton=null,this.executor=null}handleMessage(t,n,r,o){this.log("Received message:",t,n)}createBlockStructure(){this.containerElement=document.createElement("div"),this.containerElement.className="livemdtools-wasm-block",this.containerElement.dataset.blockId=this.id,this.editorContainer=document.createElement("div"),this.editorContainer.className="wasm-editor-container",this.containerElement.appendChild(this.editorContainer),this.controlsContainer=document.createElement("div"),this.controlsContainer.className="wasm-controls",this.containerElement.appendChild(this.controlsContainer),this.element.parentNode&&this.element.parentNode.replaceChild(this.containerElement,this.element)}initializeEditor(){this.editorContainer&&(this.editor=new Ee(this.editorContainer,this.currentCode,{language:this.metadata.language||"go",readonly:this.metadata.readonly||!1,theme:"vs-dark",minimap:!1,lineNumbers:!0}),this.editor.onChange(t=>{this.setCode(t)}),this.log("Editor initialized"))}initializeControls(){if(!this.controlsContainer)return;let t=document.createElement("div");t.className="wasm-buttons",this.runButton=new Se(t,"Run"),this.runButton.onClick(()=>this.executeCode());let n=document.createElement("button");n.className="livemdtools-reset-button",n.textContent="Reset",n.addEventListener("click",()=>this.resetCode()),t.appendChild(n),this.controlsContainer.appendChild(t),this.outputPanel=new xe(this.controlsContainer),this.outputPanel.hide(),this.log("Controls initialized")}initializeExecutor(){this.executor=new Ae("/api/compile",this.debug),this.log("Executor initialized")}async executeCode(){if(!this.editor||!this.executor||!this.outputPanel){this.error("Cannot execute - components not initialized");return}let t=this.editor.getValue();this.log("Executing code"),this.outputPanel.clear(),this.outputPanel.show(),this.outputPanel.info("Compiling and running...");try{let n=await this.executor.execute(t);this.outputPanel.clear(),n.stdout&&this.outputPanel.stdout(n.stdout),n.stderr&&this.outputPanel.stderr(n.stderr),n.error&&this.outputPanel.error(n.error),n.exitCode===0&&!n.stdout&&!n.stderr&&this.outputPanel.info("Program completed successfully (no output)"),this.log("Execution completed with exit code:",n.exitCode)}catch(n){let r=n instanceof Error?n.message:String(n);this.outputPanel.error(`Execution error: ${r}`),this.error("Execution error:",n)}}resetCode(){this.editor&&(this.editor.setValue(this.initialCode),this.setCode(this.initialCode),this.outputPanel?.clear(),this.log("Code reset to initial state"))}};var Cr=xt(ft());var bt=class extends K{constructor(t,n,r=!1){super(t,n,r);this.client=null;this.mountId=""}initialize(){this.log("Initializing embed-lvt block");let t=this.element.querySelector("[data-lvt-id-pending]");if(t){let c=t.getAttribute("data-lvt-id-pending");c&&(t.setAttribute("data-lvt-id",`${c}-${this.id}`),t.removeAttribute("data-lvt-id-pending"))}let n=this.element.querySelector("[data-lvt-id]");if(!n){this.error("no [data-lvt-id] inside embed container \u2014 server-side fetch likely failed"),this.element.classList.add("unavailable");return}this.mountId=`tinkerdown-embed-mount-${this.id}`,this.element.id=this.mountId,n.dataset.tinkerdownEmbedMount=this.id;let r=this.element.dataset.embedServer||"",o=this.element.dataset.embedPath||"/",{wsUrl:s,liveUrl:a}=this.computeEndpoints(r,o);this.log("Connecting to upstream",{wsUrl:s,liveUrl:a}),this.client=new Cr.LiveTemplateClient({wsUrl:s,liveUrl:a,debug:this.debug}),this.client.connect(`#${this.mountId} [data-lvt-id]`).then(()=>this.log("Embed connected")).catch(c=>{this.error("Embed connect failed:",c),this.element.classList.add("unavailable")})}destroy(){this.log("Destroying embed-lvt block"),this.client&&(this.client.disconnect(),this.client=null)}handleMessage(t,n,r,o){}computeEndpoints(t,n){if(!t)return{wsUrl:`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${n}`,liveUrl:n};let r=new URL(t);return{wsUrl:`${r.protocol==="https:"?"wss:":"ws:"}//${r.host}${n}`,liveUrl:`${r.origin}${n}`}}};var Ce=class{constructor(e){this.tabs=null;this.blocks=new Map;this.ws=null;this.reconnectTimer=null;this.isConnected=!1;this.options={debug:!1,persistence:!0,cdnFallback:!1,...e},this.router=new me(this.options.debug),this.persistence=new be("tinkerdown:persistence",this.options.persistence,this.options.debug),this.options.debug&&console.log("[TinkerdownClient] Initialized with options:",this.options)}connect(){if(this.ws){console.warn("[TinkerdownClient] Already connected");return}try{this.ws=new WebSocket(this.options.wsUrl),this.ws.onopen=()=>{this.isConnected=!0,console.log("[TinkerdownClient] Connected to server"),this.options.onConnect?.()},this.ws.onclose=()=>{this.isConnected=!1,console.log("[TinkerdownClient] Disconnected from server"),this.options.onDisconnect?.(),this.scheduleReconnect()},this.ws.onerror=e=>{console.error("[TinkerdownClient] WebSocket error:",e),this.options.onError?.(new Error("WebSocket error"))},this.ws.onmessage=e=>{this.handleMessage(e.data)}}catch(e){console.error("[TinkerdownClient] Failed to connect:",e),this.options.onError?.(e)}}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws&&(this.ws.close(),this.ws=null),this.isConnected=!1}handleMessage(e){this.options.debug&&console.log("[TinkerdownClient] Received message:",e),this.router.route(e)}send(e,t,n={}){if(!this.isConnected||!this.ws){console.warn("[TinkerdownClient] Cannot send - not connected");return}let o=JSON.stringify({blockID:e,action:t,data:n});this.options.debug&&console.log("[TinkerdownClient] Sending message:",o),this.ws.send(o)}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=window.setTimeout(()=>{this.reconnectTimer=null,console.log("[TinkerdownClient] Attempting to reconnect..."),this.connect()},3e3))}discoverBlocks(){console.log("[TinkerdownClient] Discovering blocks..."),(0,Lr.setupReactiveAttributeListeners)(),this.tabs=new ve(this.options.debug),this.tabs.setMessageSender((t,n,r)=>{this.send(t,n,r)});let e=document.querySelectorAll("[data-tinkerdown-block]");for(let t of Array.from(e))try{let n=this.extractMetadata(t),r=this.extractCode(t),o={element:t,metadata:n,initialCode:r};this.registerBlock(o)}catch(n){console.error("[TinkerdownClient] Error discovering block:",n)}console.log(`[TinkerdownClient] Discovered ${this.blocks.size} blocks`)}extractMetadata(e){let t=e.dataset.blockId||this.generateBlockId(),n=e.dataset.blockType||"server",r=e.dataset.language||"go",o=e.dataset.readonly==="true",s=e.dataset.editable==="true",a=e.dataset.stateRef;return{id:t,type:n,language:r,readonly:o,editable:s,stateRef:a}}extractCode(e){let t=e.querySelector("code");return t?t.textContent||"":e.textContent||""}generateBlockId(){return`block-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}registerBlock(e){let{metadata:t}=e;if(this.blocks.has(t.id)){console.warn(`[TinkerdownClient] Block already registered: ${t.id}`);return}let n;switch(t.type){case"server":n=new ye(e,this.persistence,this.options.debug);break;case"interactive":case"lvt":n=new we(e,this.persistence,this.options.debug),n.setMessageSender((r,o,s)=>{this.send(r,o,s)});break;case"wasm":n=new Te(e,this.persistence,this.options.debug);break;case"embed-lvt":n=new bt(e,this.persistence,this.options.debug);break;default:console.warn(`[TinkerdownClient] Unknown block type: ${t.type}`);return}n.initialize(),this.router.register(t.id,(r,o,s,a)=>{n.handleMessage(r,o,s,a)}),this.blocks.set(t.id,n),this.options.debug&&console.log(`[TinkerdownClient] Registered block: ${t.id} (${t.type})`)}unregisterBlock(e){let t=this.blocks.get(e);t&&(t.destroy(),this.router.unregister(e),this.blocks.delete(e),this.options.debug&&console.log(`[TinkerdownClient] Unregistered block: ${e}`))}getBlock(e){return this.blocks.get(e)}getBlockIds(){return Array.from(this.blocks.keys())}destroy(){console.log("[TinkerdownClient] Destroying client");for(let e of this.blocks.values())e.destroy();this.blocks.clear(),this.router.clear(),this.disconnect()}};var vt=class{constructor(){this.steps=[];this.currentStepIndex=0;this.sidebar=null;this.bottomNav=null;this.init()}init(){if(document.querySelector(".tinkerdown-nav-sidebar"))return;let e=document.querySelector('meta[name="tinkerdown-sidebar"]');e&&e.getAttribute("content")==="false"||(this.parseSteps(),this.steps.length!==0&&(this.createSidebar(),this.createBottomNav(),this.setupKeyboardShortcuts(),this.setupHashNavigation(),this.setupScrollTracking(),this.initializeFromHash()))}parseSteps(){document.querySelectorAll("h2").forEach((t,n)=>{let r=t.id||this.generateId(t.textContent||"");t.id||(t.id=r),this.steps.push({id:r,title:t.textContent||"",element:t,index:n})})}generateId(e){return e.toLowerCase().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").trim()}createSidebar(){this.sidebar=document.createElement("nav"),this.sidebar.className="tinkerdown-nav-sidebar",this.sidebar.innerHTML=` +`};let a=await WebAssembly.instantiate(e,r.importObject);return await r.run(a.instance),console.log=o,console.error=s,{stdout:t,stderr:n,exitCode:0}}catch(r){let o=r instanceof Error?r.message:String(r);return{stdout:t,stderr:n,error:`WASM execution failed: ${o}`,exitCode:1}}}static isSupported(){return typeof WebAssembly<"u"&&typeof window.Go<"u"}};async function Or(){if(!window.Go)try{let i=document.createElement("script");i.src="/assets/wasm_exec.js",await new Promise((e,t)=>{i.onload=()=>e(),i.onerror=()=>t(new Error("Failed to load wasm_exec.js")),document.head.appendChild(i)}),console.log("[TinyGoExecutor] WASM environment initialized")}catch(i){throw console.error("[TinyGoExecutor] Failed to initialize WASM:",i),i}}var Le=class extends K{constructor(t,n,r=!1){super(t,n,r);this.editor=null;this.outputPanel=null;this.runButton=null;this.executor=null;this.containerElement=null;this.editorContainer=null;this.controlsContainer=null}initialize(){this.log("Initializing WASM block"),this.currentCode=this.loadPersistedCode(),this.createBlockStructure(),this.initializeEditor(),this.initializeControls(),this.initializeExecutor(),this.log("WASM block initialized")}destroy(){this.log("Destroying WASM block"),this.editor?.destroy(),this.outputPanel?.destroy(),this.runButton?.destroy(),this.editor=null,this.outputPanel=null,this.runButton=null,this.executor=null}handleMessage(t,n,r,o){this.log("Received message:",t,n)}createBlockStructure(){this.containerElement=document.createElement("div"),this.containerElement.className="livemdtools-wasm-block",this.containerElement.dataset.blockId=this.id,this.editorContainer=document.createElement("div"),this.editorContainer.className="wasm-editor-container",this.containerElement.appendChild(this.editorContainer),this.controlsContainer=document.createElement("div"),this.controlsContainer.className="wasm-controls",this.containerElement.appendChild(this.controlsContainer),this.element.parentNode&&this.element.parentNode.replaceChild(this.containerElement,this.element)}initializeEditor(){this.editorContainer&&(this.editor=new Se(this.editorContainer,this.currentCode,{language:this.metadata.language||"go",readonly:this.metadata.readonly||!1,theme:"vs-dark",minimap:!1,lineNumbers:!0}),this.editor.onChange(t=>{this.setCode(t)}),this.log("Editor initialized"))}initializeControls(){if(!this.controlsContainer)return;let t=document.createElement("div");t.className="wasm-buttons",this.runButton=new Te(t,"Run"),this.runButton.onClick(()=>this.executeCode());let n=document.createElement("button");n.className="livemdtools-reset-button",n.textContent="Reset",n.addEventListener("click",()=>this.resetCode()),t.appendChild(n),this.controlsContainer.appendChild(t),this.outputPanel=new Ae(this.controlsContainer),this.outputPanel.hide(),this.log("Controls initialized")}initializeExecutor(){this.executor=new Ce("/api/compile",this.debug),this.log("Executor initialized")}async executeCode(){if(!this.editor||!this.executor||!this.outputPanel){this.error("Cannot execute - components not initialized");return}let t=this.editor.getValue();this.log("Executing code"),this.outputPanel.clear(),this.outputPanel.show(),this.outputPanel.info("Compiling and running...");try{let n=await this.executor.execute(t);this.outputPanel.clear(),n.stdout&&this.outputPanel.stdout(n.stdout),n.stderr&&this.outputPanel.stderr(n.stderr),n.error&&this.outputPanel.error(n.error),n.exitCode===0&&!n.stdout&&!n.stderr&&this.outputPanel.info("Program completed successfully (no output)"),this.log("Execution completed with exit code:",n.exitCode)}catch(n){let r=n instanceof Error?n.message:String(n);this.outputPanel.error(`Execution error: ${r}`),this.error("Execution error:",n)}}resetCode(){this.editor&&(this.editor.setValue(this.initialCode),this.setCode(this.initialCode),this.outputPanel?.clear(),this.log("Code reset to initial state"))}};var Pr=Lt(wt());var xt=class extends K{constructor(t,n,r=!1){super(t,n,r);this.client=null;this.mountId=""}initialize(){this.log("Initializing embed-lvt block");let t=this.element.querySelector("[data-lvt-id-pending]");if(t){let c=t.getAttribute("data-lvt-id-pending");c&&(t.setAttribute("data-lvt-id",`${c}-${this.id}`),t.removeAttribute("data-lvt-id-pending"))}let n=this.element.querySelector("[data-lvt-id]");if(!n){this.error("no [data-lvt-id] inside embed container \u2014 server-side fetch likely failed"),this.element.classList.add("unavailable");return}this.mountId=`tinkerdown-embed-mount-${this.id}`,this.element.id=this.mountId,n.dataset.tinkerdownEmbedMount=this.id;let r=this.element.dataset.embedServer||"",o=this.element.dataset.embedPath||"/",{wsUrl:s,liveUrl:a}=this.computeEndpoints(r,o);this.log("Connecting to upstream",{wsUrl:s,liveUrl:a}),this.client=new Pr.LiveTemplateClient({wsUrl:s,liveUrl:a,debug:this.debug}),this.client.connect(`#${this.mountId} [data-lvt-id]`).then(()=>this.log("Embed connected")).catch(c=>{this.error("Embed connect failed:",c),this.element.classList.add("unavailable")})}destroy(){this.log("Destroying embed-lvt block"),this.client&&(this.client.disconnect(),this.client=null)}handleMessage(t,n,r,o){}computeEndpoints(t,n){if(!t)return{wsUrl:`${window.location.protocol==="https:"?"wss:":"ws:"}//${window.location.host}${n}`,liveUrl:n};let r=new URL(t);return{wsUrl:`${r.protocol==="https:"?"wss:":"ws:"}//${r.host}${n}`,liveUrl:`${r.origin}${n}`}}};var Me=class{constructor(e){this.tabs=null;this.blocks=new Map;this.ws=null;this.reconnectTimer=null;this.isConnected=!1;this.options={debug:!1,persistence:!0,cdnFallback:!1,...e},this.router=new be(this.options.debug),this.persistence=new ye("tinkerdown:persistence",this.options.persistence,this.options.debug),this.options.debug&&console.log("[TinkerdownClient] Initialized with options:",this.options)}connect(){if(this.ws){console.warn("[TinkerdownClient] Already connected");return}try{this.ws=new WebSocket(this.options.wsUrl),this.ws.onopen=()=>{this.isConnected=!0,console.log("[TinkerdownClient] Connected to server"),this.options.onConnect?.()},this.ws.onclose=()=>{this.isConnected=!1,console.log("[TinkerdownClient] Disconnected from server"),this.options.onDisconnect?.(),this.scheduleReconnect()},this.ws.onerror=e=>{console.error("[TinkerdownClient] WebSocket error:",e),this.options.onError?.(new Error("WebSocket error"))},this.ws.onmessage=e=>{this.handleMessage(e.data)}}catch(e){console.error("[TinkerdownClient] Failed to connect:",e),this.options.onError?.(e)}}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws&&(this.ws.close(),this.ws=null),this.isConnected=!1}handleMessage(e){this.options.debug&&console.log("[TinkerdownClient] Received message:",e),this.router.route(e)}send(e,t,n={}){if(!this.isConnected||!this.ws){console.warn("[TinkerdownClient] Cannot send - not connected");return}let o=JSON.stringify({blockID:e,action:t,data:n});this.options.debug&&console.log("[TinkerdownClient] Sending message:",o),this.ws.send(o)}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=window.setTimeout(()=>{this.reconnectTimer=null,console.log("[TinkerdownClient] Attempting to reconnect..."),this.connect()},3e3))}discoverBlocks(){console.log("[TinkerdownClient] Discovering blocks..."),(0,Nr.setupReactiveAttributeListeners)(),this.tabs=new we(this.options.debug),this.tabs.setMessageSender((t,n,r)=>{this.send(t,n,r)});let e=document.querySelectorAll("[data-tinkerdown-block]");for(let t of Array.from(e))try{let n=this.extractMetadata(t),r=this.extractCode(t),o={element:t,metadata:n,initialCode:r};this.registerBlock(o)}catch(n){console.error("[TinkerdownClient] Error discovering block:",n)}console.log(`[TinkerdownClient] Discovered ${this.blocks.size} blocks`)}extractMetadata(e){let t=e.dataset.blockId||this.generateBlockId(),n=e.dataset.blockType||"server",r=e.dataset.language||"go",o=e.dataset.readonly==="true",s=e.dataset.editable==="true",a=e.dataset.stateRef;return{id:t,type:n,language:r,readonly:o,editable:s,stateRef:a}}extractCode(e){let t=e.querySelector("code");return t?t.textContent||"":e.textContent||""}generateBlockId(){return`block-${Date.now()}-${Math.random().toString(36).substr(2,9)}`}registerBlock(e){let{metadata:t}=e;if(this.blocks.has(t.id)){console.warn(`[TinkerdownClient] Block already registered: ${t.id}`);return}let n;switch(t.type){case"server":n=new ke(e,this.persistence,this.options.debug);break;case"interactive":case"lvt":n=new Ee(e,this.persistence,this.options.debug),n.setMessageSender((r,o,s)=>{this.send(r,o,s)});break;case"wasm":n=new Le(e,this.persistence,this.options.debug);break;case"embed-lvt":n=new xt(e,this.persistence,this.options.debug);break;default:console.warn(`[TinkerdownClient] Unknown block type: ${t.type}`);return}n.initialize(),this.router.register(t.id,(r,o,s,a)=>{n.handleMessage(r,o,s,a)}),this.blocks.set(t.id,n),this.options.debug&&console.log(`[TinkerdownClient] Registered block: ${t.id} (${t.type})`)}unregisterBlock(e){let t=this.blocks.get(e);t&&(t.destroy(),this.router.unregister(e),this.blocks.delete(e),this.options.debug&&console.log(`[TinkerdownClient] Unregistered block: ${e}`))}getBlock(e){return this.blocks.get(e)}getBlockIds(){return Array.from(this.blocks.keys())}destroy(){console.log("[TinkerdownClient] Destroying client");for(let e of this.blocks.values())e.destroy();this.blocks.clear(),this.router.clear(),this.disconnect()}};var St=class{constructor(){this.steps=[];this.currentStepIndex=0;this.sidebar=null;this.bottomNav=null;this.init()}init(){if(document.querySelector(".tinkerdown-nav-sidebar"))return;let e=document.querySelector('meta[name="tinkerdown-sidebar"]');e&&e.getAttribute("content")==="false"||(this.parseSteps(),this.steps.length!==0&&(this.createSidebar(),this.createBottomNav(),this.setupKeyboardShortcuts(),this.setupHashNavigation(),this.setupScrollTracking(),this.initializeFromHash()))}parseSteps(){document.querySelectorAll("h2").forEach((t,n)=>{let r=t.id||this.generateId(t.textContent||"");t.id||(t.id=r),this.steps.push({id:r,title:t.textContent||"",element:t,index:n})})}generateId(e){return e.toLowerCase().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").trim()}createSidebar(){this.sidebar=document.createElement("nav"),this.sidebar.className="tinkerdown-nav-sidebar",this.sidebar.innerHTML=` @@ -127,7 +127,7 @@ Next \u2192 - `;let e=this.bottomNav.querySelector(".nav-prev"),t=this.bottomNav.querySelector(".nav-next");e?.addEventListener("click",()=>this.navigatePrev()),t?.addEventListener("click",()=>this.navigateNext()),document.body.appendChild(this.bottomNav)}setupKeyboardShortcuts(){document.addEventListener("keydown",e=>{if(!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement))switch(e.key){case"ArrowRight":case"ArrowDown":e.preventDefault(),this.navigateNext();break;case"ArrowLeft":case"ArrowUp":e.preventDefault(),this.navigatePrev();break}})}setupHashNavigation(){window.addEventListener("hashchange",()=>{this.handleHashChange()})}setupScrollTracking(){let e=new IntersectionObserver(t=>{t.forEach(n=>{if(n.isIntersecting){let r=n.target,o=this.steps.findIndex(s=>s.element===r);o!==-1&&o!==this.currentStepIndex&&this.updateCurrentStep(o,!1)}})},{threshold:.5,rootMargin:"-100px 0px -50% 0px"});this.steps.forEach(t=>e.observe(t.element))}initializeFromHash(){let e=window.location.hash.slice(1);if(e){let t=this.steps.findIndex(n=>n.id===e);if(t!==-1){this.navigateToStep(t);return}}this.updateCurrentStep(0,!1)}handleHashChange(){let e=window.location.hash.slice(1);if(e){let t=this.steps.findIndex(n=>n.id===e);t!==-1&&this.navigateToStep(t,!1)}}navigateToStep(e,t=!0){e<0||e>=this.steps.length||(this.updateCurrentStep(e,!0),t&&history.pushState(null,"",`#${this.steps[e].id}`))}navigateNext(){this.currentStepIndex0&&this.navigateToStep(this.currentStepIndex-1)}updateCurrentStep(e,t=!0){if(this.currentStepIndex=e,this.sidebar&&this.sidebar.querySelectorAll(".nav-step").forEach((n,r)=>{n.classList.toggle("active",r===e)}),this.bottomNav){let n=this.bottomNav.querySelector(".nav-prev"),r=this.bottomNav.querySelector(".nav-next"),o=this.bottomNav.querySelector(".current-step");n&&(n.disabled=e===0),r&&(r.disabled=e===this.steps.length-1),o&&(o.textContent=String(e+1))}t&&this.scrollToStep(e)}scrollToStep(e){let t=this.steps[e];t&&t.element.scrollIntoView({behavior:"smooth",block:"start"})}getCurrentStep(){return this.currentStepIndex}getTotalSteps(){return this.steps.length}goToStep(e){this.navigateToStep(e)}};var yt=class{constructor(){this.searchIndex=[];this.searchModal=null;this.searchInput=null;this.resultsContainer=null;this.selectedIndex=0;document.querySelector(".tinkerdown-nav-sidebar")&&this.init()}async init(){await this.loadSearchIndex(),this.createSearchModal(),this.setupKeyboardShortcuts(),this.addSearchButton()}async loadSearchIndex(){try{let e=await fetch("/search-index.json");if(!e.ok)return;let t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return;this.searchIndex=await e.json(),console.log(`[Search] Loaded ${this.searchIndex.length} pages`)}catch{}}createSearchModal(){this.searchModal=document.createElement("div"),this.searchModal.className="search-modal",this.searchModal.innerHTML=` + `;let e=this.bottomNav.querySelector(".nav-prev"),t=this.bottomNav.querySelector(".nav-next");e?.addEventListener("click",()=>this.navigatePrev()),t?.addEventListener("click",()=>this.navigateNext()),document.body.appendChild(this.bottomNav)}setupKeyboardShortcuts(){document.addEventListener("keydown",e=>{if(!(e.target instanceof HTMLInputElement||e.target instanceof HTMLTextAreaElement))switch(e.key){case"ArrowRight":case"ArrowDown":e.preventDefault(),this.navigateNext();break;case"ArrowLeft":case"ArrowUp":e.preventDefault(),this.navigatePrev();break}})}setupHashNavigation(){window.addEventListener("hashchange",()=>{this.handleHashChange()})}setupScrollTracking(){let e=new IntersectionObserver(t=>{t.forEach(n=>{if(n.isIntersecting){let r=n.target,o=this.steps.findIndex(s=>s.element===r);o!==-1&&o!==this.currentStepIndex&&this.updateCurrentStep(o,!1)}})},{threshold:.5,rootMargin:"-100px 0px -50% 0px"});this.steps.forEach(t=>e.observe(t.element))}initializeFromHash(){let e=window.location.hash.slice(1);if(e){let t=this.steps.findIndex(n=>n.id===e);if(t!==-1){this.navigateToStep(t);return}}this.updateCurrentStep(0,!1)}handleHashChange(){let e=window.location.hash.slice(1);if(e){let t=this.steps.findIndex(n=>n.id===e);t!==-1&&this.navigateToStep(t,!1)}}navigateToStep(e,t=!0){e<0||e>=this.steps.length||(this.updateCurrentStep(e,!0),t&&history.pushState(null,"",`#${this.steps[e].id}`))}navigateNext(){this.currentStepIndex0&&this.navigateToStep(this.currentStepIndex-1)}updateCurrentStep(e,t=!0){if(this.currentStepIndex=e,this.sidebar&&this.sidebar.querySelectorAll(".nav-step").forEach((n,r)=>{n.classList.toggle("active",r===e)}),this.bottomNav){let n=this.bottomNav.querySelector(".nav-prev"),r=this.bottomNav.querySelector(".nav-next"),o=this.bottomNav.querySelector(".current-step");n&&(n.disabled=e===0),r&&(r.disabled=e===this.steps.length-1),o&&(o.textContent=String(e+1))}t&&this.scrollToStep(e)}scrollToStep(e){let t=this.steps[e];t&&t.element.scrollIntoView({behavior:"smooth",block:"start"})}getCurrentStep(){return this.currentStepIndex}getTotalSteps(){return this.steps.length}goToStep(e){this.navigateToStep(e)}};var At=class{constructor(){this.searchIndex=[];this.searchModal=null;this.searchInput=null;this.resultsContainer=null;this.selectedIndex=0;document.querySelector(".tinkerdown-nav-sidebar")&&this.init()}async init(){await this.loadSearchIndex(),this.createSearchModal(),this.setupKeyboardShortcuts(),this.addSearchButton()}async loadSearchIndex(){try{let e=await fetch("/search-index.json");if(!e.ok)return;let t=e.headers.get("content-type");if(!t||!t.includes("application/json"))return;this.searchIndex=await e.json(),console.log(`[Search] Loaded ${this.searchIndex.length} pages`)}catch{}}createSearchModal(){this.searchModal=document.createElement("div"),this.searchModal.className="search-modal",this.searchModal.innerHTML=`
@@ -176,7 +176,7 @@ ${this.highlightMatch(this.truncateContent(t.content),this.searchInput?.value||"")}
- `).join(""),this.resultsContainer.querySelectorAll(".search-result").forEach(t=>{t.addEventListener("click",()=>this.closeSearch())})}}highlightMatch(e,t){if(!t)return e;let n=new RegExp(`(${this.escapeRegex(t)})`,"gi");return e.replace(n,"$1")}truncateContent(e,t=200){return e.length<=t?e:e.substring(0,t)+"..."}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}handleKeyDown(e){if(!this.resultsContainer)return;let t=this.resultsContainer.querySelectorAll(".search-result");switch(e.key){case"Escape":e.preventDefault(),this.closeSearch();break;case"ArrowDown":if(t.length===0)return;e.preventDefault(),this.selectedIndex=Math.min(this.selectedIndex+1,t.length-1),this.updateSelection();break;case"ArrowUp":if(t.length===0)return;e.preventDefault(),this.selectedIndex=Math.max(this.selectedIndex-1,0),this.updateSelection();break;case"Enter":if(t.length===0)return;e.preventDefault();let n=t[this.selectedIndex];n&&(window.location.href=n.href,this.closeSearch());break}}updateSelection(){if(!this.resultsContainer)return;let e=this.resultsContainer.querySelectorAll(".search-result");e.forEach((n,r)=>{n.classList.toggle("selected",r===this.selectedIndex)});let t=e[this.selectedIndex];t&&t.scrollIntoView({block:"nearest",behavior:"smooth"})}};var wt=class i{static{this.COPY_BUTTON_CLASS="code-copy-btn"}static{this.CODE_WRAPPER_CLASS="code-block-wrapper"}static{this.COPIED_CLASS="copied"}constructor(){this.init()}init(){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.addCopyButtons()):this.addCopyButtons()}addCopyButtons(){document.querySelectorAll("pre > code").forEach(t=>{let n=t.parentElement;if(!n||n.querySelector(`.${i.COPY_BUTTON_CLASS}`))return;if(!n.parentElement?.classList.contains(i.CODE_WRAPPER_CLASS)){let o=document.createElement("div");o.className=i.CODE_WRAPPER_CLASS,n.parentNode?.insertBefore(o,n),o.appendChild(n)}let r=this.createCopyButton();n.appendChild(r),r.addEventListener("click",o=>{o.preventDefault(),this.copyCode(t,r)})})}createCopyButton(){let e=document.createElement("button");return e.className=i.COPY_BUTTON_CLASS,e.setAttribute("aria-label","Copy code to clipboard"),e.innerHTML=this.getCopyIcon(),e}async copyCode(e,t){let n=e.textContent||"";try{await navigator.clipboard.writeText(n),this.showCopiedFeedback(t)}catch(r){console.error("Failed to copy code:",r),this.fallbackCopy(n,t)}}showCopiedFeedback(e){e.classList.add(i.COPIED_CLASS),e.innerHTML=this.getCheckIcon(),e.setAttribute("aria-label","Code copied!"),setTimeout(()=>{e.classList.remove(i.COPIED_CLASS),e.innerHTML=this.getCopyIcon(),e.setAttribute("aria-label","Copy code to clipboard")},2e3)}fallbackCopy(e,t){let n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select();try{document.execCommand("copy"),this.showCopiedFeedback(t)}catch(r){console.error("Fallback copy failed:",r)}finally{document.body.removeChild(n)}}getCopyIcon(){return` + `).join(""),this.resultsContainer.querySelectorAll(".search-result").forEach(t=>{t.addEventListener("click",()=>this.closeSearch())})}}highlightMatch(e,t){if(!t)return e;let n=new RegExp(`(${this.escapeRegex(t)})`,"gi");return e.replace(n,"$1")}truncateContent(e,t=200){return e.length<=t?e:e.substring(0,t)+"..."}escapeRegex(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}handleKeyDown(e){if(!this.resultsContainer)return;let t=this.resultsContainer.querySelectorAll(".search-result");switch(e.key){case"Escape":e.preventDefault(),this.closeSearch();break;case"ArrowDown":if(t.length===0)return;e.preventDefault(),this.selectedIndex=Math.min(this.selectedIndex+1,t.length-1),this.updateSelection();break;case"ArrowUp":if(t.length===0)return;e.preventDefault(),this.selectedIndex=Math.max(this.selectedIndex-1,0),this.updateSelection();break;case"Enter":if(t.length===0)return;e.preventDefault();let n=t[this.selectedIndex];n&&(window.location.href=n.href,this.closeSearch());break}}updateSelection(){if(!this.resultsContainer)return;let e=this.resultsContainer.querySelectorAll(".search-result");e.forEach((n,r)=>{n.classList.toggle("selected",r===this.selectedIndex)});let t=e[this.selectedIndex];t&&t.scrollIntoView({block:"nearest",behavior:"smooth"})}};var Tt=class i{static{this.COPY_BUTTON_CLASS="code-copy-btn"}static{this.CODE_WRAPPER_CLASS="code-block-wrapper"}static{this.COPIED_CLASS="copied"}constructor(){this.init()}init(){document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>this.addCopyButtons()):this.addCopyButtons()}addCopyButtons(){document.querySelectorAll("pre > code").forEach(t=>{let n=t.parentElement;if(!n||n.querySelector(`.${i.COPY_BUTTON_CLASS}`))return;if(!n.parentElement?.classList.contains(i.CODE_WRAPPER_CLASS)){let o=document.createElement("div");o.className=i.CODE_WRAPPER_CLASS,n.parentNode?.insertBefore(o,n),o.appendChild(n)}let r=this.createCopyButton();n.appendChild(r),r.addEventListener("click",o=>{o.preventDefault(),this.copyCode(t,r)})})}createCopyButton(){let e=document.createElement("button");return e.className=i.COPY_BUTTON_CLASS,e.setAttribute("aria-label","Copy code to clipboard"),e.innerHTML=this.getCopyIcon(),e}async copyCode(e,t){let n=e.textContent||"";try{await navigator.clipboard.writeText(n),this.showCopiedFeedback(t)}catch(r){console.error("Failed to copy code:",r),this.fallbackCopy(n,t)}}showCopiedFeedback(e){e.classList.add(i.COPIED_CLASS),e.innerHTML=this.getCheckIcon(),e.setAttribute("aria-label","Code copied!"),setTimeout(()=>{e.classList.remove(i.COPIED_CLASS),e.innerHTML=this.getCopyIcon(),e.setAttribute("aria-label","Copy code to clipboard")},2e3)}fallbackCopy(e,t){let n=document.createElement("textarea");n.value=e,n.style.position="fixed",n.style.opacity="0",document.body.appendChild(n),n.select();try{document.execCommand("copy"),this.showCopiedFeedback(t)}catch(r){console.error("Fallback copy failed:",r)}finally{document.body.removeChild(n)}}getCopyIcon(){return` @@ -185,11 +185,11 @@ - `}};var kt=class{constructor(){this.sections=[];this.tocElement=null;this.currentActiveSection=-1;this.init()}init(){document.querySelector(".tinkerdown-nav-sidebar")&&(this.parseSections(),this.sections.length!==0&&(this.createTOC(),this.setupScrollTracking()))}parseSections(){let t=document.querySelectorAll(".content-wrapper h2").length>=8||document.querySelectorAll(".content-wrapper h3").length>=10;document.querySelectorAll(t?".content-wrapper h2, .content-wrapper h3":".content-wrapper h2").forEach((r,o)=>{let s=r.id||this.generateId(r.textContent||""),a=r.tagName.toLowerCase();r.id||(r.id=s),this.sections.push({id:s,title:r.textContent||"",element:r,index:o,level:a==="h3"?3:2})})}generateId(e){return e.toLowerCase().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").trim()}createTOC(){let e=document.querySelector(".tinkerdown-nav-sidebar");if(!e)return;let t=e.querySelector(".nav-page-link.active");if(!t)return;let n=t.closest("li");if(!n)return;let r=document.createElement("ul");r.className="page-toc-list",r.innerHTML=this.sections.map((o,s)=>` + `}};var Ct=class{constructor(){this.sections=[];this.tocElement=null;this.currentActiveSection=-1;this.init()}init(){document.querySelector(".tinkerdown-nav-sidebar")&&(this.parseSections(),this.sections.length!==0&&(this.createTOC(),this.setupScrollTracking()))}parseSections(){let t=document.querySelectorAll(".content-wrapper h2").length>=8||document.querySelectorAll(".content-wrapper h3").length>=10;document.querySelectorAll(t?".content-wrapper h2, .content-wrapper h3":".content-wrapper h2").forEach((r,o)=>{let s=r.id||this.generateId(r.textContent||""),a=r.tagName.toLowerCase();r.id||(r.id=s),this.sections.push({id:s,title:r.textContent||"",element:r,index:o,level:a==="h3"?3:2})})}generateId(e){return e.toLowerCase().replace(/[^\w\s-]/g,"").replace(/\s+/g,"-").replace(/-+/g,"-").trim()}createTOC(){let e=document.querySelector(".tinkerdown-nav-sidebar");if(!e)return;let t=e.querySelector(".nav-page-link.active");if(!t)return;let n=t.closest("li");if(!n)return;let r=document.createElement("ul");r.className="page-toc-list",r.innerHTML=this.sections.map((o,s)=>`
  • ${this.escapeHtml(o.title)}
  • - `).join(""),r.querySelectorAll(".page-toc-item").forEach((o,s)=>{o.querySelector("a")?.addEventListener("click",c=>{c.preventDefault(),this.scrollToSection(s)})}),n.appendChild(r),n.classList.add("has-subnav"),this.tocElement=r}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}setupScrollTracking(){let e=new IntersectionObserver(t=>{t.forEach(n=>{if(n.isIntersecting){let r=n.target,o=this.sections.findIndex(s=>s.element===r);o!==-1&&o!==this.currentActiveSection&&this.updateActiveSection(o)}})},{threshold:.5,rootMargin:"-100px 0px -50% 0px"});this.sections.forEach(t=>e.observe(t.element))}updateActiveSection(e){this.currentActiveSection=e,this.tocElement&&this.tocElement.querySelectorAll(".page-toc-item").forEach((t,n)=>{t.classList.toggle("active",n===e)})}scrollToSection(e){let t=this.sections[e];t&&(t.element.scrollIntoView({behavior:"smooth",block:"start"}),history.pushState(null,"",`#${t.id}`))}};function Mr(){if(window.LIVEMDTOOLS_DISABLE_AUTO_INIT){console.log("[Tinkerdown] Auto-initialization disabled");return}let e=document.querySelector('meta[name="tinkerdown-ws-url"]')?.content||`ws://${window.location.host}/ws`,n=document.querySelector('meta[name="tinkerdown-debug"]')?.content==="true";mt()&&(console.log("[Tinkerdown] Preloading Monaco Editor for WASM blocks..."),gt());let r=new Ce({wsUrl:e,debug:n,persistence:!0,onConnect:()=>console.log("[Tinkerdown] Connected"),onDisconnect:()=>console.log("[Tinkerdown] Disconnected"),onError:d=>console.error("[Tinkerdown] Error:",d)});r.discoverBlocks(),r.getBlockIds().some(d=>{let h=r.getBlock(d);return h?.type==="interactive"||h?.type==="lvt"})&&r.connect(),window.tinkerdownClient=r;let s=new vt;window.tinkerdownNavigation=s;let a=new kt;window.tinkerdownPageTOC=a;let c=new yt;window.tinkerdownSearch=c;let l=new wt;window.tinkerdownCodeCopy=l,console.log(`[Tinkerdown] Initialized with ${r.getBlockIds().length} blocks`)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Mr):Mr());return Pr(Fo);})(); + `).join(""),r.querySelectorAll(".page-toc-item").forEach((o,s)=>{o.querySelector("a")?.addEventListener("click",c=>{c.preventDefault(),this.scrollToSection(s)})}),n.appendChild(r),n.classList.add("has-subnav"),this.tocElement=r}escapeHtml(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}setupScrollTracking(){let e=new IntersectionObserver(t=>{t.forEach(n=>{if(n.isIntersecting){let r=n.target,o=this.sections.findIndex(s=>s.element===r);o!==-1&&o!==this.currentActiveSection&&this.updateActiveSection(o)}})},{threshold:.5,rootMargin:"-100px 0px -50% 0px"});this.sections.forEach(t=>e.observe(t.element))}updateActiveSection(e){this.currentActiveSection=e,this.tocElement&&this.tocElement.querySelectorAll(".page-toc-item").forEach((t,n)=>{t.classList.toggle("active",n===e)})}scrollToSection(e){let t=this.sections[e];t&&(t.element.scrollIntoView({behavior:"smooth",block:"start"}),history.pushState(null,"",`#${t.id}`))}};function Fr(){if(window.LIVEMDTOOLS_DISABLE_AUTO_INIT){console.log("[Tinkerdown] Auto-initialization disabled");return}let e=document.querySelector('meta[name="tinkerdown-ws-url"]')?.content||`ws://${window.location.host}/ws`,n=document.querySelector('meta[name="tinkerdown-debug"]')?.content==="true";Et()&&(console.log("[Tinkerdown] Preloading Monaco Editor for WASM blocks..."),kt());let r=new Me({wsUrl:e,debug:n,persistence:!0,onConnect:()=>console.log("[Tinkerdown] Connected"),onDisconnect:()=>console.log("[Tinkerdown] Disconnected"),onError:d=>console.error("[Tinkerdown] Error:",d)});r.discoverBlocks(),r.getBlockIds().some(d=>{let h=r.getBlock(d);return h?.type==="interactive"||h?.type==="lvt"})&&r.connect(),window.tinkerdownClient=r;let s=new St;window.tinkerdownNavigation=s;let a=new Ct;window.tinkerdownPageTOC=a;let c=new At;window.tinkerdownSearch=c;let l=new Tt;window.tinkerdownCodeCopy=l,console.log(`[Tinkerdown] Initialized with ${r.getBlockIds().length} blocks`)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Fr):Fr());return jr(ss);})(); //# sourceMappingURL=tinkerdown-client.browser.js.map diff --git a/internal/assets/client/tinkerdown-client.browser.js.map b/internal/assets/client/tinkerdown-client.browser.js.map index ebce5f4..eaf82d1 100644 --- a/internal/assets/client/tinkerdown-client.browser.js.map +++ b/internal/assets/client/tinkerdown-client.browser.js.map @@ -2,6 +2,6 @@ "version": 3, "sources": ["../node_modules/morphdom/dist/morphdom.js", "../node_modules/@livetemplate/client/constants.ts", "../node_modules/@livetemplate/client/dom/focus-manager.ts", "../node_modules/@livetemplate/client/dom/reactive-attributes.ts", "../node_modules/@livetemplate/client/dom/directives.ts", "../node_modules/@livetemplate/client/utils/rate-limit.ts", "../node_modules/@livetemplate/client/dom/redact.ts", "../node_modules/@livetemplate/client/utils/lvt-selector.ts", "../node_modules/@livetemplate/client/utils/legacy-attr.ts", "../node_modules/@livetemplate/client/dom/event-delegation.ts", "../node_modules/@livetemplate/client/dom/hash-link.ts", "../node_modules/@livetemplate/client/dom/link-interceptor.ts", "../node_modules/@livetemplate/client/dom/observer-manager.ts", "../node_modules/@livetemplate/client/dom/loading-indicator.ts", "../node_modules/@livetemplate/client/dom/form-disabler.ts", "../node_modules/@livetemplate/client/dom/invoker-polyfill.ts", "../node_modules/@livetemplate/client/dom/scroll-away.ts", "../node_modules/@livetemplate/client/dom/spy.ts", "../node_modules/@livetemplate/client/state/tree-renderer.ts", "../node_modules/@livetemplate/client/state/range-dom-applier.ts", "../node_modules/@livetemplate/client/state/form-lifecycle-manager.ts", "../node_modules/@livetemplate/client/state/change-auto-wirer.ts", "../node_modules/@livetemplate/client/transport/websocket.ts", "../node_modules/@livetemplate/client/upload/s3-uploader.ts", "../node_modules/@livetemplate/client/upload/upload-handler.ts", "../node_modules/@livetemplate/client/utils/logger.ts", "../node_modules/@livetemplate/client/utils/testing.ts", "../node_modules/@livetemplate/client/livetemplate-client.ts", "../src/browser.ts", "../src/tinkerdown-client.ts", "../src/core/message-router.ts", "../src/core/persistence-manager.ts", "../src/core/tabs.ts", "../src/blocks/base-block.ts", "../src/blocks/server-block.ts", "../src/blocks/interactive-block.ts", "../src/editor/monaco-loader.ts", "../src/editor/monaco-editor.ts", "../src/ui/output-panel.ts", "../src/ui/run-button.ts", "../src/wasm/tinygo-executor.ts", "../src/blocks/wasm-block.ts", "../src/blocks/embed-lvt-block.ts", "../src/core/navigation.ts", "../src/core/search.ts", "../src/core/code-copy.ts", "../src/core/page-toc.ts", "../src/auto-init.ts"], "sourcesContent": ["'use strict';\n\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\nfunction morphAttrs(fromNode, toNode) {\n var toNodeAttrs = toNode.attributes;\n var attr;\n var attrName;\n var attrNamespaceURI;\n var attrValue;\n var fromValue;\n\n // document-fragments dont have attributes so lets not do anything\n if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {\n return;\n }\n\n // update attributes on original DOM element\n for (var i = toNodeAttrs.length - 1; i >= 0; i--) {\n attr = toNodeAttrs[i];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n attrValue = attr.value;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);\n\n if (fromValue !== attrValue) {\n if (attr.prefix === 'xmlns'){\n attrName = attr.name; // It's not allowed to set an attribute with the XMLNS namespace without specifying the `xmlns` prefix\n }\n fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);\n }\n } else {\n fromValue = fromNode.getAttribute(attrName);\n\n if (fromValue !== attrValue) {\n fromNode.setAttribute(attrName, attrValue);\n }\n }\n }\n\n // Remove any extra attributes found on the original DOM element that\n // weren't found on the target element.\n var fromNodeAttrs = fromNode.attributes;\n\n for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {\n attr = fromNodeAttrs[d];\n attrName = attr.name;\n attrNamespaceURI = attr.namespaceURI;\n\n if (attrNamespaceURI) {\n attrName = attr.localName || attrName;\n\n if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {\n fromNode.removeAttributeNS(attrNamespaceURI, attrName);\n }\n } else {\n if (!toNode.hasAttribute(attrName)) {\n fromNode.removeAttribute(attrName);\n }\n }\n }\n}\n\nvar range; // Create a range object for efficently rendering strings to elements.\nvar NS_XHTML = 'http://www.w3.org/1999/xhtml';\n\nvar doc = typeof document === 'undefined' ? undefined : document;\nvar HAS_TEMPLATE_SUPPORT = !!doc && 'content' in doc.createElement('template');\nvar HAS_RANGE_SUPPORT = !!doc && doc.createRange && 'createContextualFragment' in doc.createRange();\n\nfunction createFragmentFromTemplate(str) {\n var template = doc.createElement('template');\n template.innerHTML = str;\n return template.content.childNodes[0];\n}\n\nfunction createFragmentFromRange(str) {\n if (!range) {\n range = doc.createRange();\n range.selectNode(doc.body);\n }\n\n var fragment = range.createContextualFragment(str);\n return fragment.childNodes[0];\n}\n\nfunction createFragmentFromWrap(str) {\n var fragment = doc.createElement('body');\n fragment.innerHTML = str;\n return fragment.childNodes[0];\n}\n\n/**\n * This is about the same\n * var html = new DOMParser().parseFromString(str, 'text/html');\n * return html.body.firstChild;\n *\n * @method toElement\n * @param {String} str\n */\nfunction toElement(str) {\n str = str.trim();\n if (HAS_TEMPLATE_SUPPORT) {\n // avoid restrictions on content for things like `
    ` which\n // createContextualFragment doesn't support\n //
    Hi