function S(t){let e=new Map;for(let r of t){let n=h(r.id);e.set(n,ot(n,r.value))}return e}function h(t){return typeof t=="string"?t:typeof t=="number"?`s${t}`:`s${t[0]}`}function ot(t,e){let r=e,n=new Set,o={id:t,get value(){return r},set value(s){o.set(s)},set(s){Object.is(s,r)||(r=s,n.forEach(a=>a(r)))},update(s){let a=s(r);a!==void 0?o.set(a):n.forEach(i=>i(r))},subscribe(s){return n.add(s),()=>n.delete(s)}};return o}var st="RESUMA-DYN";function w(t,e){t.querySelectorAll(st.toLowerCase()).forEach(n=>{let o=n.getAttribute("data-r-signal");if(!o)return;let s=e.get(o);s&&s.subscribe(a=>{n.textContent=T(a)})})}function b(t,e){t.querySelectorAll("[data-r-bind]").forEach(n=>O(n,e)),at(t,e)}function at(t,e){let r=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT),n=r.currentNode;for(;n;)n instanceof HTMLElement&&O(n,e),n=r.nextNode()}function O(t,e){for(let r of Array.from(t.attributes)){let n=r.name;if(!n.startsWith("data-r-bind:"))continue;let o=n.slice(12),[s,a="{}"]=r.value.split("|"),i=e.get(s);if(!i)continue;let c=u=>{let l=a.replace("{}",T(u));t.setAttribute(o,l)};c(i.value),i.subscribe(c)}}function T(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);try{return JSON.stringify(t)}catch{return String(t)}}function L(t,e){t.querySelectorAll("resuma-show").forEach(r=>{let n=r.getAttribute("data-r-show");if(!n)return;let o=r.getAttribute("data-r-inverted")==="true",s=r.querySelector("[data-r-show-if]"),a=r.querySelector("[data-r-show-else]"),i=e.get(n);if(!i||!s)return;let c=u=>{let l=o?!u:!!u;s.hidden=!l,a&&(a.hidden=l);let d=r.dataset.rPortalTarget,f=s.querySelector("template[data-r-portal]");if(!d&&f&&(d=f.getAttribute("data-r-portal")??void 0,d&&(r.dataset.rPortalTarget=d)),d){let g=document.getElementById(d)??document.querySelector(`[data-r-portal-target="${d}"]`);g&&(l?f&&it(s):g.replaceChildren())}};c(i.value),i.subscribe(c)})}function it(t){t.querySelectorAll("template[data-r-portal]").forEach(e=>{if(e.closest("[data-r-show-if]")?.hidden)return;let n=e.getAttribute("data-r-portal");if(!n)return;let o=document.getElementById(n)??document.querySelector(`[data-r-portal-target="${n}"]`);o&&o.replaceChildren(e.content.cloneNode(!0))})}function F(t){if(t&&typeof t=="object")for(let e of["title","name","label","text"]){let r=t[e];if(typeof r=="string")return r}return T(t)}function ct(t,e,r){if(r){let a=r.cloneNode(!0);a.setAttribute("data-r-for-key",e),a.removeAttribute("data-r-for-new");let i=a.querySelector(".todo-title");return i&&(i.textContent=F(t)),a}let n=document.createElement("div");n.setAttribute("data-r-for-item",""),n.setAttribute("data-r-for-key",e);let o=document.createElement("li");o.className="todo-item";let s=document.createElement("span");return s.className="todo-title",s.textContent=F(t),o.appendChild(s),n.appendChild(o),n}function lt(t,e,r){if(e&&t&&typeof t=="object"){let n=t[e];if(n!=null)return String(n)}return String(r)}function A(t,e){t.querySelectorAll("resuma-for").forEach(r=>{let n=r.getAttribute("data-r-for");if(!n)return;let o=r.getAttribute("data-r-key"),s=r.querySelector("[data-r-for-list]"),a=e.get(n);if(!a||!s)return;let i=c=>{let u=Array.isArray(c)?c:[],l=new Map;s.querySelectorAll("[data-r-for-item]").forEach(m=>{let v=m.getAttribute("data-r-for-key");v&&l.set(v,m)});let d=[],f=document.createDocumentFragment(),g=s.querySelector("[data-r-for-item]:not([data-r-for-new])")??void 0;u.forEach((m,v)=>{let k=lt(m,o,v);d.push(k);let E=l.get(k);E?l.delete(k):(E=ct(m,k,g),E.setAttribute("data-r-for-new","true")),f.appendChild(E)}),s.replaceChildren(f),l.forEach(m=>m.remove())};i(a.value),a.subscribe(i)})}function _(t,e){t.querySelectorAll("resuma-match").forEach(r=>{let n=r.getAttribute("data-r-match");if(!n)return;let o=e.get(n);if(!o)return;let s=r.querySelectorAll("[data-r-match-case]"),a=r.querySelector("[data-r-match-default]"),i=c=>{let u=typeof c=="string"?c:c==null?"":T(c),l=!1;s.forEach(d=>{let g=(d.getAttribute("data-r-match-when")??"")===u;d.hidden=!g,g&&(l=!0)}),a&&(a.hidden=l)};i(o.value),o.subscribe(i)})}function $(){let t=window.__resuma;if(!t)return;let e=document.getElementById("resuma-root")??document.body;w(e,t.signals),b(e,t.signals),L(e,t.signals),A(e,t.signals),_(e,t.signals)}var ut="resuma-island";function R(t,e){t.querySelectorAll(ut).forEach(n=>{let o=n.getAttribute("data-r-chunk");if(!o)return;if((n.getAttribute("data-r-load")??"eager")==="visible"&&"IntersectionObserver"in window){new IntersectionObserver((i,c)=>{for(let u of i)u.isIntersecting&&(c.unobserve(u.target),N(n,o,e))},{rootMargin:"100px"}).observe(n);return}N(n,o,e)})}async function N(t,e,r){let n=t.getAttribute("data-r-props")??"{}",o={};try{o=JSON.parse(n)}catch{}await dt(e,o,t,r)}async function dt(t,e,r,n){try{let o=await import(`/_resuma/island-chunk/${t}.js`);typeof o.resume=="function"&&o.resume(e,n,r)}catch(o){console.debug("[resuma] island chunk unavailable, staying static",t,o)}}function ft(t,e,r){let n=Object.create(r.state);if(!t)return n;for(let[o,s]of Object.entries(t)){let a=e.get(h(s));a&&(n[o]=a)}return n}function W(t,e,r){for(let n of t)try{let o=ft(n.captures,e,r),s=new Function(`return (${n.body});`)(),a=n.target!=null?e.get(h(n.target))??null:null,i=()=>{try{let l=s(o,r);a&&l!==void 0&&a.set(l)}catch(l){console.error("[resuma] effect",n.id,l)}},c,u=()=>{let l=n.debounce_ms;if(l!=null&&l>0){c!==void 0&&clearTimeout(c),c=setTimeout(i,l);return}i()};u();for(let l of n.deps)e.get(h(l))?.subscribe(()=>u())}catch(o){console.error("[resuma] effect init",n.id,o)}}function j(t){let e=window.__resuma;e&&(e.loaded.has(t)||import(`/_resuma/handler/${t}.js`).then(r=>{e.loaded.set(t,r)}).catch(()=>{}))}function B(t,e){let r=[...new Set(t.filter(o=>o&&o!=="__page__"))];if(!r.length)return;if(!("IntersectionObserver"in window)){for(let o of r)j(o);return}let n=new IntersectionObserver((o,s)=>{for(let a of o){if(!a.isIntersecting)continue;let i=a.target.dataset.rChunk;i&&j(i),s.unobserve(a.target)}},{rootMargin:"120px"});for(let o of e.querySelectorAll("resuma-boundary[data-r-chunk]"))n.observe(o);for(let o of r){let s=document.createElement("resuma-boundary");s.hidden=!0,s.dataset.rChunk=o,e.appendChild(s),n.observe(s)}}var D=new Map;async function U(t,e){if(e){let i=D.get(e);return i||(i=G(e),D.set(e,i)),i}let[r,n]=t.split("#"),o=window.__resuma;if(r==="__page__"){let i=o.handlers[r]?.[n];if(i)return G(i)}let s=o.loaded.get(r);s||(s=await import(`/_resuma/handler/${r}.js`),o.loaded.set(r,s));let a=s[n];if(!a)throw new Error(`[resuma] handler ${n} not found in chunk ${r}`);return a}function G(t){let e=t.trim(),n=e.startsWith("(")||e.startsWith("function")||e.startsWith("async")?`return (${t});`:`return (async (event, state, __resuma) => { ${t} });`;return new Function(n)()}var J="resuma-root",x="resuma-state",M=new Map,C=new Set;async function gt(t){if(!(!t||M.has(t)||C.has(t))&&!(t.startsWith("http")&&!t.startsWith(location.origin))){C.add(t);try{let e=await fetch(t,{headers:{Accept:"text/html"},credentials:"same-origin"});e.ok&&M.set(t,await e.text())}catch{}finally{C.delete(t)}}}var H=null;function K(t){H=t}function I(){return document.getElementById(J)??document.body}function mt(t){if(!t?.textContent)return{signals:[],handlers:{},islands:[],actions:[]};try{return JSON.parse(t.textContent)}catch(e){return console.error("[resuma] failed to parse state payload",e),{signals:[],handlers:{},islands:[],actions:[]}}}function pt(t,e){if(t===e)return!0;let r="http://resuma.local",n=new URL(t,r),o=new URL(e,r);if(n.search)return n.pathname+n.search===o.pathname+o.search;if(n.pathname===o.pathname)return!0;if(n.pathname!=="/"&&o.pathname.startsWith(n.pathname)){let s=o.pathname.charCodeAt(n.pathname.length);return s===void 0||s===47}return!1}function V(t){document.querySelectorAll("a[data-r-nav]").forEach(e=>{let r=e.getAttribute("href");if(!r)return;let n=e.getAttribute("data-r-active-class");if(!n)return;let o=(e.getAttribute("data-r-base-class")??e.className).split(/\s+/).filter(s=>s&&s!==n).join(" ");e.setAttribute("data-r-base-class",o),e.className=pt(r,t)?`${o} ${n}`.trim():o})}function ht(){if(!window.__resuma){window.location.reload();return}if(H){H(),V(location.pathname+location.search);return}let t=mt(document.getElementById(x)),e=S(t.signals),r={};for(let[a,i]of e)r[a]=i;let n=window.__resuma,o={state:r,signals:e,handlers:t.handlers,contexts:t.contexts??{},loaded:n.loaded??new Map,action:n.action,safeAction:n.safeAction,refreshIsland:n.refreshIsland,context:a=>o.contexts[a],navigate:p,buildUrl:y,invalidate:P};window.__resuma=o;let s=I();w(s,e),b(s,e),R(s,e),V(location.pathname+location.search)}function wt(){let t=I(),e=t.querySelector("[autofocus]")??t.querySelector("h1, [role='heading'], main")??t;e.hasAttribute("tabindex")||e.setAttribute("tabindex","-1");try{e.focus({preventScroll:!0})}catch{e.focus()}}function y(t,e){let r=new URL(t,location.origin);if(e)for(let[n,o]of Object.entries(e))o!=null&&o!==""&&r.searchParams.set(n,o);return r.pathname+r.search}async function P(t,e){let r=t?.split("?")[0]??location.pathname,n=String(Date.now());await p(y(r,{...e,_r:n}))}async function p(t,e=!0){try{let r=M.get(t);if(r)M.delete(t);else{let i=await fetch(t,{headers:{Accept:"text/html"},credentials:"same-origin"});if(!i.ok){window.location.href=t;return}r=await i.text()}let n=new DOMParser().parseFromString(r,"text/html"),o=n.getElementById(J),s=n.getElementById(x);if(!o||!s?.textContent){window.location.href=t;return}I().innerHTML=o.innerHTML;let a=document.getElementById(x);a&&(a.textContent=s.textContent),n.title&&(document.title=n.title),e&&history.pushState({resumaNav:!0},"",t),ht(),e&&window.scrollTo(0,0),wt(),document.dispatchEvent(new CustomEvent("resuma:navigate",{detail:{href:t}}))}catch(r){console.error("[resuma] navigation failed",r),window.location.href=t}}function q(t){t.startsWith("/")&&!t.startsWith("//")?p(t):window.location.assign(t)}function bt(t,e){if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey||t.target&&t.target!=="_self")return!1;let r=t.getAttribute("href");if(!r||r.startsWith("#")||r.startsWith("javascript:"))return!1;if(r.startsWith("http://")||r.startsWith("https://"))try{return new URL(r).origin===location.origin}catch{return!1}return!0}function z(){document.addEventListener("mouseenter",t=>{let e=t.target;if(!(e instanceof Element))return;let n=e.closest("a[data-r-nav]")?.getAttribute("href");n&>(n)},!0),document.addEventListener("click",t=>{let e=t.target;if(!(e instanceof Element))return;let r=e.closest("a[data-r-nav]");if(!r||!bt(r,t))return;let n=r.getAttribute("href");n&&(t.preventDefault(),p(n))}),window.addEventListener("popstate",()=>{p(location.pathname+location.search,!1)})}var Q="resuma-state",yt="resuma-root";function vt(){let t=document.getElementById(Q);if(!t?.textContent)return"";try{return JSON.parse(t.textContent).csrf_token??""}catch{return""}}function Z(t={}){let e={...t},r=vt();return r&&(e["x-resuma-csrf"]=r),e}var tt=()=>document.getElementById(yt)??document.body;function kt(){let t=document.getElementById(Q);if(!t||!t.textContent)return{signals:[],handlers:{},islands:[],actions:[]};try{return JSON.parse(t.textContent)}catch(e){return console.error("[resuma] failed to parse state payload",e),{signals:[],handlers:{},islands:[],actions:[]}}}var X=!1;function Y(){let t=kt(),e=S(t.signals),r={};for(let[a,i]of e)r[a]=i;let n=window.__resuma,o={state:r,signals:e,handlers:t.handlers,contexts:t.contexts??{},loaded:n?.loaded??new Map,action:nt,safeAction:Ct,refreshIsland:rt,context:a=>o.contexts[a],navigate:p,buildUrl:y,invalidate:P};window.__resuma=o;let s=tt();w(s,e),b(s,e),L(s,e),A(s,e),_(s,e),R(s,e),Mt(s),Lt(s),At(s),_t(t.visible_tasks??{},r),W(t.effects??[],e,o),B(t.lazy_chunks??[],s)}async function Jt(){X||(X=!0,K(Y),Y(),St(),Rt(),z(),xt())}function Et(t){let e=window.__resuma;if(!t.length)return e.state;let r={};for(let n of t){let[o,s]=n.split(":"),a=s??o,i=e.signals.get(a);i&&(r[o]=i)}return Object.assign(Object.create(e.state),r)}async function Kt(t,e,r,n){let o=await U(t,e),s=Et(n);await o(r,s,window.__resuma)}function St(){document.addEventListener("submit",async t=>{if(!(t.target instanceof HTMLFormElement))return;let e=t.target;if(!e.getAttribute("data-r-submit"))return;t.preventDefault();let r=e.getAttribute("data-r-submit"),n=new FormData(e),o={};n.forEach((a,i)=>{o[i]=String(a)});let s=new URLSearchParams(o);try{let a=await fetch(e.action||`/_resuma/submit/${encodeURIComponent(r)}`,{method:"POST",credentials:"same-origin",headers:Z({"content-type":"application/x-www-form-urlencoded",accept:"application/json"}),body:s.toString()}),i=await a.json();if(!a.ok||i.ok===!1){Tt(e,i.field_errors??{}),(a.status>=500||!i.field_errors)&&console.error("[resuma] submit error",i.error??`submit ${r} failed`);return}et(e),i.redirect&&q(i.redirect)}catch(a){console.error("[resuma] submit error",a)}},!0)}function Tt(t,e){et(t);for(let[r,n]of Object.entries(e)){let o=t.querySelector(`[name="${r}"]`);if(!o)continue;let s=document.createElement("span");s.className="resuma-field-error",s.setAttribute("data-r-field-error",r),s.textContent=n,o.insertAdjacentElement("afterend",s)}}function et(t){t.querySelectorAll("[data-r-field-error]").forEach(e=>e.remove())}function Rt(){document.addEventListener("submit",t=>{if(!(t.target instanceof HTMLFormElement))return;let e=t.target;if(!e.hasAttribute("data-r-loader-refresh")||e.getAttribute("data-r-on:submit")||e.querySelector("[data-r-on\\:submit]"))return;t.preventDefault();let r=new FormData(e),n={};r.forEach((s,a)=>{let i=String(s);i&&(n[a]=i)});let o=e.getAttribute("action")||location.pathname;window.__resuma?.navigate(y(o,n))},!0)}function Mt(t){t.querySelectorAll("template[data-r-stream-chunk]").forEach(e=>{let r=e.getAttribute("data-r-stream-chunk");if(!r)return;let n=t.querySelector(`template[data-r-stream="${r}"]`);if(!n||!n.parentElement)return;let o=e.innerHTML,s=document.createRange().createContextualFragment(o);n.replaceWith(s),e.remove()})}function Lt(t){t.querySelectorAll("template[data-r-portal]").forEach(e=>{if(e.closest("[data-r-show-if]")?.hidden)return;let n=e.getAttribute("data-r-portal");if(!n)return;let o=document.getElementById(n)??document.querySelector(`[data-r-portal-target="${n}"]`);o&&o.appendChild(e.content.cloneNode(!0))})}function At(t){"startViewTransition"in document&&t.querySelectorAll("[data-r-vt]").forEach(e=>{e.addEventListener("click",r=>{let n=r.target?.closest("a[href]");if(!n||n.getAttribute("target")==="_blank")return;let o=n.getAttribute("href");if(!o||o.startsWith("#")||o.startsWith("javascript:"))return;r.preventDefault();let s=()=>{window.location.href=o};document.startViewTransition?.(s)})})}function _t(t,e){let r=Object.entries(t);if(!r.length)return;let n=(a,i)=>{try{let c=i.trim();c.endsWith(")()")&&(c=c.slice(0,-2));let u=new Function("state","__resuma",`return (${c})(state, __resuma);`);Promise.resolve(u(e,window.__resuma))}catch(c){console.error("[resuma] visible task",a,c)}},o=new Set(r.map(([a])=>a)),s=(a,i)=>{o.has(a)&&(o.delete(a),n(a,i))};for(let[a,i]of r)s(a,i);if("IntersectionObserver"in window){let a=new IntersectionObserver((i,c)=>{for(let u of i){if(!u.isIntersecting)continue;let l=u.target.dataset.rVisibleTask,d=l?t[l]:void 0;l&&d&&s(l,d),c.unobserve(u.target)}},{rootMargin:"50px"});for(let[i,c]of r){let u=document.createElement("span");u.dataset.rVisibleTask=i,u.style.cssText="position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden",tt().appendChild(u),a.observe(u)}}else for(let[a,i]of r)n(a,i)}async function nt(t,e){let r=await fetch(`/_resuma/action/${encodeURIComponent(t)}`,{method:"POST",credentials:"same-origin",headers:Z({"content-type":"application/json"}),body:JSON.stringify({args:e})});if(!r.ok)throw new Error(`[resuma] action ${t} failed: ${r.status}`);let n=await r.json();if(n.ok===!1)throw new Error(n.error??"action failed");return n.redirect&&q(n.redirect),n.value}async function Ct(t,e){try{return{ok:!0,value:await nt(t,e)}}catch(r){return{ok:!1,error:r instanceof Error?r.message:String(r)}}}async function rt(t){let e=await fetch(`/_resuma/island/${encodeURIComponent(t)}`);if(!e.ok)return;let r=await e.text(),n=document.querySelector(`resuma-island[data-r-instance="${t}"]`);n&&(n.outerHTML=r),$()}function xt(){if(!window.__resumaDev||typeof WebSocket>"u")return;let t=location.protocol==="https:"?"wss":"ws",e=!1,r=()=>{let n=new WebSocket(`${t}://${location.host}/_resuma/dev/ws`);n.addEventListener("open",()=>{if(e){location.reload();return}e=!0}),n.addEventListener("message",o=>{let s=String(o.data);if(s==="reload"){location.reload();return}s.startsWith("island:")&&rt(s.slice(7))}),n.addEventListener("close",()=>{setTimeout(r,500)}),n.addEventListener("error",()=>{n.close()})};r()}export{Jt as bootstrap,Et as buildLocalState,Y as mountPage,Kt as runHandler};