function p(t){let e=new Map;for(let r of t){let n=J(r.id);e.set(n,X(n,r.value))}return e}function J(t){return typeof t=="string"?t:typeof t=="number"?`s${t}`:`s${t[0]}`}function X(t,e){let r=e,n=new Set,o={id:t,get value(){return r},set value(a){o.set(a)},set(a){Object.is(a,r)||(r=a,n.forEach(i=>i(r)))},update(a){let i=a(r);i!==void 0&&o.set(i)},subscribe(a){return n.add(a),()=>n.delete(a)}};return o}var z="RESUMA-DYN",x=new WeakSet,C=new WeakSet;function h(t,e){t.querySelectorAll(z.toLowerCase()).forEach(n=>{if(x.has(n))return;let o=n.getAttribute("data-r-signal");if(!o)return;let a=e.get(o);a&&(n.textContent=E(a.value),a.subscribe(i=>{n.textContent=E(i)}),x.add(n))})}function w(t,e){t.querySelectorAll("[data-r-bind]").forEach(n=>H(n,e)),Y(t,e)}function Y(t,e){let r=document.createTreeWalker(t,NodeFilter.SHOW_ELEMENT),n=r.currentNode;for(;n;)n instanceof HTMLElement&&H(n,e),n=r.nextNode()}function Q(t){let e=t.toLowerCase();return e.startsWith("on")||e==="style"}var Z=new Set(["href","src","action","formaction","xlink:href","poster","background","ping","data"]);function tt(t){let e=t.replace(/[\u0000-\u0020]+/g,"");return/^(?:javascript|vbscript|data):/i.test(e)?"":t}function H(t,e){if(C.has(t))return;let r=!1;for(let n of Array.from(t.attributes)){let o=n.name;if(!o.startsWith("data-r-bind:"))continue;let a=o.slice(12);if(Q(a))continue;let[i,s="{}"]=n.value.split("|"),l=e.get(i);if(!l)continue;let c=Z.has(a.toLowerCase()),u=f=>{let m=s.replace("{}",E(f));c&&(m=tt(m)),t.setAttribute(a,m)};u(l.value),l.subscribe(u),r=!0}r&&C.add(t)}function E(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)}}var et="resuma-island";function y(t,e){t.querySelectorAll(et).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((s,l)=>{for(let c of s)c.isIntersecting&&(l.unobserve(c.target),_(n,o,e))},{rootMargin:"100px"}).observe(n);return}_(n,o,e)})}async function _(t,e,r){let n=t.getAttribute("data-r-props")??"{}",o={};try{o=JSON.parse(n)}catch{}await nt(e,o,t,r)}async function nt(t,e,r,n){if(r.dataset.rHydrated!=="true")try{let o=await import(`/_resuma/island-chunk/${t}.js`);typeof o.resume=="function"&&(o.resume(e,n,r),r.dataset.rHydrated="true")}catch(o){console.debug("[resuma] island chunk unavailable, staying static",t,o)}}var I=new Map,v=new Map;async function q(t,e){if(e){let s=I.get(e);return s||(s=P(e),I.set(e,s)),s}let[r,n]=t.split("#"),o=window.__resuma;if(r==="__page__"){let s=o.handlers[r]?.[n];if(s)return P(s);throw new Error(`[resuma] inline handler ${n} not found in __page__ payload`)}let a=o.loaded.get(r);if(!a){let s=v.get(r);s||(s=import(`/_resuma/handler/${r}.js`),v.set(r,s),s.finally(()=>v.delete(r))),a=await s,o.loaded.set(r,a)}let i=a[n];if(!i)throw new Error(`[resuma] handler ${n} not found in chunk ${r}`);return i}function P(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 O="resuma-root",T="resuma-state",b=new Map,k=new Set;async function rt(t){if(!(!t||b.has(t)||k.has(t))&&!(t.startsWith("http")&&!t.startsWith(location.origin))){k.add(t);try{let e=await fetch(t,{headers:{Accept:"text/html"},credentials:"same-origin"});e.ok&&b.set(t,await e.text())}catch{}finally{k.delete(t)}}}var M=null;function W(t){M=t}function A(){return document.getElementById(O)??document.body}function ot(t){try{return new URL(t,location.origin).origin===location.origin}catch{return!1}}function at(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 st(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 a=o.pathname.charCodeAt(n.pathname.length);return a===void 0||a===47}return!1}function N(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(a=>a&&a!==n).join(" ");e.setAttribute("data-r-base-class",o),e.className=st(r,t)?`${o} ${n}`.trim():o})}function R(){if(!window.__resuma){window.location.reload();return}if(M){M(),N(location.pathname+location.search);return}let t=at(document.getElementById(T)),e=p(t.signals),r={};for(let[i,s]of e)r[i]=s;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:i=>o.contexts[i],navigate:g,buildUrl:$,invalidate:lt};window.__resuma=o;let a=A();h(a,e),w(a,e),y(a,e),N(location.pathname+location.search)}function it(){let t=A(),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 $(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 lt(t,e){let r=t?.split("?")[0]??location.pathname,n=String(Date.now());await g($(r,{...e,_r:n}))}var S=0,F=null;async function g(t,e=!0){if(!ot(t)){window.location.assign(t);return}let r=++S;F?.abort();let n=new AbortController;F=n;try{let o=b.get(t);if(o)b.delete(t);else{let c=await fetch(t,{headers:{Accept:"text/html"},credentials:"same-origin",signal:n.signal});if(r!==S)return;if(!c.ok){window.location.href=t;return}o=await c.text()}if(r!==S)return;let a=new DOMParser().parseFromString(o,"text/html"),i=a.getElementById(O),s=a.getElementById(T);if(!i||!s?.textContent){window.location.href=t;return}A().innerHTML=i.innerHTML;let l=document.getElementById(T);l&&(l.textContent=s.textContent),a.title&&(document.title=a.title),e&&history.pushState({resumaNav:!0},"",t),R(),e&&window.scrollTo(0,0),it(),document.dispatchEvent(new CustomEvent("resuma:navigate",{detail:{href:t}}))}catch(o){if(o instanceof DOMException&&o.name==="AbortError")return;console.error("[resuma] navigation failed",o),window.location.href=t}}function L(t){if(t.startsWith("/")&&!t.startsWith("//")){g(t);return}try{let e=new URL(t,location.origin);if(e.origin===location.origin&&(e.protocol==="http:"||e.protocol==="https:")){g(e.pathname+e.search+e.hash);return}}catch{}console.warn("[resuma] ignored unsafe redirect target",t)}function ct(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 B(){document.addEventListener("mouseenter",t=>{let e=t.target;if(!(e instanceof Element))return;let n=e.closest("a[data-r-nav]")?.getAttribute("href");n&&rt(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||!ct(r,t))return;let n=r.getAttribute("href");n&&(t.preventDefault(),g(n))}),window.addEventListener("popstate",()=>{g(location.pathname+location.search,!1)})}var ut="resuma-state",dt="resuma-root",ft="data-r-on:",gt="data-r-cap:",mt="data-r-inline:",d=()=>document.getElementById(dt)??document.body;function U(){let t=document.getElementById(ut);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:[]}}}function pt(){return U().csrf_token??""}function G(t={}){let e={...t},r=pt();return r&&(e["x-resuma-csrf"]=r),e}function D(){W(j),j(),wt(),vt(),B()}function j(){let t=U(),e=p(t.signals),r={};for(let[o,a]of e)r[o]=a;let n={state:r,signals:e,handlers:t.handlers,contexts:t.contexts??{},loaded:new Map,action:K,safeAction:Rt,refreshIsland:Lt,context:o=>n.contexts[o]};window.__resuma=n,h(d(),e),w(d(),e),y(d(),e),St(d()),Tt(d()),Mt(d()),At(t.visible_tasks??{},r)}var ht=["click","input","change","submit","focus","blur","keydown","keyup","keypress","mousedown","mouseup","mousemove","mouseenter","mouseleave","pointerdown","pointerup","pointermove","touchstart","touchend","scroll","wheel","dragstart","dragend","drop","load"];function wt(){for(let t of ht)document.addEventListener(t,bt,!0)}function yt(t){let e=t.target;return e instanceof Element?e:e instanceof Text?e.parentElement:null}async function bt(t){let e=yt(t);if(!e)return;let r=ft+t.type,n=gt+t.type,o=mt+t.type;for(;e&&e!==document.body;){e.getAttribute(`data-r-prevent:${t.type}`)!==null&&t.preventDefault(),e.getAttribute(`data-r-stop:${t.type}`)!==null&&t.stopPropagation();let s=e.getAttribute(r);if(s){let l=(e.getAttribute(n)??"").split(",").map(u=>u.trim()).filter(Boolean),c=e.getAttribute(o);try{let u=await q(s,c),f=Et(l),m=window.__resuma;await u(t,f,m)}catch(u){console.error("[resuma] handler error",u)}return}e=e.parentElement}}function Et(t){let e=window.__resuma;if(!t.length)return e.state;let r={};for(let n of t){let[o,a]=n.split(":"),i=a??o,s=e.signals.get(i);s&&(r[o]=s)}return Object.assign(Object.create(e.state),r)}function vt(){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((i,s)=>{o[s]=String(i)});let a=new URLSearchParams(o);try{let i=await fetch(e.action||`/_resuma/submit/${encodeURIComponent(r)}`,{method:"POST",credentials:"same-origin",headers:G({"content-type":"application/x-www-form-urlencoded",accept:"application/json"}),body:a.toString()}),s=await i.json();if(!i.ok||s.ok===!1){kt(e,s.field_errors??{}),(i.status>=500||!s.field_errors)&&console.error("[resuma] submit error",s.error??`submit ${r} failed`);return}if(V(e),s.redirect){L(s.redirect);return}console.info("[resuma] submit ok",s.value)}catch(i){console.error("[resuma] submit error",i)}},!0)}function kt(t,e){V(t);for(let[r,n]of Object.entries(e)){let o=t.querySelector(`[name="${r}"]`);if(!o)continue;let a=document.createElement("span");a.className="resuma-field-error",a.setAttribute("data-r-field-error",r),a.textContent=n,o.insertAdjacentElement("afterend",a)}}function V(t){t.querySelectorAll("[data-r-field-error]").forEach(e=>e.remove())}function St(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,a=document.createRange().createContextualFragment(o);n.replaceWith(a),e.remove()})}function Tt(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 Mt(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 a=()=>{window.location.href=o};document.startViewTransition?.(a)})})}function At(t,e){let r=Object.entries(t);if(!r.length)return;let n=(i,s)=>{try{let l=s.trim();l.endsWith(")()")&&(l=l.slice(0,-2));let c=new Function("state","__resuma",`return (${l})(state, __resuma);`);Promise.resolve(c(e,window.__resuma))}catch(l){console.error("[resuma] visible task",i,l)}},o=new Set(r.map(([i])=>i)),a=(i,s)=>{o.has(i)&&(o.delete(i),n(i,s))};for(let[i,s]of r)a(i,s);if("IntersectionObserver"in window){let i=new IntersectionObserver((s,l)=>{for(let c of s){if(!c.isIntersecting)continue;let u=c.target.dataset.rVisibleTask,f=u?t[u]:void 0;u&&f&&a(u,f),l.unobserve(c.target)}},{rootMargin:"50px"});for(let[s]of r){let l=document.createElement("span");l.dataset.rVisibleTask=s,l.style.cssText="position:absolute;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden",d().appendChild(l),i.observe(l)}}else for(let[i,s]of r)n(i,s)}async function Rt(t,e){try{return{ok:!0,value:await K(t,e)}}catch(r){return{ok:!1,error:r instanceof Error?r.message:String(r)}}}async function K(t,e){let r=await fetch(`/_resuma/action/${encodeURIComponent(t)}`,{method:"POST",credentials:"same-origin",headers:G({"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&&L(n.redirect),n.value}async function Lt(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),R()}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",D,{once:!0}):D();
//# sourceMappingURL=runtime.js.map