function f(n){let t=new Map;for(let e of n)t.set(e.id,C(e.id,e.value));return t}function C(n,t){let e=t,r=new Set,o={id:n,get value(){return e},set value(s){o.set(s)},set(s){Object.is(s,e)||(e=s,r.forEach(a=>a(e)))},update(s){let a=s(e);a!==void 0?o.set(a):r.forEach(i=>i(e))},subscribe(s){return r.add(s),()=>r.delete(s)}};return o}var M="RESUMA-DYN";function m(n,t){n.querySelectorAll(M.toLowerCase()).forEach(r=>{let o=r.getAttribute("data-r-signal");if(!o)return;let s=t.get(o);s&&s.subscribe(a=>{r.textContent=w(a)})})}function g(n,t){n.querySelectorAll("[data-r-bind]").forEach(r=>p(r,t)),H(n,t)}function H(n,t){let e=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT),r=e.currentNode;for(;r;)r instanceof HTMLElement&&p(r,t),r=e.nextNode()}function p(n,t){for(let e of Array.from(n.attributes)){let r=e.name;if(!r.startsWith("data-r-bind:"))continue;let o=r.slice(12),[s,a="{}"]=e.value.split("|"),i=t.get(s);if(!i)continue;let c=d=>{let _=a.replace("{}",w(d));n.setAttribute(o,_)};c(i.value),i.subscribe(c)}}function w(n){if(n==null)return"";if(typeof n=="string")return n;if(typeof n=="number"||typeof n=="boolean")return String(n);try{return JSON.stringify(n)}catch{return String(n)}}function h(){let n=window.__resuma;if(!n)return;let t=document.getElementById("resuma-root")??document.body;m(t,n.signals),g(t,n.signals)}var x="resuma-island";function y(n,t){n.querySelectorAll(x).forEach(r=>{let o=r.getAttribute("data-r-chunk");if(!o)return;let s=r.getAttribute("data-r-props")??"{}",a={};try{a=JSON.parse(s)}catch{}A(o,a,r,t)})}async function A(n,t,e,r){try{let o=await import(`/_resuma/island/${n}.js`);typeof o.resume=="function"&&o.resume(t,r,e)}catch(o){console.debug("[resuma] island chunk unavailable, staying static",n,o)}}var b=new Map;async function v(n,t){if(t){let i=b.get(t);return i||(i=k(t),b.set(t,i)),i}let[e,r]=n.split("#"),o=window.__resuma;if(e==="__page__"){let i=o.handlers[e]?.[r];if(!i)throw new Error(`[resuma] missing inline handler ${n}`);return k(i)}let s=o.loaded.get(e);s||(s=await import(`/_resuma/handler/${e}.js`),o.loaded.set(e,s));let a=s[r];if(!a)throw new Error(`[resuma] handler ${r} not found in chunk ${e}`);return a}function k(n){let t=n.trim(),r=t.startsWith("(")||t.startsWith("function")||t.startsWith("async")?`return (${n});`:`return (async (event, state, __resuma) => { ${n} });`;return new Function(r)()}var S="resuma-state",L="resuma-root",u=null;function I(){if(u)return u;let n=document.getElementById(S);if(!n?.textContent)return"";try{u=JSON.parse(n.textContent).csrf_token??""}catch{u=""}return u}function T(n={}){let t={...n},e=I();return e&&(t["x-resuma-csrf"]=e),t}var l=()=>document.getElementById(L)??document.body;function P(){let n=document.getElementById(S);if(!n||!n.textContent)return{signals:[],handlers:{},islands:[],actions:[]};try{return JSON.parse(n.textContent)}catch(t){return console.error("[resuma] failed to parse state payload",t),{signals:[],handlers:{},islands:[],actions:[]}}}var E=!1;async function z(){if(E)return;E=!0;let n=P(),t=f(n.signals.map(o=>({id:typeof o.id=="string"?o.id:`s${o.id[0]}`,value:o.value}))),e={};for(let[o,s]of t)e[o]=s;let r={state:e,signals:t,handlers:n.handlers,contexts:n.contexts??{},loaded:new Map,action:W,refreshIsland:V,context:o=>r.contexts[o]};window.__resuma=r,m(l(),t),g(l(),t),y(l(),t),F(),j(l()),N(l()),q(l()),D(n.visible_tasks??{},e)}function $(n){let t=window.__resuma;if(!n.length)return t.state;let e={};for(let r of n){let[o,s]=r.split(":"),a=s??o,i=t.signals.get(a);i&&(e[o]=i)}return Object.assign(Object.create(t.state),e)}async function K(n,t,e,r){let o=await v(n,t),s=$(r);await o(e,s,window.__resuma)}function F(){document.addEventListener("submit",async n=>{if(!(n.target instanceof HTMLFormElement))return;let t=n.target;if(!t.getAttribute("data-r-submit"))return;n.preventDefault();let e=t.getAttribute("data-r-submit"),r=new FormData(t),o={};r.forEach((a,i)=>{o[i]=String(a)});let s=new URLSearchParams(o);try{let a=await fetch(t.action||`/_resuma/submit/${encodeURIComponent(e)}`,{method:"POST",credentials:"same-origin",headers:T({"content-type":"application/x-www-form-urlencoded",accept:"application/json"}),body:s.toString()}),i=await a.json();if(!a.ok||i.ok===!1)throw O(t,i.field_errors??{}),new Error(i.error??`submit ${e} failed`);R(t)}catch(a){console.error("[resuma] submit error",a)}},!0)}function O(n,t){R(n);for(let[e,r]of Object.entries(t)){let o=n.querySelector(`[name="${e}"]`);if(!o)continue;let s=document.createElement("span");s.className="resuma-field-error",s.setAttribute("data-r-field-error",e),s.textContent=r,o.insertAdjacentElement("afterend",s)}}function R(n){n.querySelectorAll("[data-r-field-error]").forEach(t=>t.remove())}function j(n){n.querySelectorAll("template[data-r-stream-chunk]").forEach(t=>{let e=t.getAttribute("data-r-stream-chunk");if(!e)return;let r=n.querySelector(`template[data-r-stream="${e}"]`);if(!r||!r.parentElement)return;let o=t.innerHTML,s=document.createRange().createContextualFragment(o);r.replaceWith(s),t.remove()})}function N(n){n.querySelectorAll("template[data-r-portal]").forEach(t=>{let e=t.getAttribute("data-r-portal");if(!e)return;let r=document.getElementById(e)??document.querySelector(`[data-r-portal-target="${e}"]`);if(!r)return;let o=document.createDocumentFragment();for(;t.content.firstChild;)o.appendChild(t.content.firstChild);r.appendChild(o),t.remove()})}function q(n){"startViewTransition"in document&&n.querySelectorAll("[data-r-vt]").forEach(t=>{t.addEventListener("click",e=>{let r=e.target?.closest("a[href]");if(!r||r.getAttribute("target")==="_blank")return;let o=r.getAttribute("href");if(!o||o.startsWith("#")||o.startsWith("javascript:"))return;e.preventDefault();let s=()=>{window.location.href=o};document.startViewTransition?.(s)})})}function D(n,t){let e=Object.entries(n);if(!e.length)return;let r=(o,s)=>{try{let a=new Function("state","__resuma",`return ${s}`);Promise.resolve(a(t,window.__resuma))}catch(a){console.error("[resuma] visible task",o,a)}};if("IntersectionObserver"in window){let o=new IntersectionObserver((s,a)=>{for(let i of s){if(!i.isIntersecting)continue;let c=i.target.dataset.rVisibleTask,d=c?n[c]:void 0;d&&r(c,d),a.unobserve(i.target)}},{rootMargin:"50px"});for(let[s]of e){let a=document.createElement("span");a.hidden=!0,a.dataset.rVisibleTask=s,l().appendChild(a),o.observe(a)}}else for(let[o,s]of e)r(o,s)}async function W(n,t){let e=await fetch(`/_resuma/action/${encodeURIComponent(n)}`,{method:"POST",credentials:"same-origin",headers:T({"content-type":"application/json"}),body:JSON.stringify({args:t})});if(!e.ok)throw new Error(`[resuma] action ${n} failed: ${e.status}`);let r=await e.json();if(r.ok===!1)throw new Error(r.error??"action failed");return r.value}async function V(n){let t=await fetch(`/_resuma/island/${encodeURIComponent(n)}`);if(!t.ok)return;let e=await t.text(),r=document.querySelector(`resuma-island[data-r-instance="${n}"]`);r&&(r.outerHTML=e),h()}export{z as bootstrap,$ as buildLocalState,K as runHandler};