phlex-reactive 0.15.3 → 0.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +184 -0
  3. data/README.md +92 -12
  4. data/app/javascript/phlex/reactive/core.js +1 -0
  5. data/app/javascript/phlex/reactive/core.min.js +6 -6
  6. data/app/javascript/phlex/reactive/core.min.js.map +4 -4
  7. data/app/javascript/phlex/reactive/features/bindings.js +129 -16
  8. data/app/javascript/phlex/reactive/features/bindings.min.js +2 -2
  9. data/app/javascript/phlex/reactive/features/bindings.min.js.map +3 -3
  10. data/app/javascript/phlex/reactive/features/countdown.js +140 -0
  11. data/app/javascript/phlex/reactive/features/countdown.min.js +4 -0
  12. data/app/javascript/phlex/reactive/features/countdown.min.js.map +10 -0
  13. data/app/javascript/phlex/reactive/features/persist.js +10 -6
  14. data/app/javascript/phlex/reactive/features/persist.min.js +2 -2
  15. data/app/javascript/phlex/reactive/features/persist.min.js.map +3 -3
  16. data/app/javascript/phlex/reactive/reactive_controller.js +2 -0
  17. data/app/javascript/phlex/reactive/reactive_controller.min.js +4 -4
  18. data/app/javascript/phlex/reactive/reactive_controller.min.js.map +8 -7
  19. data/app/javascript/phlex/reactive/runtime.js +255 -31
  20. data/lib/phlex/reactive/component/countdown_binding.rb +80 -0
  21. data/lib/phlex/reactive/component/field_references.rb +130 -0
  22. data/lib/phlex/reactive/component/helpers.rb +72 -14
  23. data/lib/phlex/reactive/component/image_fallback_binding.rb +18 -5
  24. data/lib/phlex/reactive/component/media_binding.rb +9 -1
  25. data/lib/phlex/reactive/component/media_pattern.rb +17 -17
  26. data/lib/phlex/reactive/component/selection.rb +24 -2
  27. data/lib/phlex/reactive/component/show_options.rb +91 -0
  28. data/lib/phlex/reactive/engine.rb +2 -2
  29. data/lib/phlex/reactive/js.rb +44 -2
  30. data/lib/phlex/reactive/response.rb +3 -4
  31. data/lib/phlex/reactive/show_conditions/compare_terms.rb +142 -0
  32. data/lib/phlex/reactive/show_conditions.rb +39 -6
  33. data/lib/phlex/reactive/streamable.rb +6 -4
  34. data/lib/phlex/reactive/version.rb +1 -1
  35. metadata +8 -1
@@ -1,9 +1,9 @@
1
- import{Controller as bt}from"@hotwired/stimulus";import{confirmResolver as ye}from"phlex/reactive/confirm";function yt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:visit"])return;e["reactive:visit"]=function(){let t=this.getAttribute("data-url");if(t)window.Turbo.visit(t,{action:"advance"})}}function vt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:token"])return;e["reactive:token"]=function(){let t=this.getAttribute("data-reactive-token-value"),r=this.getAttribute("target");if(!t||!r)return;let n=document.getElementById(r);if(n)n.setAttribute("data-reactive-token-value",t)}}function _t(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:js"])return;e["reactive:js"]=function(){let t=ge(this.getAttribute("data-reactive-ops"));if(!t.length)return;let r=this.getAttribute("target"),n=this.getAttribute("data-reactive-verbose")==="true",i=r?document.getElementById(r):null;if(r&&!i){if(n)b("devtools",(o)=>o.missingRoot(r));return}ae(t,(o)=>ar(o,i),n?(o,a)=>b("devtools",(s)=>s.diagnoseStream(o,a,i)):void 0)}}function At(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:defer"])return;e["reactive:defer"]=function(){b("defer",(t)=>t.streamAction(this))}}var ve=!1,ie=null;function wt(){if(ve)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;ve=!0,document.addEventListener("turbo:before-stream-render",(e)=>{if(Ot(e),St(e),Tt(e),ie)ie(e,p.get("effects"));else p.get("effects")?.wrap(e)})}var D="reactive:streamed";function St(e){let t=e.detail,r=t?.render,n=t?.newStream??e.target,i=n?.getAttribute?.("action"),o=/^(append|prepend|update)$/.test(i);if(typeof r!=="function"||!(o||/^(before|after|replace)$/.test(i)))return;let a=n.getAttribute("target"),s=n.getAttribute("targets"),c=new Set;for(let l of a?[document.getElementById(a)]:s?document.querySelectorAll(s):[]){let d=(o?l:l?.parentElement)?.closest?.('[data-controller~="reactive"]');if(d)c.add(d)}if(c.size===0)return;t.render=async(l)=>{await r(l);for(let d of c)if(d.isConnected)d.dispatchEvent(new Event(D))}}function ce(e){return e?.tagName==="DIALOG"&&typeof e.showModal==="function"}function ue(e){try{return e.matches(":modal")}catch{return!1}}function je(e){if(!ce(e)){if(e?.closest?.('[data-reactive-verbose="true"], [data-reactive-debug="true"]'))console.warn(`[phlex-reactive] show_modal targets a <dialog>, not <${e.localName}> — skipped`);return}if(!e.isConnected||ue(e))return;if(e.open)e.close();e.showModal()}function Et(e){if(ce(e)&&e.open)e.close()}function j(e){let r=[...e?.querySelectorAll?.("dialog[data-reactive-modal]")??[]];if(e?.matches?.("dialog[data-reactive-modal]"))r.push(e);for(let n of r)if(n.open&&!ue(n))je(n)}function Tt(e){let t=e.detail,r=t?.render,n=t?.newStream??e.target;if(typeof r!=="function"||!n?.querySelector?.("template")?.content?.querySelector?.("dialog"))return;t.render=async(i)=>{await r(i),j(document)}}var _e=!1;function Ft(){if(_e)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;_e=!0,document.addEventListener("turbo:morph-element",(t)=>{if(t.target?.matches?.('[data-controller~="reactive"]'))j(t.target)}),document.addEventListener("turbo:morph",()=>j(document));let e=new WeakSet;document.addEventListener("turbo:before-morph-element",(t)=>{let r=t.target,n=t.detail?.newElement;if(!ce(r)||!n)return;if(n.hasAttribute?.("open"))e.delete(r);else e.add(r)}),document.addEventListener("turbo:before-morph-attribute",(t)=>{let{target:r,detail:n}=t;if(n?.attributeName!=="open"||n.mutationType!=="remove")return;if(!e.has(r)||!r.open||!ue(r))return;e.delete(r),t.preventDefault(),r.close()})}var se=new WeakMap;function Ue(e,t,r,n){let i=se.get(e)??new Map;se.set(e,i);let o=(a,s)=>{i.delete(a),i.set(a,s)};if(t.endsWith("_class"))for(let a of r.classes??[])o(`.${a}`,e.classList.contains(a));else if(t.endsWith("_attr"))st(r.name)||o(r.name,e.getAttribute(r.name));else if(t==="show"||t==="hide"||t==="toggle"){if(o("hidden",e.getAttribute("hidden")),r.expanded!=null)for(let a of n({...r,to:r.expanded}))Ue(a,"set_attr",{name:"aria-expanded"})}}var Ae=!1;function kt(){if(Ae)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Ae=!0,document.addEventListener("turbo:morph-element",(e)=>{let t=e.target;for(let[r,n]of se.get(t)??[])if(r[0]===".")t.classList.toggle(r.slice(1),n);else if(n==null)t.removeAttribute(r);else if(t.getAttribute(r)!==n)t.setAttribute(r,n)})}var Je="data-reactive-image-fallback",L="data-reactive-image-state",oe="data-reactive-image-hidden",Y=null;function x(e){if(e?.localName!=="img")return null;let t=e.getAttribute(Je);if(t==null)return null;try{return JSON.parse(t)||{}}catch{return{}}}var He=(e)=>e.getAttribute("src")||e.getAttribute("srcset");function Ke(e,t){if(typeof t.alt!=="string"||!t.alt)return null;try{let r=e.closest('[data-controller~="reactive"]')?.querySelector(t.alt);return r&&!r.contains(e)?r:null}catch{return null}}function U(e,t,r){if(r==="error"){if(t.hide&&!e.hasAttribute("hidden"))e.setAttribute("hidden",""),e.setAttribute(oe,"");let n=Ke(e,t);if(n)n.textContent=e.getAttribute("alt")??"",n.hidden=!1}else z(e,t);e.setAttribute(L,r)}function z(e,t=x(e)){if(!t||e.getAttribute(L)==null)return;if(e.getAttribute(L)==="error"){if(e.hasAttribute(oe))e.removeAttribute("hidden");let r=Ke(e,t);if(r)r.hidden=!0}e.removeAttribute(L),e.removeAttribute(oe)}function we(e){let t=e.target,r=x(t);if(!r)return;if(e.type==="load")U(t,r,"loaded");else if(He(t))U(t,r,"error");else z(t,r)}function Lt(){if(Y)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;let e=new WeakMap;Y={error:we,load:we,"turbo:before-morph-element":(t)=>{let r=t.target,n=t.detail?.newElement,i=r?.getAttribute?.(L);if(i==null||!n||!x(r))return;let o=(a)=>r.getAttribute(a)===n.getAttribute?.(a);if(o("src")&&o("srcset"))e.set(r,i)},"turbo:morph-element":(t)=>{let r=t.target,n=e.get(r);if(n===void 0)return;e.delete(r),queueMicrotask(()=>{let i=x(r);if(i)U(r,i,n)})}};for(let[t,r]of Object.entries(Y))document.addEventListener(t,r,!0);for(let t of document.querySelectorAll?.(`img[${Je}]`)??[]){if(!t.complete||!He(t))continue;let r=`${t.getAttribute("src")} ${t.getAttribute("srcset")}`,n=(i)=>`${t.getAttribute("src")} ${t.getAttribute("srcset")}`===r&&U(t,x(t)??{},i);if(t.naturalWidth>0)n("loaded");else if(typeof t.decode==="function")t.decode().then(()=>n("loaded"),()=>n("error"));else n("error")}}function ze(e){ie=e}var C,X=null,Se="[data-reactive-editable][contenteditable=plaintext-only]";function Ve(){if(C===void 0)try{let e=document.createElement("div");e.contentEditable="plaintext-only",C=e.contentEditable==="plaintext-only"}catch{C=!1}return C}function q(e){if(e.matches?.(Se))e.setAttribute("contenteditable","true");e.querySelectorAll?.(Se).forEach(q)}function xt(){if(X||typeof document>"u"||typeof document.createElement!=="function")return;if(Ve())return;q(document),X=new MutationObserver((e)=>{for(let t of e)if(t.type==="attributes")q(t.target);else t.addedNodes.forEach(q)}),X.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["contenteditable","data-reactive-editable"]})}var Ee=!1;function Te(e){return e===document.activeElement&&(e.localName==="input"||e.localName==="textarea"||e.hasAttribute("data-reactive-editable"))&&!e.hasAttribute("data-reactive-morph-value")&&!!e.closest('[data-controller~="reactive"]')}function Rt(){if(Ee)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Ee=!0,document.addEventListener("turbo:before-morph-element",(e)=>{let t=e.target,r=e.detail?.newElement;if(!r||e.defaultPrevented)return;let n=Te(t);if(n)It(t,r);if(t.hasAttribute?.("data-reactive-editable")){if(J.set(t,E(r)),!n)return;for(let{name:o}of[...t.attributes])if(!r.hasAttribute(o)&&o!=="contenteditable"&&o!==_)t.removeAttribute(o);for(let{name:o,value:a}of r.attributes)if(o!=="contenteditable"&&t.getAttribute(o)!==a)t.setAttribute(o,a);return e.preventDefault()}if(t.localName!=="input"||!n)return;let i=r.getAttribute("value");if(i==null)t.removeAttribute("value");else if(t.getAttribute("value")!==i)t.setAttribute("value",i)}),document.addEventListener("focusin",(e)=>me(e.target)),document.addEventListener("turbo:before-morph-attribute",(e)=>{let t=e.detail?.attributeName;if((t==="value"||t===_)&&Te(e.target))e.preventDefault()}),document.addEventListener("input",(e)=>{let t=e.target;if(t?.hasAttribute?.(_)&&de(t)===fe(t))t.removeAttribute(_)})}var _="data-reactive-held",le='[data-controller~="reactive"]',B=null,T=new Map;function de(e){return e.hasAttribute("data-reactive-editable")?E(e):e.value}function fe(e){return e.hasAttribute("data-reactive-editable")?pe(e):e.defaultValue}function Nt(e){if(e.hasAttribute("data-reactive-editable"))return E(e);return e.localName==="textarea"?e.textContent:e.getAttribute("value")??""}function It(e,t){let r=e.getAttribute("name");if(!r||/^(checkbox|radio)$/.test(e.type)||T.has(e.closest(le)))return;let n=Nt(t);if(n===de(e))return e.removeAttribute(_);if(n===fe(e))return;e.setAttribute(_,""),e.dispatchEvent(new CustomEvent("reactive:held",{bubbles:!0,detail:{name:r,theirs:n}}))}function Pt(e){let t=[];for(let r of e.querySelectorAll(`[${_}]`)){if(r.closest(le)!==e)continue;let n=r.getAttribute("name");if(de(r)===fe(r))r.removeAttribute(_);else if(n&&!t.includes(n))t.push(n)}if(t.length===0)return null;return JSON.stringify(t).replace(/[\u007f-￿]/g,(r)=>`\\u${r.charCodeAt(0).toString(16).padStart(4,"0")}`)}function Ge(e){for(let t of e.querySelectorAll(`[${_}]`))if(t.closest(le)===e)t.removeAttribute(_)}function Fe(e,t,r=!0){let n={root:e,streams:0,release:r},i=B;B=n;try{window.Turbo.renderStreamMessage(t)}finally{B=i}if(r&&n.streams===0)Ge(e)}function Ot(e){let t=B,r=e.detail,n=r?.render;if(!t||typeof n!=="function")return;t.streams++,r.render=async(i)=>{T.set(t.root,(T.get(t.root)||0)+1);try{return await n(i)}finally{let o=T.get(t.root)-1;if(o)T.set(t.root,o);else T.delete(t.root);if(t.release)Ge(t.root)}}}var Mt="__materialize",ke=!1;function Ct(){if(ke)return;if(typeof window>"u"||typeof document>"u")return;if(typeof window.addEventListener!=="function")return;ke=!0;let e=()=>{let t=document.documentElement;if(typeof t?.toggleAttribute!=="function")return;t.toggleAttribute("data-reactive-offline",globalThis.navigator?.onLine===!1)};e(),window.addEventListener("online",e),window.addEventListener("offline",e)}var $t="phlex-reactive:latency";function Ye(){return typeof sessionStorage<"u"&&Boolean(sessionStorage.getItem($t))}function he(){if(typeof document>"u")return;if(!p.has("devtools")&&!A.get("devtools")[1])return;let e=document.querySelector?.('meta[name="phlex-reactive-env"]')?.content==="development";if(e||Ye())b("devtools",(t)=>e&&t.attach())}var Xe="data-reactive-active",w=0;function Ze(){if(w++,w===1)et("reactive:busy")}function Qe(){if(w===0)return;if(w--,w===0)et("reactive:idle")}function Or(){return w}function Mr(){w=0,(typeof document<"u"?document.documentElement:null)?.removeAttribute?.(Xe)}function et(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.toggleAttribute==="function")t.toggleAttribute(Xe,w>0);if(typeof document.dispatchEvent==="function"&&typeof CustomEvent==="function")document.dispatchEvent(new CustomEvent(e,{detail:{count:w}}))}var tt="data-reactive-requests";function rt(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.setAttribute!=="function"||!Dt(t))return;let r=qt(t);r[e]=(Number(r[e])||0)+1,t.setAttribute(tt,JSON.stringify(r))}function Dt(e){return e.hasAttribute?.("data-reactive-verbose")||!!document.querySelector?.('[data-reactive-verbose="true"]')}function qt(e){try{let t=JSON.parse(e.getAttribute(tt));if(t&&typeof t==="object")return{action:0,defer:0,...t}}catch{}return{action:0,defer:0}}function Le(){yt(),vt(),_t(),At(),wt(),Rt(),Ft(),kt(),Lt(),xt(),Ct(),he()}function Bt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var nt=Symbol.for("phlex-reactive.core");if(globalThis[nt])console.error("[phlex-reactive] the client was loaded twice. Import EITHER phlex/reactive/reactive_controller (the default, "+"everything in one file) OR phlex/reactive/core (features on demand), not both — each carries its own state.");globalThis[nt]=!0;var it=!1;function Wt(){if(it)return;if(typeof document>"u")return;let e=document.querySelectorAll('[data-controller~="reactive"]');if(!e||e.length===0)return;console.warn("[phlex-reactive] found "+e.length+' element(s) with data-controller="reactive" '+"but the reactive controller never connected. It is loaded but not registered — "+'add `application.register("reactive", ReactiveController)` (importmap) or import it into app/javascript/controllers/ for lazyLoadControllersFrom apps. See the README.')}if(typeof window<"u"&&typeof document<"u"){let e=()=>setTimeout(Wt,0);if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",e,{once:!0});else e()}var jt=new Set(["href","src","srcset","srcdoc","action","formaction","xlink:href","style"]);function st(e){let t=String(e).toLowerCase();return t.startsWith("on")||jt.has(t)}var Z=new WeakMap;function Ut(e,t,r){let[n,i,o]=t;Z.get(e)?.(),e.classList.add(n,i),r();let a=!1,s=requestAnimationFrame(()=>{if(a)return;e.classList.remove(i),e.classList.add(o)}),c=(d)=>{if(a||d&&d.target!==e)return;a=!0,Z.delete(e),clearTimeout(l),globalThis.cancelAnimationFrame?.(s),e.removeEventListener("animationend",c),e.removeEventListener("transitionend",c),e.classList.remove(n,i,o)};Z.set(e,c),e.addEventListener("animationend",c),e.addEventListener("transitionend",c);let l=setTimeout(c,Jt(e))}function Jt(e){let t=0;try{let r=getComputedStyle(e);for(let n of["transition","animation"]){let[i,o]=["Duration","Delay"].map((s)=>String(r[n+s]).split(",").map((c)=>parseFloat(c)*(/ms/.test(c)?1:1000)||0)),a=String(r[n+"IterationCount"]).split(",").map((s)=>/inf/.test(s)?1/0:parseFloat(s)>=0?parseFloat(s):1);for(let s=0;s<i.length||s<o.length||s<a.length;s++){let c=i[s%i.length]*a[s%a.length]||0;t=Math.max(t,c+o[s%o.length])}}}catch{}return Math.min(Math.max(t+50,350),5000)}var Ht=":is(lexxy-editor, trix-editor, [contenteditable=''], [contenteditable=true], [contenteditable=plaintext-only])",Kt=new Set(["lexxy-editor","trix-editor"]);function E(e){let t="",r=!1,n=(o)=>{if(r&&t&&!t.endsWith(`
1
+ import{Controller as kt}from"@hotwired/stimulus";import{confirmResolver as Fe}from"phlex/reactive/confirm";function xt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:visit"])return;e["reactive:visit"]=function(){let t=this.getAttribute("data-url");if(t)window.Turbo.visit(t,{action:"advance"})}}function Rt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:token"])return;e["reactive:token"]=function(){let t=this.getAttribute("data-reactive-token-value"),r=this.getAttribute("target");if(!t||!r)return;let n=document.getElementById(r);if(n)n.setAttribute("data-reactive-token-value",t)}}function Nt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:js"])return;e["reactive:js"]=function(){let t=Ae(this.getAttribute("data-reactive-ops"));if(!t.length)return;let r=this.getAttribute("target"),n=this.getAttribute("data-reactive-verbose")==="true",i=r?document.getElementById(r):null;if(r&&!i){if(n)y("devtools",(s)=>s.missingRoot(r));return}de(t,(s)=>br(s,i),n?(s,a)=>y("devtools",(o)=>o.diagnoseStream(s,a,i)):void 0)}}function Ot(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:defer"])return;e["reactive:defer"]=function(){y("defer",(t)=>t.streamAction(this))}}var Le=!1,ae=null;function It(){if(Le)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Le=!0,document.addEventListener("turbo:before-stream-render",(e)=>{if(Ht(e),Pt(e),Ct(e),ae)ae(e,p.get("effects"));else p.get("effects")?.wrap(e)})}var W="reactive:streamed";function Pt(e){let t=e.detail,r=t?.render,n=t?.newStream??e.target,i=n?.getAttribute?.("action"),s=/^(append|prepend|update)$/.test(i);if(typeof r!=="function"||!(s||/^(before|after|replace)$/.test(i)))return;let a=n.getAttribute("target"),o=n.getAttribute("targets"),c=new Set;for(let l of a?[document.getElementById(a)]:o?document.querySelectorAll(o):[]){let d=(s?l:l?.parentElement)?.closest?.('[data-controller~="reactive"]');if(d)c.add(d)}if(c.size===0)return;t.render=async(l)=>{await r(l);for(let d of c)if(d.isConnected)d.dispatchEvent(new Event(W))}}function he(e){return e?.tagName==="DIALOG"&&typeof e.showModal==="function"}function me(e){try{return e.matches(":modal")}catch{return!1}}function Ze(e){if(!he(e)){if(e?.closest?.('[data-reactive-verbose="true"], [data-reactive-debug="true"]'))console.warn(`[phlex-reactive] show_modal targets a <dialog>, not <${e.localName}> — skipped`);return}if(!e.isConnected||me(e))return;if(e.open)e.close();e.showModal()}function Mt(e){if(he(e)&&e.open)e.close()}function J(e){let r=[...e?.querySelectorAll?.("dialog[data-reactive-modal]")??[]];if(e?.matches?.("dialog[data-reactive-modal]"))r.push(e);for(let n of r)if(n.open&&!me(n))Ze(n)}function Ct(e){let t=e.detail,r=t?.render,n=t?.newStream??e.target;if(typeof r!=="function"||!n?.querySelector?.("template")?.content?.querySelector?.("dialog"))return;t.render=async(i)=>{await r(i),J(document)}}var ke=!1;function Dt(){if(ke)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;ke=!0,document.addEventListener("turbo:morph-element",(t)=>{if(t.target?.matches?.('[data-controller~="reactive"]'))J(t.target)}),document.addEventListener("turbo:morph",()=>J(document));let e=new WeakSet;document.addEventListener("turbo:before-morph-element",(t)=>{let r=t.target,n=t.detail?.newElement;if(!he(r)||!n)return;if(n.hasAttribute?.("open"))e.delete(r);else e.add(r)}),document.addEventListener("turbo:before-morph-attribute",(t)=>{let{target:r,detail:n}=t;if(n?.attributeName!=="open"||n.mutationType!=="remove")return;if(!e.has(r)||!r.open||!me(r))return;e.delete(r),t.preventDefault(),r.close()})}var ce=new WeakMap;function Qe(e,t,r,n){let i=ce.get(e)??new Map;ce.set(e,i);let s=(a,o)=>{i.delete(a),i.set(a,o)};if(t.endsWith("_class"))for(let a of r.classes??[])s(`.${a}`,e.classList.contains(a));else if(t.endsWith("_attr"))bt(r.name)||s(r.name,e.getAttribute(r.name));else if(t==="show"||t==="hide"||t==="toggle"){if(s("hidden",e.getAttribute("hidden")),r.expanded!=null)for(let a of n({...r,to:r.expanded}))Qe(a,"set_attr",{name:"aria-expanded"})}}var xe=!1;function $t(){if(xe)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;xe=!0,document.addEventListener("turbo:morph-element",(e)=>{let t=e.target;for(let[r,n]of ce.get(t)??[])if(r[0]===".")t.classList.toggle(r.slice(1),n);else if(n==null)t.removeAttribute(r);else if(t.getAttribute(r)!==n)t.setAttribute(r,n)})}var et="data-reactive-image-fallback",k="data-reactive-image-state",ue="data-reactive-image-hidden",Z=null,le="data-reactive-wrap-hidden";function tt(e){if(e.hasAttribute("hidden"))return;e.setAttribute("hidden",""),e.setAttribute(le,"")}function rt(e){if(!e.hasAttribute(le))return;e.removeAttribute("hidden"),e.removeAttribute(le)}function x(e){if(e?.localName!=="img")return null;let t=e.getAttribute(et);if(t==null)return null;try{return JSON.parse(t)||{}}catch{return{}}}var nt=(e)=>e.getAttribute("src")||e.getAttribute("srcset");function pe(e,t){if(typeof t!=="string"||!t)return null;try{return e.closest('[data-controller~="reactive"]')?.querySelector(t)??null}catch{return null}}function it(e,t){let r=pe(e,t.alt);return r&&!r.contains(e)?r:null}function H(e,t,r){if(r==="error"){if(t.hide&&!e.hasAttribute("hidden"))e.setAttribute("hidden",""),e.setAttribute(ue,"");if(t.wrap){let i=pe(e,t.wrap);if(i)tt(i);else console.warn(`[phlex-reactive] reactive_image_fallback wrap: ${JSON.stringify(t.wrap)} is not in the root — skipped`)}let n=it(e,t);if(n)n.textContent=e.getAttribute("alt")??"",n.hidden=!1}else G(e,t);e.setAttribute(k,r)}function G(e,t=x(e)){if(!t||e.getAttribute(k)==null)return;if(e.getAttribute(k)==="error"){if(e.hasAttribute(ue))e.removeAttribute("hidden");let r=pe(e,t.wrap);if(r)rt(r);let n=it(e,t);if(n)n.hidden=!0}e.removeAttribute(k),e.removeAttribute(ue)}function Re(e){let t=e.target,r=x(t);if(!r)return;if(e.type==="load")H(t,r,"loaded");else if(nt(t))H(t,r,"error");else G(t,r)}function qt(){if(Z)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;let e=new WeakMap;Z={error:Re,load:Re,"turbo:before-morph-element":(t)=>{let r=t.target,n=t.detail?.newElement,i=r?.getAttribute?.(k);if(i==null||!n||!x(r))return;let s=(a)=>r.getAttribute(a)===n.getAttribute?.(a);if(s("src")&&s("srcset"))e.set(r,i)},"turbo:morph-element":(t)=>{let r=t.target,n=e.get(r);if(n===void 0)return;e.delete(r),queueMicrotask(()=>{let i=x(r);if(i)H(r,i,n)})}};for(let[t,r]of Object.entries(Z))document.addEventListener(t,r,!0);for(let t of document.querySelectorAll?.(`img[${et}]`)??[]){if(!t.complete||!nt(t))continue;let r=`${t.getAttribute("src")} ${t.getAttribute("srcset")}`,n=(i)=>`${t.getAttribute("src")} ${t.getAttribute("srcset")}`===r&&H(t,x(t)??{},i);if(t.naturalWidth>0)n("loaded");else if(typeof t.decode==="function")t.decode().then(()=>n("loaded"),()=>n("error"));else n("error")}}function ot(e){ae=e}var C,Q=null,Ne="[data-reactive-editable][contenteditable=plaintext-only]";function st(){if(C===void 0)try{let e=document.createElement("div");e.contentEditable="plaintext-only",C=e.contentEditable==="plaintext-only"}catch{C=!1}return C}function B(e){if(e.matches?.(Ne))e.setAttribute("contenteditable","true");e.querySelectorAll?.(Ne).forEach(B)}function Wt(){if(Q||typeof document>"u"||typeof document.createElement!=="function")return;if(st())return;B(document),Q=new MutationObserver((e)=>{for(let t of e)if(t.type==="attributes")B(t.target);else t.addedNodes.forEach(B)}),Q.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["contenteditable","data-reactive-editable"]})}var Oe=!1;function Ie(e){return e===document.activeElement&&(e.localName==="input"||e.localName==="textarea"||e.hasAttribute("data-reactive-editable"))&&!e.hasAttribute("data-reactive-morph-value")&&!!e.closest('[data-controller~="reactive"]')}function Bt(){if(Oe)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Oe=!0,document.addEventListener("turbo:before-morph-element",(e)=>{let t=e.target,r=e.detail?.newElement;if(!r||e.defaultPrevented)return;let n=Ie(t);if(n)Ut(t,r);if(t.hasAttribute?.("data-reactive-editable")){if(K.set(t,E(r)),!n)return;for(let{name:s}of[...t.attributes])if(!r.hasAttribute(s)&&s!=="contenteditable"&&s!==_)t.removeAttribute(s);for(let{name:s,value:a}of r.attributes)if(s!=="contenteditable"&&t.getAttribute(s)!==a)t.setAttribute(s,a);return e.preventDefault()}if(t.localName!=="input"||!n)return;let i=r.getAttribute("value");if(i==null)t.removeAttribute("value");else if(t.getAttribute("value")!==i)t.setAttribute("value",i)}),document.addEventListener("focusin",(e)=>_e(e.target)),document.addEventListener("turbo:before-morph-attribute",(e)=>{let t=e.detail?.attributeName;if((t==="value"||t===_)&&Ie(e.target))e.preventDefault()}),document.addEventListener("input",(e)=>{let t=e.target;if(t?.hasAttribute?.(_)&&be(t)===ye(t))t.removeAttribute(_)})}var _="data-reactive-held",ge='[data-controller~="reactive"]',j=null,T=new Map;function be(e){return e.hasAttribute("data-reactive-editable")?E(e):e.value}function ye(e){return e.hasAttribute("data-reactive-editable")?we(e):e.defaultValue}function jt(e){if(e.hasAttribute("data-reactive-editable"))return E(e);return e.localName==="textarea"?e.textContent:e.getAttribute("value")??""}function Ut(e,t){let r=e.getAttribute("name");if(!r||/^(checkbox|radio)$/.test(e.type)||T.has(e.closest(ge)))return;let n=jt(t);if(n===be(e))return e.removeAttribute(_);if(n===ye(e))return;e.setAttribute(_,""),e.dispatchEvent(new CustomEvent("reactive:held",{bubbles:!0,detail:{name:r,theirs:n}}))}function Jt(e){let t=[];for(let r of e.querySelectorAll(`[${_}]`)){if(r.closest(ge)!==e)continue;let n=r.getAttribute("name");if(be(r)===ye(r))r.removeAttribute(_);else if(n&&!t.includes(n))t.push(n)}if(t.length===0)return null;return JSON.stringify(t).replace(/[\u007f-￿]/g,(r)=>`\\u${r.charCodeAt(0).toString(16).padStart(4,"0")}`)}function at(e){for(let t of e.querySelectorAll(`[${_}]`))if(t.closest(ge)===e)t.removeAttribute(_)}function Pe(e,t,r=!0){let n={root:e,streams:0,release:r},i=j;j=n;try{window.Turbo.renderStreamMessage(t)}finally{j=i}if(r&&n.streams===0)at(e)}function Ht(e){let t=j,r=e.detail,n=r?.render;if(!t||typeof n!=="function")return;t.streams++,r.render=async(i)=>{T.set(t.root,(T.get(t.root)||0)+1);try{return await n(i)}finally{let s=T.get(t.root)-1;if(s)T.set(t.root,s);else T.delete(t.root);if(t.release)at(t.root)}}}var Me="__materialize",Ce=!1;function Kt(){if(Ce)return;if(typeof window>"u"||typeof document>"u")return;if(typeof window.addEventListener!=="function")return;Ce=!0;let e=()=>{let t=document.documentElement;if(typeof t?.toggleAttribute!=="function")return;t.toggleAttribute("data-reactive-offline",globalThis.navigator?.onLine===!1)};e(),window.addEventListener("online",e),window.addEventListener("offline",e)}var zt="phlex-reactive:latency";function ct(){return typeof sessionStorage<"u"&&Boolean(sessionStorage.getItem(zt))}function ve(){if(typeof document>"u")return;if(!p.has("devtools")&&!w.get("devtools")[1])return;let e=document.querySelector?.('meta[name="phlex-reactive-env"]')?.content==="development";if(e||ct())y("devtools",(t)=>e&&t.attach())}var ut="data-reactive-active",A=0;function lt(){if(A++,A===1)ft("reactive:busy")}function dt(){if(A===0)return;if(A--,A===0)ft("reactive:idle")}function zr(){return A}function Vr(){A=0,(typeof document<"u"?document.documentElement:null)?.removeAttribute?.(ut)}function ft(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.toggleAttribute==="function")t.toggleAttribute(ut,A>0);if(typeof document.dispatchEvent==="function"&&typeof CustomEvent==="function")document.dispatchEvent(new CustomEvent(e,{detail:{count:A}}))}var ht="data-reactive-requests";function mt(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.setAttribute!=="function"||!Vt(t))return;let r=Gt(t);r[e]=(Number(r[e])||0)+1,t.setAttribute(ht,JSON.stringify(r))}function Vt(e){return e.hasAttribute?.("data-reactive-verbose")||!!document.querySelector?.('[data-reactive-verbose="true"]')}function Gt(e){try{let t=JSON.parse(e.getAttribute(ht));if(t&&typeof t==="object")return{action:0,defer:0,...t}}catch{}return{action:0,defer:0}}function De(){xt(),Rt(),Nt(),Ot(),It(),Bt(),Dt(),$t(),qt(),Wt(),Kt(),ve()}function Yt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var pt=Symbol.for("phlex-reactive.core");if(globalThis[pt])console.error("[phlex-reactive] the client was loaded twice. Import EITHER phlex/reactive/reactive_controller (the default, "+"everything in one file) OR phlex/reactive/core (features on demand), not both — each carries its own state.");globalThis[pt]=!0;var gt=!1;function Xt(){if(gt)return;if(typeof document>"u")return;let e=document.querySelectorAll('[data-controller~="reactive"]');if(!e||e.length===0)return;console.warn("[phlex-reactive] found "+e.length+' element(s) with data-controller="reactive" '+"but the reactive controller never connected. It is loaded but not registered — "+'add `application.register("reactive", ReactiveController)` (importmap) or import it into app/javascript/controllers/ for lazyLoadControllersFrom apps. See the README.')}if(typeof window<"u"&&typeof document<"u"){let e=()=>setTimeout(Xt,0);if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",e,{once:!0});else e()}var Zt=new Set(["href","src","srcset","srcdoc","action","formaction","xlink:href","style"]);function bt(e){let t=String(e).toLowerCase();return t.startsWith("on")||Zt.has(t)}var ee=new WeakMap;function Qt(e,t,r){let[n,i,s]=t;ee.get(e)?.(),e.classList.add(n,i),r();let a=!1,o=requestAnimationFrame(()=>{if(a)return;e.classList.remove(i),e.classList.add(s)}),c=(d)=>{if(a||d&&d.target!==e)return;a=!0,ee.delete(e),clearTimeout(l),globalThis.cancelAnimationFrame?.(o),e.removeEventListener("animationend",c),e.removeEventListener("transitionend",c),e.classList.remove(n,i,s)};ee.set(e,c),e.addEventListener("animationend",c),e.addEventListener("transitionend",c);let l=setTimeout(c,er(e))}function er(e){let t=0;try{let r=getComputedStyle(e);for(let n of["transition","animation"]){let[i,s]=["Duration","Delay"].map((o)=>String(r[n+o]).split(",").map((c)=>parseFloat(c)*(/ms/.test(c)?1:1000)||0)),a=String(r[n+"IterationCount"]).split(",").map((o)=>/inf/.test(o)?1/0:parseFloat(o)>=0?parseFloat(o):1);for(let o=0;o<i.length||o<s.length||o<a.length;o++){let c=i[o%i.length]*a[o%a.length]||0;t=Math.max(t,c+s[o%s.length])}}}catch{}return Math.min(Math.max(t+50,350),5000)}var tr=":is(lexxy-editor, trix-editor, [contenteditable=''], [contenteditable=true], [contenteditable=plaintext-only])",rr=new Set(["lexxy-editor","trix-editor"]);function E(e){let t="",r=!1,n=(s)=>{if(r&&t&&!t.endsWith(`
2
2
  `))t+=`
3
- `;r=!1,t+=o},i=(o)=>{for(let a of o.childNodes){let s=/^(div|p|li)$/.test(a.localName);if(s)r=!0;if(a.nodeType===3)a.data&&n(a.data);else if(a.localName==="br")n(`
4
- `);else if(a.nodeType===1)i(a);if(s)r=!0}};return i(e),t=t.replace(/\r\n?/g,`
5
- `).replace(/\n$/,""),e.getAttribute("data-reactive-editable")==="multi"?t:t.replace(/\n/g," ")}var J=new WeakMap;function me(e){if(e?.hasAttribute?.("data-reactive-editable")&&!J.has(e))J.set(e,E(e))}function pe(e){return me(e),J.get(e)}function zt(e){return Kt.has(e.localName)?typeof e.value==="string":!0}var xe=Object.freeze({show:(e,t,r)=>Q(e,!1,t,r),hide:(e,t,r)=>Q(e,!0,t,r),toggle:(e,t,r)=>Q(e,!e.hidden,t,r),add_class:(e,t)=>e.classList.add(...t.classes??[]),remove_class:(e,t)=>e.classList.remove(...t.classes??[]),toggle_class:(e,t)=>(t.classes??[]).forEach((r)=>e.classList.toggle(r)),set_attr:(e,t)=>{if(ee(t.name))e.setAttribute(t.name,t.value??"")},remove_attr:(e,t)=>{if(ee(t.name))e.removeAttribute(t.name)},toggle_attr:(e,t)=>{if(!ee(t.name))return;if(Array.isArray(t.values)){let[r,n]=t.values;e.setAttribute(t.name,e.getAttribute(t.name)===r?n:r)}else if(e.hasAttribute(t.name))e.removeAttribute(t.name);else e.setAttribute(t.name,"")},focus:(e)=>e.focus?.(),focus_first:(e)=>tr(e)?.focus?.(),show_modal:(e)=>je(e),close_dialog:(e)=>Et(e),text:(e,t)=>{let r=String(t.value??"");if(e.textContent!==r)e.textContent=r},copy_media:(e,t,r)=>{let n=null;try{n=r({...t,to:t.from})[0]??null}catch{}ct(e,n)},check_group:(e,t)=>{let r=t.global?document.querySelectorAll('[data-controller~="reactive"]'):[e];for(let n of r)b("bindings",(i)=>i.checkGroup(n,t.group,t.checked))},presence:(e,t)=>b("presence",(r)=>r.set(e,t.state)),dispatch:(e,t)=>{e.dispatchEvent(new CustomEvent(t.name,{bubbles:!0,composed:!0,detail:t.detail??{}}))},submit:(e,t,r)=>{let n=Vt(e);if(!n)return;let i=null;if(t?.submitter!=null&&typeof r==="function"){if(i=r({...t,to:t.submitter})[0]??null,!(i?.form===n&&(i.type==="submit"||i.type==="image")))console.warn(`[phlex-reactive] submitter ${t.submitter} is not a submit control of the form — ignored`),i=null}i?n.requestSubmit?.(i):n.requestSubmit?.()},paste_into:(e)=>Gt(e),preview_file:(e,t,r)=>Yt(e,t,r),set_value:(e,t)=>Zt(e,String(t.value??"")),persist_state:(e,t)=>b("persist",(r)=>r.writeState(e,t.state)),persist_clear:(e)=>b("persist",(t)=>t.clearRoot(e))});function Vt(e){if(e?.tagName==="FORM")return e;return e?.form??e?.closest?.("form")??null}function Gt(e){let t=globalThis.navigator?.clipboard;if(typeof t?.readText!=="function")return;t.readText().then((r)=>{if(!r)return;e.value=r,at(e),e.focus?.()}).catch(()=>{})}var R=new Map,N=null;function Yt(e,t,r){if(e?.tagName!=="INPUT"||e.type!=="file")return Re(`reads an input[type=file], not <${e?.localName}>`);let n=typeof r==="function"?r({...t,to:t.into})[0]:null;if(n?.tagName!=="IMG")return Re(`paints an <img>, and ${JSON.stringify(t.into)} is ${n?`a <${n.localName}>`:"not on the page"}`);let o=[...t.valid===!0&&e.validity?.valid===!1?[]:e.files??[]].find((a)=>typeof a?.type==="string"&&a.type.startsWith("image/"));if(ot(n),o){let a=URL.createObjectURL(o);R.set(n,a),n.setAttribute("src",a),Xt()}else n.removeAttribute("src");if(z(n),t.name==null)return;for(let a of r({...t,to:t.name}))a.textContent=o?o.name:""}function Re(e){console.warn(`[phlex-reactive] preview_file ${e} — skipped`)}function ot(e){let t=R.get(e);if(t===void 0)return;if(R.delete(e),URL.revokeObjectURL(t),R.size===0)N?.disconnect(),N=null}function Xt(){if(N||typeof MutationObserver!=="function"||!document?.documentElement)return;N=new MutationObserver(()=>{for(let[e,t]of R)if(!e.isConnected||e.getAttribute("src")!==t)ot(e)}),N.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["src"]})}function at(e){if(typeof e.dispatchEvent==="function")e.dispatchEvent(new Event("input",{bubbles:!0}))}function Zt(e,t){if(!/^(input|textarea|select)$/.test(e.localName)||e.type==="file"&&t!==""){console.warn("[phlex-reactive] set_value skipped: not a field it can write",e);return}let r=Ne(e);if(e.value=t,Ne(e)!==r)at(e)}function Ne(e){return e.type==="select-multiple"?[...e.selectedOptions].map((t)=>t.value).join(`
6
- `):e.value}function Qt(e,t,r){if(r?.transition)Ut(e,r.transition,()=>e.hidden=t);else e.hidden=t}function Q(e,t,r,n){if(Qt(e,t,r),r?.expanded==null||typeof n!=="function")return;for(let i of n({...r,to:r.expanded}))i.setAttribute?.("aria-expanded",String(!t))}function ee(e){if(!st(e))return!0;return console.warn(`[phlex-reactive] refused client attr op on ${JSON.stringify(e)} — skipped`),!1}function ct(e,t){if(e?.localName!=="img")return console.warn(`[phlex-reactive] copy_media targets an <img>, not <${e?.localName}> — skipped`),null;let r=t?.localName==="img"?t:null,n=r?.getAttribute("src"),i=!1;for(let a of["srcset","src"]){let s=n?r.getAttribute(a):null;if(s==null){if(e.hasAttribute(a))i=e.removeAttribute(a)??!0}else if(e.getAttribute(a)!==s)i=e.setAttribute(a,s)??!0}if(i)z(e);let o=r?.getAttribute("alt")??"";if(e.getAttribute("alt")!==o)e.setAttribute("alt",o);return r?o:!1}var er='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function tr(e){return e.querySelectorAll?.(er)?.[0]??null}function ge(e){if(Array.isArray(e))return e;if(typeof e!=="string")return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}var Ie=Object.freeze({backspace:"Backspace",delete:"Delete",enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"}),Pe=Object.freeze(["meta","ctrl","alt","shift"]);function V(e,t,r){let n=e.split("+");for(let a of Pe)if(n.includes(a)!==Boolean(t[`${a}Key`]))return!1;let i=n.find((a)=>!Pe.includes(a));if(i===void 0||typeof t.key!=="string")return!0;let o=r&&Object.hasOwn(r,i)?r[i]:Object.hasOwn(Ie,i)?Ie[i]:/^[a-z0-9]$/.test(i)?i:null;return typeof o==="string"&&o.toLowerCase()===t.key.toLowerCase()}var rr=(e)=>e&&typeof e==="object"?e.keys:String(e);function te(e,t,r){let n=t.target;if(e?.inEditable!==!0&&(n?.isContentEditable||/^(input|textarea|select)$/.test(n?.localName)))return!1;let i=/[Mm]ac|iP/.test(navigator.userAgentData?.platform??navigator.platform)?"meta":"ctrl";return V(rr(e).replace(/^mod\+/,`${i}+`),t,r)}function nr(e){if(Array.isArray(e))return[{ops:e,legacy:!0}];if(e&&typeof e==="object")return[e];if(typeof e!=="string")return[];let t=e.trim();if(t.startsWith("["))return[{ops:ge(t),legacy:!0}];let r=[];for(let n of t.split(" ")){if(n==="")continue;let i=null;try{i=JSON.parse(n)}catch{i=null}if(i&&typeof i==="object"&&!Array.isArray(i))r.push(i);else console.warn(`[phlex-reactive] malformed on_client binding record ${JSON.stringify(n)} — skipped`)}return r}function Oe(e,t,r){if(e.legacy)return!0;let n=e.on;if(typeof n!=="string"||n==="")return!1;let i=n.indexOf(".");if(t.type!==(i<0?n:n.slice(0,i)))return!1;if(Boolean(e.window)!==mt(t.currentTarget))return!1;return i<0||r===null||V(n.slice(i+1),t,r)}function ir(e,t){let r=e.detail;if(r===void 0)return!0;if(r===null||typeof r!=="object"||Array.isArray(r))return!1;let n=t.detail;if(n===null||typeof n!=="object")return!1;return Object.keys(r).every((i)=>n[i]===r[i])}var Me=new WeakMap;function sr(e,t,r){if(!r.once)return!1;let n=t.currentTarget??e.element,i=Me.get(e);if(!i)i=new WeakMap,Me.set(e,i);let o=i.get(n);if(!o)o=new Set,i.set(n,o);let a=t.params?.ops,c=(n===globalThis.window?`${typeof a==="string"?a:JSON.stringify(a??null)}|`:"")+JSON.stringify(r);if(o.has(c))return!0;return o.add(c),!1}var Ce=new WeakMap;function or(e,t){if(e===null||typeof e!=="object")return!1;let r=e.params?.ops,n=typeof r==="string"?r:JSON.stringify(r??null),i=Ce.get(e);if(!i)i=new WeakMap,Ce.set(e,i);let o=i.get(t);if(!o)o=new Map,i.set(t,o);let a=o.get(e.currentTarget);if(!a)a=new Set,o.set(e.currentTarget,a);if(a.has(n))return!0;return a.add(n),!1}function ae(e,t,r){for(let n of e){if(!Array.isArray(n))continue;let[i,o={}]=n;if(!Object.hasOwn(xe,i)){console.warn(`[phlex-reactive] unknown client op ${JSON.stringify(i)} — skipped`);continue}let a=t(o);if(a.length===0&&r)r(i,o);for(let s of a)if(xe[i](s,o,t),o?.keep===!0)Ue(s,i,o,t)}}function ar(e,t){let r=e.to;if(t){if(r==="@root")return[t];if(typeof r!=="string"||r==="")return[];if(e.global)return[...document.querySelectorAll(r)];return[...t.querySelectorAll(r)]}if(typeof r!=="string"||r===""||r==="@root")return[];return[...document.querySelectorAll(r)]}function cr(e){let t=e.getAttribute?.("data-reactive-persist");return Boolean(t)&&t!=="off"}function ut(e){return["defer-token","defer-src","lazy-on","lazy-visible"].some((t)=>e.getAttribute?.(`data-reactive-${t}`)!=null)}function ur(e){return(e.getAttribute?.("data-action")??"").includes("reactive#trackDirty")||e.getAttribute?.("data-reactive-clipboard")!=null||e.querySelector?.('[data-action*="reactive#trackDirty"],[data-reactive-clipboard]')!=null}function lr(e){return["show-targets","group-targets","on-complete","filter-input","tags-field"].some((t)=>e.getAttribute?.(`data-reactive-${t}`)!=null)||(e.querySelectorAll?.("[data-reactive-show-field], [data-reactive-show]")??[]).length>0||e.querySelector?.("[data-reactive-nested-json], [data-reactive-nested-list], [data-reactive-confirm-when-param], [data-reactive-enable], [data-reactive-select-all], [data-reactive-count], [data-reactive-editable], [data-reactive-media]")!=null}function dr(e){return e.getAttribute?.("data-reactive-compute-inputs-param")!=null}function fr(e){return Boolean(e.matches?.("[data-reactive-sortable],[data-reactive-sortable-source]")||e.querySelector?.("[data-reactive-sortable],[data-reactive-sortable-source]"))}function lt(e){return e.getAttribute?.("data-reactive-presence")!=null}var hr=[["persist",[cr,null,null,!0]],["defer",[ut,null]],["form",[ur,null]],["bindings",[lr,null,null,!0]],["compute",[dr,null,null,!0]],["sortable",[fr,null]],["presence",[lt,null]],["effects",[(e)=>["enter","update","exit"].some((t)=>e.getAttribute?.(`data-reactive-effect-${t}`)!=null),null]],["hints",[(e)=>e.querySelector?.("[data-reactive-optimistic-param], [data-reactive-busy-param], [data-reactive-loading-param]")!=null,null]],["devtools",[(e)=>e.getAttribute?.("data-reactive-debug")==="true",null]]],A=new Map(hr),$e=new Map,p=new Map,mr=new Map;function y(e,t,r){dt.set(e,[t,r]),pr(e)}var dt=new Map;function pr(e){let t=A.get(e),[r,n]=dt.get(e);t[1]=r,t[2]=n}function Cr(e,t){t.install?.(P),p.set(e,t),mr.set(e,t)}function ft(e){let t=[];for(let[r,[n]]of A){if(!n||p.has(r))continue;try{if(e.some((i)=>n(i)))t.push(r)}catch{}}return t}function ht(e){return I(e).catch((t)=>H(e,"load",t))}function I(e){let t=$e.get(e);if(!t)t=(A.get(e)[1]??(()=>Promise.reject(Error("this entry has no way to import it"))))().then((n)=>(n.install?.(P),p.set(e,n),n)),$e.set(e,t);return t}var De=new Set;function H(e,t,r){let n=e+t;if(De.has(n))return;De.add(n),console.error(`[phlex-reactive] the "${e}" feature module (phlex/reactive/features/${e}) is unavailable: ${t}. If you bundle or vendor the client, alias or pin phlex/reactive/features/* (README: esbuild / webpack / bun).`,r)}function b(e,t){let r=p.get(e);if(r)return t(r);I(e).then(t,(n)=>H(e,"load",n))}var gr=1e4;function re(){let e=Number(globalThis.document?.head?.querySelector?.('meta[name="phlex-reactive-feature-timeout"]')?.content);return Number.isFinite(e)&&e>0?e:gr}function $r(){return[...A.keys()]}var qe=Promise.resolve();function Be(e,t,r){let n=P.waiting.get(e);if(n&&n[t]===r)delete n[t]}var P={enter:Ze,exit:Qe,count:rt,text:E,served:pe,waiting:new WeakMap};var O=Symbol.for("phlex-reactive.early"),br=1e4,yr=1500,mt=(e)=>e!=null&&(e===globalThis.window||e.window===e);function ne(){return globalThis[O]??={queue:[],connected:new WeakSet},globalThis[O]}function vr(){let e=Number(globalThis.document?.querySelector?.('meta[name="phlex-reactive-early-ttl"]')?.content);return Number.isFinite(e)&&e>0?e:br}function _r(e){let t={};for(let{name:r,value:n}of Array.from(e.attributes??[])){let i=/^data-reactive-(.+)-param$/i.exec(r);if(!i)continue;let o;try{o=JSON.parse(n)}catch{o=n}t[i[1].replace(/[-_]([a-z0-9])/g,(a,s)=>s.toUpperCase())]=o}return t}function Ar(e,t,r){return{[O]:!0,type:e.type,detail:e.detail,target:e.target,currentTarget:r?t.ownerDocument.defaultView:t,params:_r(t),key:e.key,code:e.code,metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,button:e.button,submitter:e.submitter,bubbles:e.bubbles,timeStamp:e.timeStamp,defaultPrevented:e.defaultPrevented,preventDefault(){},stopPropagation(){},stopImmediatePropagation(){}}}var K=new WeakMap;function wr(e,{token:t,type:r,method:n,filter:i,win:o},a){let s=K.get(e);if(!s)K.set(e,s=new Map);let c=o?`${t} ${a}`:t;if(s.has(c))return!1;return s.set(c,{type:r,method:n,filter:i,win:o,params:a,armed:!0}),!0}function We(e,t,r,n){if(e?.[O])return!1;let i=mt(e?.currentTarget),o=i?n:e?.currentTarget,a=Er(e,o,i?`@${t}`:t),s=K.get(o),c=i&&JSON.stringify(e.params);for(let l of s?.values()??[]){if(!l.armed||l.method!==t||l.type!==e.type||Boolean(l.win)!==i)continue;if(i&&l.params!==c)continue;if(l.filter&&!V(l.filter,e,r))continue;return l.armed=!1,!0}return a}var W=new WeakMap;function Sr(e,t,r){let n=W.get(e);if(!n)W.set(e,n=new Map),setTimeout(()=>W.delete(e));let i=n.get(t)??{};n.set(t,i),i[r]=(i[r]??0)+1}function Er(e,t,r){let n=e&&W.get(e)?.get(t);if(!n?.[r])return!1;return n[r]-=1,!0}class pt extends bt{static values={token:String};#_;#A=new Map;#l=new Map;#ee;#L;#j;#x=0;#d=new Map;#R=new WeakMap;#t;featuresReady=qe;#r=new Map;#N=new Set;#f=!1;#n=null;#h=new Map;#w=new Map;#m=new Map;#p=0;#U;#Pe=0;#Oe=0;connect(){if(it=!0,ne().connected.add(this.element),this.element.id==="")console.warn("[phlex-reactive] a reactive root has no id; its next-action token can't self-match "+"and may fall back to the first token in the response → a silent HTTP 403 on the NEXT action. "+"Put id: on the SAME element as reactive_attrs — use div(**reactive_root) (emits id + token together), "+"or div(id:, **reactive_attrs). The id: must NOT be on a child. See the README.");if(this.element.getAttribute?.("data-reactive-token-value")!=null||ut(this.element))this.#t=(e)=>{if(e.type==="focusin"?!e.target.hasAttribute?.("data-reactive-editable"):e.target!==this.element)return;if(e.type===D)this.#K();this.#J(!0)},this.element.addEventListener?.("turbo:morph-element",this.#t),this.element.addEventListener?.("focusin",this.#t),this.element.addEventListener?.(D,this.#t);this.element.querySelectorAll?.("[data-reactive-editable]").forEach(me),this.#p++,this.featuresReady=qe,this.#J(),j(this.element),this.#ie()}#Me(e){}#Ce(e,t,r,n){}#$e(){}#De(e,t){}#J(e){{let t=this.#p,r=[];for(let[o,[a]]of A){if(!a||this.#N.has(o))continue;let s=p.get(o);if(s&&!s.connect)continue;try{if(a(this.element))r.push(o)}catch(c){this.#g(o,"detect",c)}}if(r.length===0)return;for(let o of r)this.#N.add(o);if(!this.#f&&r.every((o)=>p.has(o))){for(let o of r)this.#I(t,o,p.get(o),e);return}for(let o of r){let a=this.#te(t,o),s=[];for(let l of A.keys()){if(l===o)break;if(this.#m.has(l))s.push(this.#m.get(l))}let c=Promise.all(s).then(()=>a).then((l)=>l&&this.#I(t,o,l,e));if(this.#m.set(o,c),A.get(o)[3])this.#n=c}let n=this.#n;n?.then(()=>{if(this.#n===n)this.#n=null}),this.#f=!0;let i=Promise.all(this.#m.values()).then(()=>{if(this.featuresReady===i)this.#f=!1});this.featuresReady=i}}#te(e,t){{let r=()=>e===this.#p;return this.#re(t),new Promise((n)=>{let i=!1,o=setTimeout(()=>{if(this.#h.delete(o),i=!0,r())this.#g(t,"timeout",Error(`not loaded after ${re()} ms`));n(null)},re());this.#h.set(o,n);let a=()=>{clearTimeout(o),this.#h.delete(o)};I(t).then((s)=>{if(a(),i)queueMicrotask(()=>this.#I(e,t,s));else n(s)},(s)=>{if(a(),r())this.#g(t,"load",s);n(null)})})}}#re(e){{let t=A.get(e)[2];if(!t)return;let r={};try{this.#w.set(e,[t(this.element,r),r]),P.waiting.set(this.element,{...P.waiting.get(this.element),[e]:r})}catch(n){this.#g(e,"detect",n)}}}#H(e,t){{let[r,n]=this.#w.get(e)??[];if(this.#w.delete(e),!t)Be(this.element,e,n);try{r?.()}catch(i){console.error(`[phlex-reactive] the "${e}" feature module failed to stop waiting`,i)}return n}}#I(e,t,r,n){{if(e!==this.#p)return;let i=this.#H(t);try{r.connect?.(this,this.#e(),n,i),this.#r.set(t,r)}catch(o){this.#g(t,"connect",o)}}}#e(){return this.#U??={emit:(e,t,r)=>this.#s(e,t,r),reseed:()=>this.#K(),proceed:(e,t,r,n)=>this.#O(e,t,r,0,0,null,n),forgetToken:()=>{this.#_=void 0},owns:(e)=>this.#F(e),ownership:()=>this.#$(),opTargets:(e)=>this.#W(e),diagnose:(e,t)=>this.#B(e,t),applyOps:(e,t)=>ae(e,(r)=>this.#W(t!=null&&r.to==null?{...r,to:t}:r),(r,n)=>this.#B(`client op "${r}"`,n)),listnavOptions:(e)=>this.#y(e),collectFields:()=>this.#X(),plain:Ve,text:E,served:pe,copyMedia:ct,confirm:(e,t)=>Promise.resolve().then(()=>ye(e,t)).catch(()=>!1)},this.#U}#K(){this.#r.get("form")?.reseed(this),this.#r.get("bindings")?.reseed(this),this.#r.get("compute")?.seed(this)}#g(e,t,r){if(H(e,t,r),this.#i("feature"),t==="load"&&this.element.getAttribute?.("data-reactive-defer-pending"))this.element.removeAttribute("data-reactive-defer-pending"),this.element.removeAttribute("aria-busy");this.#s("reactive:error",{kind:"feature",feature:e,phase:t,error:r})}#ne(){{this.#p++;for(let[t,r]of this.#h)clearTimeout(t),r(null);this.#h.clear();for(let t of[...this.#w.keys()]){let r=this.#H(t,!0),n=this.element;b(t,(i)=>{i.abandon?.(n,r),Be(n,t,r)})}this.#N.clear(),this.#m.clear(),this.#f=!1,this.#n=null;let e=[...this.#r];this.#r.clear();for(let[t,r]of e)try{r.disconnect?.(this,this.#e())}catch(n){console.error(`[phlex-reactive] the "${t}" feature module failed to disconnect`,n)}}}#ie(){if(this.element.setAttribute?.("data-reactive-connected",""),this.element.isConnected)this.element.dispatchEvent?.(new CustomEvent("reactive:connect",{bubbles:!0,composed:!0,detail:{id:this.element.id}}));this.#se()}#P=new Set;#se(){let{queue:e}=ne();if(e.length===0)return;let t=[];for(let i=e.length-1;i>=0;i--){let{root:o}=e[i];if(o===this.element||!o.isConnected)t.unshift(...e.splice(i,1))}let r=vr(),n=new Map;for(let i of t){let o=n.get(i.event)??[new Set,new Set];n.set(i.event,o);let a=o[+!!i.win];if(a.has(i.el))continue;a.add(i.el);let s=i.win?Math.min(yr,r):r,c=i.root!==this.element?"its root left the page before a controller connected":performance.now()-i.at>s?`it is older than the ${s} ms ${i.win?"window-trigger":"early-event"} TTL`:i.el.isConnected&&this.element.contains(i.el)?null:"its element left the root before the controller connected";if(c){if(this.#q())console.warn(`[phlex-reactive] dropped an early "${i.event.type}" trigger: ${c}`);continue}this.#oe(i)}}#oe({event:e,el:t,descs:r,win:n}){let i=Ar(e,t,n),o=this.application?.schema?.keyMappings,a=(t.getAttribute("data-action")??"").split(/\s+/),s=n?this.element:t;for(let c of r){if(!a.includes(c.token))continue;if(c.filter&&!V(c.filter,e,o))continue;if(/#\w+.*:once\b/.test(c.token)){if(!wr(s,c,n&&JSON.stringify(i.params)))continue;this.#P.add(s)}if(Sr(e,s,n?`@${c.method}`:c.method),c.method==="runOps")this.runOps(i);else this.dispatch(i)}}disconnect(){if(this.#ne(),this.#de(),this.#he(),this.#t)this.element.removeEventListener?.("turbo:morph-element",this.#t),this.element.removeEventListener?.("focusin",this.#t),this.element.removeEventListener?.(D,this.#t);ne().connected.delete(this.element),this.element.removeAttribute?.("data-reactive-connected");for(let e of this.#P)K.delete(e);this.#P.clear()}dispatch(e){let t=e.params?.shortcut;if(t!=null&&!te(t,e,this.application?.schema?.keyMappings))return;if(We(e,"dispatch",this.application?.schema?.keyMappings,this.element))return;let{action:r,params:n,debounce:i,throttle:o,confirm:a,confirmWhen:s,outside:c,window:l,optimistic:d}=e.params;if(!r)return;let m=e.params.busy??e.params.loading;if(c&&this.element.contains(e.target))return;let f=e.currentTarget??e.target;if((t!=null||!l)&&!this.#Te(d,f))e.preventDefault();if(r===Mt){let S=()=>{{let h=this.#r.get("defer");if(h)return h.materialize(this)}if(this.tokenValue)return this.#O(f,r,"{}")};return this.#f?this.featuresReady.then(S):S()}let g=this.#z(a,s),v=()=>this.#O(f,r,n,i,o,d,m);if(!g)return v();if(g instanceof Promise)return g.then((S)=>S?this.#S(S,f,v):v());this.#S(g,f,v)}#S(e,t,r){return Promise.resolve().then(()=>ye(e,{el:t})).catch(()=>!1).then((n)=>{if(n)r()})}#z(e,t){if(e)return e;if(!t)return null;{let r=p.get("bindings");if(r)return r.confirmMessage(this,this.#e(),t);return this.#V("bindings").then((n)=>n&&n.confirmMessage(this,this.#e(),t))}}#V(e){{let t;return Promise.race([I(e).catch((r)=>(H(e,"load",r),null)),new Promise((r)=>t=setTimeout(()=>r(null),re()))]).finally(()=>clearTimeout(t))}}runOps(e){let t=e.params?.ops;if(t?.shortcut!=null&&!te(t.shortcut,e,this.application?.schema?.keyMappings))return;if(We(e,"runOps",this.application?.schema?.keyMappings,this.element))return;if(or(e,this))return;let r=e.params??{},n=e.currentTarget??e.target,i=nr(r.ops),o=i.filter((s)=>Oe(s,e,null)),a=o.length<=1?o:o.filter((s)=>Oe(s,e,this.application?.schema?.keyMappings));if(a.length===0&&i.length>0){if(this.#q())this.#v((s)=>s.noBinding(this,e));return}for(let s of a){if(s.outside&&e[O])continue;if(!ir(s,e))continue;if(s.shortcut!=null&&!te(s.shortcut,e,this.application?.schema?.keyMappings))continue;if(sr(this,e,s))continue;this.#ae(s.legacy?{...r,ops:s.ops}:s,e,n)}}#ae({ops:e,confirm:t,confirmWhen:r,outside:n,window:i,shortcut:o},a,s){if(n&&this.element.contains(a.target))return;if(o!=null||!i)a.preventDefault();let c=this.#z(t,r),l=()=>this.#Ee(this.#Se(e));if(!c)return l();if(c instanceof Promise)return c.then((d)=>d?this.#S(d,s,l):l());this.#S(c,s,l)}recompute(e){return p.get("compute")?.recompute(this,this.#e(),e)}tagsAdd(e){if(e?.defaultPrevented)return;if(this.#y(e).some((t)=>t.hasAttribute?.("data-reactive-highlighted")))return;return this.#b("tagsAdd",e)}tagsPick(e){return this.#b("tagsPick",e)}tagsRemove(e){return this.#b("tagsRemove",e)}nestedAdd(e){return this.#b("nestedAdd",e)}nestedRemove(e){return this.#b("nestedRemove",e)}syncNestedJson(e){return p.get("bindings")?.syncNestedJson(this,this.#e(),e)}#b(e,t){{let r=p.get("bindings");if(r)return r[e](this,this.#e(),t);t?.preventDefault?.();let n={currentTarget:t?.currentTarget??null,target:t?.target??null,preventDefault(){}};return b("bindings",(i)=>i[e](this,this.#e(),n))}}trackDirty(){(this.#r.get("form")??p.get("form"))?.scan(this,this.#e())}listnavNext(e){this.#E(e,(t,r)=>t<0?0:(t+1)%r)}listnavPrev(e){this.#E(e,(t,r)=>t<0?r-1:(t-1+r)%r)}listnavFirst(e){this.#E(e,()=>0)}listnavLast(e){this.#E(e,(t,r)=>r-1)}listnavPick(e){let t=this.#y(e),r=t.findIndex((n)=>n.hasAttribute("data-reactive-highlighted"));if(r<0)return;e.preventDefault(),t[r].click()}listnavClose(e){for(let t of this.#y(e))t.removeAttribute("data-reactive-highlighted")}#E(e,t){let r=this.#y(e);if(!r.length)return;e.preventDefault();let n=this.#ce(e),i=globalThis.document?.activeElement,o=n?r.findIndex((s)=>s===i||i!=null&&s.contains?.(i)):r.findIndex((s)=>s.hasAttribute("data-reactive-highlighted")),a=r[t(o,r.length)];if(n)a.focus?.();else{for(let s of r)s.removeAttribute("data-reactive-highlighted");a.setAttribute("data-reactive-highlighted","true")}a.scrollIntoView?.({block:"nearest"})}#ce(e){return(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-focus-param")==="true"}#y(e){let r=(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-option-param")??this.element.getAttribute("data-reactive-listnav-option-param");if(!r)return[];let n=this.#$();return Array.from(this.element.querySelectorAll(r)).filter((i)=>!i.hidden&&n(i))}#O(e,t,r,n,i,o,a){if(this.#s("reactive:before-dispatch",{action:t,params:this.#Z(r),element:this.element},{cancelable:!0}).defaultPrevented)return;let c=Number(n)||0;if(c>0)return this.#le(e,c,t,r,o,a);let l=Number(i)||0;if(l>0)return this.#fe(e,l,t,r,o,a);return this.#T(t,r,o,e,a)}#T(e,t,r,n,i){let o={inverse:null,undo:[],resurrect:null},a=this.#Fe(e,n,o),s=Boolean(r||i),c=(f)=>{if(!s||!f)return;let g=this.#e();if(o.inverse=f.optimistic(this,g,r,n),o.undo.push(...f.busy(this,g,i,n)),this.#C())o.resurrect=f.resurrection(this,g,r,n)},l=p.get("hints");if(!s||l)c(l);let d=()=>this.#be(e,t,o,a),m=()=>this.#n?this.#n.then(d):d();return this.queue=(this.queue??Promise.resolve()).then(()=>s&&!l?this.#ue().then(c).then(m):m()),this.queue}#ue(){return this.#V("hints")}#le(e,t,r,n,i,o){this.#M(e);let a=()=>{this.#M(e),this.#T(r,n,i,e,o)},s=setTimeout(a,t);e?.addEventListener?.("blur",a,{once:!0}),this.#A.set(e,{timer:s,flush:a})}#M(e){let t=this.#A.get(e);if(!t)return;clearTimeout(t.timer),e?.removeEventListener?.("blur",t.flush),this.#A.delete(e)}#de(){for(let e of[...this.#A.keys()])this.#M(e)}#fe(e,t,r,n,i,o){let a=this.#l.get(e)??new Map;if(a.has(r))return;let s=setTimeout(()=>{if(a.delete(r),a.size===0)this.#l.delete(e)},t);return a.set(r,s),this.#l.set(e,a),this.#T(r,n,i,e,o)}#he(){for(let e of this.#l.values())for(let t of e.values())clearTimeout(t);this.#l.clear()}#s(e,t,{cancelable:r=!1}={}){let n=new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:r,detail:t});return(this.element.isConnected?this.element:document).dispatchEvent(n),n}#o(e,t,r,n){let i=()=>{if(!this.element.isConnected){console.warn("[phlex-reactive] retry() ignored — the reactive root left the DOM");return}return this.#T(e,t)};this.#s("reactive:error",{action:e,params:r,...n,retry:i})}#i(e){if(this.element?.isConnected===!1)return;this.element?.setAttribute?.("data-reactive-error",e)}#me(){this.element?.removeAttribute?.("data-reactive-error")}#pe(){let e=document.querySelector("[data-reactive-error-flash]");if(!e?.content)return;let t=e.getAttribute("data-reactive-error-flash")||"flash",r=document.getElementById(t);if(!r)return;r.appendChild(e.content.cloneNode(!0))}#ge(){{let e=p.get("devtools");if(e)return e.delay();if(Ye())return I("devtools").then((t)=>t.delay(),()=>{})}}#C(){return this.element?.getAttribute?.("data-reactive-debug")==="true"}#G(){return typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now()}async#be(e,t,r,n){let{fields:i,files:o}=this.#X(),a=this.#Z(t),s={...i,...a},c=this.#a,l=o.length>0,d=l?this.#Ae(c,e,s,o):JSON.stringify({token:c,act:e,params:s}),m=this.#C()?{action:e,paramNames:Object.keys(a),fieldNames:Object.keys(i),encoding:l?"multipart":"json",status:null,streams:[],tokenRefreshed:!1,started:this.#G()}:null;await this.#ge();try{if(navigator.onLine===!1){this.#c(r.inverse),this.#i("offline"),this.#o(e,t,s,{kind:"offline"});return}let f;try{let h={Accept:"text/vnd.turbo-stream.html","X-CSRF-Token":this.#Ne()};if(!l)h["Content-Type"]="application/json";let k=this.#Ie();if(k)h["X-Pgbus-Connection"]=k;let M=lt(this.element)&&document.getElementById(`reactive-presence-src-${this.element.id}`)?.getAttribute("connection-id");if(M)h["X-Reactive-Presence"]=M;let be=Pt(this.element);if(be)h["X-Reactive-Held"]=be;rt("action"),f=await fetch(this.#xe(),{method:"POST",headers:h,body:d,credentials:"same-origin",signal:AbortSignal.timeout(this.#Re())})}catch(h){if(console.error("[phlex-reactive] action error",h),this.#c(r.inverse),h?.name==="TimeoutError"||h?.name==="AbortError"){this.#i("timeout"),this.#o(e,t,s,{kind:"timeout"});return}this.#pe(),this.#i("network"),this.#o(e,t,s,{kind:"network"});return}if(m)m.status=f.status;if(f.redirected){console.error("[phlex-reactive] action was redirected (auth/CSRF?) — no update applied"),this.#c(r.inverse),this.#i("redirected"),this.#o(e,t,s,{kind:"redirected",status:f.status});return}if(!f.ok){let h=await f.text();if(console.error(`[phlex-reactive] action failed: HTTP ${f.status}`,h),this.#c(r.inverse),(f.headers.get("Content-Type")||"").includes("turbo-stream")){let k=this.#Y(h);if(this.#a=k??this.#a,m)this.#v((M)=>M.recordBody(m,h,k));Fe(this.element,h,!1)}this.#i("http"),this.#o(e,t,s,{kind:"http",status:f.status,body:h});return}let g=f.headers.get("Content-Type")||"";if(!g.includes("turbo-stream")){console.error(`[phlex-reactive] expected a turbo-stream, got "${g}" — no update applied`),this.#c(r.inverse),this.#i("content-type"),this.#o(e,t,s,{kind:"content-type",status:f.status});return}let v=await f.text(),S=this.#Y(v);if(this.#a=S??this.#a,m)this.#v((h)=>h.recordBody(m,v,S));if(Fe(this.element,v),r.resurrect)queueMicrotask(r.resurrect);return this.#me(),this.#s("reactive:applied",{action:e,params:s,html:v}),v}catch(f){console.error("[phlex-reactive] action error",f),this.#c(r.inverse),this.#s("reactive:error",{action:e,params:s,kind:"apply"})}finally{if(n?.(),m)this.#v((f)=>f.trace(this,{...m,ms:this.#G()-m.started}))}}get#a(){return this.#_??this.tokenValue}set#a(e){this.#_=e}tokenValueChanged(){this.#_=void 0}#Y(e){let t=this.element.id;if(!t)return e.match(/data-reactive-token-value="([^"]+)"/)?.[1];let{token:r,self:n}=this.#ye(t),i=e.match(r);if(i)return i[1];let o=e.match(n);if(o)return o[1].match(/data-reactive-token-value="([^"]+)"/)?.[1];return}#ye(e){let t=this.#j;if(t&&t.id===e)return t;let r=Bt(e);return this.#j={id:e,token:new RegExp(`<turbo-stream\\b[^>]*\\baction="reactive:token"[^>]*\\btarget="${r}"[^>]*\\bdata-reactive-token-value="([^"]+)"`),self:new RegExp(`<turbo-stream\\b[^>]*\\baction="(?:replace|update)"[^>]*\\btarget="${r}"[^>]*>([\\s\\S]*?)</turbo-stream>`)}}#F(e){return e.closest('[data-controller~="reactive"]')===this.element}#$(){if(this.element.querySelectorAll('[data-controller~="reactive"]').length===0)return()=>!0;return(t)=>this.#F(t)}#X(){let e={},t=[],r=this.#$(),n=[];this.element.querySelectorAll("input[name], select[name], textarea[name]").forEach((s)=>{if(!r(s))return;if(s.type==="file")for(let c of s.files??[])t.push({name:s.name,file:c,multiple:s.multiple});else n.push(s)});let i=[];this.element.querySelectorAll(`[name]${Ht}`).forEach((s)=>{if(r(s))i.push(s)});let o=this.#ve(n),a=this.#_e(n);for(let s of n)if(o.has(s.name)){let c=e[s.name]??(e[s.name]=[]);if(s.type==="checkbox"||s.type==="radio"){if(s.checked)c.push(s.value)}else if(s.type==="hidden"){if(!a.has(s.name))c.push(s.value)}else if(s.multiple&&s.options){for(let l of s.options)if(l.selected)c.push(l.value)}else c.push(s.value)}else if(s.type==="checkbox")e[s.name]=s.checked;else if(s.type==="radio"){if(s.checked)e[s.name]=s.value}else e[s.name]=s.value;return i.forEach((s)=>{let c=s.getAttribute("name");if(!c)return;let l=s.getAttribute("data-reactive-editable")!=null?E(s):s.value??s.textContent??s.innerHTML??"",d=e[c];if(String(c).endsWith("[]")&&!zt(s))return;if(String(c).endsWith("[]")&&(d===void 0||Array.isArray(d))){(Array.isArray(d)?d:e[c]=[]).push(l);return}if(d==null||d==="")e[c]=l}),{fields:e,files:t}}#ve(e){let t=new Set;for(let r of e){if(r.type==="radio")continue;if(String(r.name).endsWith("[]"))t.add(r.name)}return t}#_e(e){let t=new Set;for(let r of e)if(r.type==="checkbox")t.add(r.name);return t}#Ae(e,t,r,n){let i=new FormData;i.append("token",e),i.append("act",t);let o=[];for(let[s,c]of Object.entries(r))if(Array.isArray(c)&&String(s).endsWith("[]"))if(c.length===0)o.push(String(s).slice(0,-2));else{let l=`${this.#k(s)}[]`;for(let d of c)i.append(l,String(d))}else this.#D(i,this.#k(s),c);for(let s of o)i.append("empty_groups[]",s);let a=this.#we(n);for(let{name:s,file:c,multiple:l}of n){let m=l||a.has(s)?`${this.#k(s)}[]`:this.#k(s);i.append(m,c,c.name)}return i}#k(e){let t=String(e),r=t.indexOf("[");if(r===-1)return`params[${t}]`;return`params${[t.slice(0,r),...t.slice(r).match(/[^\[\]]+/g)??[]].map((i)=>`[${i}]`).join("")}`}#D(e,t,r){if(r==null)e.append(t,"");else if(Array.isArray(r))r.forEach((n,i)=>this.#D(e,`${t}[${i}]`,n));else if(typeof r==="object")for(let[n,i]of Object.entries(r))this.#D(e,`${t}[${n}]`,i);else e.append(t,String(r))}#we(e){let t=new Map;for(let{name:r}of e)t.set(r,(t.get(r)??0)+1);return new Set([...t].filter(([,r])=>r>1).map(([r])=>r))}#Z(e){if(!e)return{};try{return typeof e==="string"?JSON.parse(e):e}catch{return{}}}#Se(e){return ge(e)}#Ee(e){ae(e,(t)=>this.#W(t),(t,r)=>this.#B(`client op "${t}"`,r))}#q(){return this.element?.getAttribute?.("data-reactive-verbose")==="true"||this.#C()}#B(e,t){if(!this.#q())return;this.#v((r)=>r.diagnose(this,e,t))}#v(e){b("devtools",e)}#W(e){let t=e.to;if(t==="@root")return[this.element];if(typeof t!=="string"||t==="")return[];if(e.global)return[...document.querySelectorAll(t)];return[...this.element.querySelectorAll(t)].filter((r)=>this.#F(r))}#Te(e,t){if(e?.checked!=="keep")return!1;let r=t?.type;return r==="checkbox"||r==="radio"}#c(e){if(!e)return;if(!this.element.isConnected)return;for(let t of e)t()}#Fe(e,t,r){this.#ke(e,t),Ze();let n=!1;return()=>{if(n)return;n=!0,this.#Le(e,t),Qe();for(let i of r.undo)i()}}#ke(e,t){if(this.#u(t,e,1),this.#u(this.element,e,1),this.#d.set(e,(this.#d.get(e)??0)+1),this.#x++===0)this.element.setAttribute("aria-busy","true");for(let r of this.#Q(e))this.#u(r,e,1)}#Le(e,t){this.#u(t,e,-1),this.#u(this.element,e,-1);let r=(this.#d.get(e)??1)-1;if(r<=0)this.#d.delete(e);else this.#d.set(e,r);if(--this.#x<=0)this.#x=0,this.element.removeAttribute("aria-busy");for(let n of this.#Q(e))this.#u(n,e,-1)}#u(e,t,r){if(!e||typeof e.getAttribute!=="function")return;let n=this.#R.get(e)??new Map,i=(n.get(t)??0)+r;if(i<=0)n.delete(t);else n.set(t,i);if(n.size===0){this.#R.delete(e),e.removeAttribute("data-reactive-busy");return}this.#R.set(e,n),e.setAttribute("data-reactive-busy",[...n.keys()].join(" "))}#Q(e){return[...this.element.querySelectorAll?.("[data-reactive-busy-on]")??[]].filter((r)=>r.getAttribute("data-reactive-busy-on")===e&&this.#F(r))}#xe(){return this.#ee??=document.querySelector('meta[name="phlex-reactive-action-path"]')?.content||"/reactive/actions"}#Re(){if(this.#L!=null)return this.#L;let e=document.querySelector('meta[name="phlex-reactive-timeout"]')?.content,t=Number(e);return this.#L=Number.isFinite(t)&&t>0?t:30000}#Ne(){return document.querySelector('meta[name="csrf-token"]')?.content??""}#Ie(){return document.querySelector("pgbus-stream-source[connection-id]")?.getAttribute("connection-id")||document.querySelector('meta[name="pgbus-connection-id"]')?.content||null}}if(typeof window<"u")if(window.Turbo)Le();else document.addEventListener("turbo:load",Le,{once:!0});y("persist",()=>import("phlex/reactive/features/persist"),Tr);y("defer",()=>import("phlex/reactive/features/defer"));y("form",()=>import("phlex/reactive/features/form"));y("bindings",()=>import("phlex/reactive/features/bindings"));y("compute",()=>import("phlex/reactive/features/compute"),Fr);y("sortable",()=>import("phlex/reactive/features/sortable"));y("presence",()=>import("phlex/reactive/features/presence"));y("effects",()=>import("phlex/reactive/features/effects"));y("hints",()=>import("phlex/reactive/features/hints"));y("devtools",()=>import("phlex/reactive/features/devtools"));he();function Tr(e,t){let r=()=>{t.edited=!0},n=(o)=>{let a=o.target;if(o.detail?.success&&a?.tagName==="FORM"&&a.contains?.(e))t.submitted=!0},i=["input","change","lexxy:change","trix-change"];for(let o of i)e.addEventListener?.(o,r);return document.addEventListener("turbo:submit-end",n),()=>{for(let o of i)e.removeEventListener?.(o,r);document.removeEventListener("turbo:submit-end",n)}}function Fr(e,t){let r=()=>{t.edited=!0};return e.addEventListener?.("input",r),e.addEventListener?.("change",r),()=>{e.removeEventListener?.("input",r),e.removeEventListener?.("change",r)}}var kr=1000,F=null,gt,G=new Set;function Lr(e){return ht(e).then((t)=>{if(e!=="effects")return;gt=t,t?.sweep()})}ze((e,t)=>{let r=e.detail,n=r?.render;if(typeof n!=="function")return;let i=r.newStream??e.target,o=ft(xr(i)).filter((s)=>!G.has(s));if(!t&&!G.has("effects")&&Rr(i))o.push("effects");if(o.length===0&&!F)return t?.wrap(e);if(o.length>0){for(let c of o)G.add(c);let s=F=Promise.race([Promise.all([F,...o.map(Lr)]),new Promise((c)=>setTimeout(c,kr))]).then(()=>{if(F!==s)return;F=null,G.clear()})}let a=F;r.render=async(s)=>{await a;let c={target:e.target,detail:{newStream:r.newStream,render:n}};(t??gt)?.wrap(c),await c.detail.render(s)}});function xr(e){let t=e?.querySelector?.("template")?.content;if(!t)return[];let r=[...t.querySelectorAll?.('[data-controller~="reactive"]')??[]];for(let n of t.children??[])if(n.matches?.('[data-controller~="reactive"]')&&!r.includes(n))r.unshift(n);return r.push(t),r}function Rr(e){return Boolean(e?.hasAttribute?.("data-reactive-effect")||document.getElementById?.(e?.getAttribute?.("target"))?.matches?.("[data-reactive-effect-update],[data-reactive-effect-exit]")||e?.querySelector?.("template")?.content?.querySelector?.("[data-reactive-effect-enter],[data-reactive-dismiss-after]")||document.querySelector?.("[data-reactive-dismiss-after]:not([data-reactive-dismiss-scheduled])"))}var Ur=pt;export{Xe as ACTIVE_ATTR,Ht as EDITOR_SELECTOR,Kt as EDITOR_TAGS,tt as REQUESTS_ATTR,Wt as checkReactiveRegistration,rt as countReactiveRequest,Ur as default,E as editableValue,Ze as enterReactiveActivity,Bt as escapeRegExp,Qe as exitReactiveActivity,ht as loadReactiveFeature,ze as onReactiveStreamWithoutEffects,Or as reactiveActivityCount,$r as reactiveFeatureNames,Le as registerReactiveActions,At as registerReactiveDefer,he as registerReactiveDev,wt as registerReactiveDismiss,wt as registerReactiveEffects,Cr as registerReactiveFeature,y as registerReactiveFeatureLoader,Lt as registerReactiveImageFallback,_t as registerReactiveJs,kt as registerReactiveKeep,Ft as registerReactiveModals,Rt as registerReactiveMorphFocus,Ct as registerReactiveOffline,xt as registerReactivePlaintext,wt as registerReactiveStreamRender,vt as registerReactiveToken,yt as registerReactiveVisit,Mr as resetReactiveActivity,pe as serverText,ft as unloadedFeaturesFor};
3
+ `;r=!1,t+=s},i=(s)=>{for(let a of s.childNodes){let o=/^(div|p|li)$/.test(a.localName);if(o)r=!0;if(a.nodeType===3)a.data&&n(a.data);else if(a.localName==="br")n(`
4
+ `);else if(a.nodeType===1)i(a);if(o)r=!0}};return i(e),t=t.replace(/\r\n?/g,`
5
+ `).replace(/\n$/,""),e.getAttribute("data-reactive-editable")==="multi"?t:t.replace(/\n/g," ")}var K=new WeakMap;function _e(e){if(e?.hasAttribute?.("data-reactive-editable")&&!K.has(e))K.set(e,E(e))}function we(e){return _e(e),K.get(e)}function nr(e){return rr.has(e.localName)?typeof e.value==="string":!0}var $e=Object.freeze({show:(e,t,r)=>re(e,!1,t,r),hide:(e,t,r)=>re(e,!0,t,r),toggle:(e,t,r)=>re(e,!e.hidden,t,r),add_class:(e,t)=>e.classList.add(...t.classes??[]),remove_class:(e,t)=>e.classList.remove(...t.classes??[]),toggle_class:(e,t)=>(t.classes??[]).forEach((r)=>e.classList.toggle(r)),set_attr:(e,t)=>{if(ne(t.name))e.setAttribute(t.name,t.value??"")},remove_attr:(e,t)=>{if(ne(t.name))e.removeAttribute(t.name)},toggle_attr:(e,t)=>{if(!ne(t.name))return;if(Array.isArray(t.values)){let[r,n]=t.values;e.setAttribute(t.name,e.getAttribute(t.name)===r?n:r)}else if(e.hasAttribute(t.name))e.removeAttribute(t.name);else e.setAttribute(t.name,"")},focus:(e)=>e.focus?.(),focus_first:(e)=>dr(e)?.focus?.(),blur:(e)=>{let t=e.ownerDocument?.activeElement??globalThis.document?.activeElement;if(t&&(t===e||e.contains?.(t)))t.blur?.()},show_modal:(e)=>Ze(e),close_dialog:(e)=>Mt(e),text:(e,t)=>{let r=String(t.value??"");if(e.textContent!==r)e.textContent=r},copy_media:(e,t,r)=>{let n=null;try{n=r({...t,to:t.from})[0]??null}catch{}wt(e,n)},check_group:(e,t)=>{let r=t.global?document.querySelectorAll('[data-controller~="reactive"]'):[e];for(let n of r)y("bindings",(i)=>i.checkGroup(n,t.group,t.checked))},presence:(e,t)=>y("presence",(r)=>r.set(e,t.state)),dispatch:(e,t)=>{e.dispatchEvent(new CustomEvent(t.name,{bubbles:!0,composed:!0,detail:t.detail??{}}))},submit:(e,t,r)=>{let n=ir(e);if(!n)return;let i=null;if(t?.submitter!=null&&typeof r==="function"){if(i=r({...t,to:t.submitter})[0]??null,!(i?.form===n&&(i.type==="submit"||i.type==="image")))console.warn(`[phlex-reactive] submitter ${t.submitter} is not a submit control of the form — ignored`),i=null}i?n.requestSubmit?.(i):n.requestSubmit?.()},paste_into:(e)=>or(e),preview_file:(e,t,r)=>sr(e,t,r),set_value:(e,t)=>_t(e,String(t.value??"")),persist_state:(e,t)=>y("persist",(r)=>r.writeState(e,t.state)),persist_clear:(e)=>y("persist",(t)=>t.clearRoot(e))});function ir(e){if(e?.tagName==="FORM")return e;return e?.form??e?.closest?.("form")??null}function or(e){let t=globalThis.navigator?.clipboard;if(typeof t?.readText!=="function")return;t.readText().then((r)=>{if(!r)return;e.value=r,vt(e),e.focus?.()}).catch(()=>{})}var R=new Map,N=null;function sr(e,t,r){if(e?.tagName!=="INPUT"||e.type!=="file")return te(`reads an input[type=file], not <${e?.localName}>`);let n=typeof r==="function"?r({...t,to:t.into})[0]:null;if(n?.tagName!=="IMG")return te(`paints an <img>, and ${JSON.stringify(t.into)} is ${n?`a <${n.localName}>`:"not on the page"}`);let i=[...t.valid===!0&&e.validity?.valid===!1?[]:e.files??[]],s=ar(e,t.accept),a=i.filter((d)=>typeof d?.type==="string"&&s(d)),o=a.find((d)=>d.type.startsWith("image/")),c=i.length>0&&a.length===0?"type":null;if(o&&Number.isInteger(t.max_bytes)&&o.size>t.max_bytes)c="size";let l=c==="size"?o:i[0];if(c)o=null;if(yt(n),o){let d=URL.createObjectURL(o);R.set(n,d),n.setAttribute("src",d),cr()}else n.removeAttribute("src");if(G(n),t.wrap!=null){let d=r({...t,to:t.wrap});if(d.length===0)te(`wrap: ${JSON.stringify(t.wrap)} is not on the page`);for(let h of d)o?rt(h):tt(h)}if(t.name!=null)for(let d of r({...t,to:t.name}))d.textContent=o?o.name:"";if(c)e.dispatchEvent(new CustomEvent("reactive:file-rejected",{bubbles:!0,detail:{reason:c,file:l}}))}function ar(e,t){let r=String((t===!0?e.getAttribute("accept"):typeof t==="string"&&t)||"").toLowerCase().split(",").map((n)=>n.trim()).filter(Boolean);if(r.length===0)return(n)=>n.type.startsWith("image/");return(n)=>{let i=n.type.toLowerCase();return r.some((s)=>s[0]==="."?String(n.name).toLowerCase().endsWith(s):s.endsWith("/*")?i.startsWith(s.slice(0,-1)):i===s)}}function te(e){console.warn(`[phlex-reactive] preview_file ${e} — skipped`)}function yt(e){let t=R.get(e);if(t===void 0)return;if(R.delete(e),URL.revokeObjectURL(t),R.size===0)N?.disconnect(),N=null}function cr(){if(N||typeof MutationObserver!=="function"||!document?.documentElement)return;N=new MutationObserver(()=>{for(let[e,t]of R)if(!e.isConnected||e.getAttribute("src")!==t)yt(e)}),N.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["src"]})}function vt(e){if(typeof e.dispatchEvent==="function")e.dispatchEvent(new Event("input",{bubbles:!0}))}function _t(e,t){if(!/^(input|textarea|select)$/.test(e.localName)||e.type==="file"&&t!==""){console.warn("[phlex-reactive] set_value skipped: not a field it can write",e);return}let r=qe(e);if(e.value=t,qe(e)!==r)vt(e)}function qe(e){return e.type==="select-multiple"?[...e.selectedOptions].map((t)=>t.value).join(`
6
+ `):e.value}function ur(e,t,r){if(r?.transition)Qt(e,r.transition,()=>e.hidden=t);else e.hidden=t}function re(e,t,r,n){if(ur(e,t,r),r?.expanded==null||typeof n!=="function")return;for(let i of n({...r,to:r.expanded}))i.setAttribute?.("aria-expanded",String(!t))}function ne(e){if(!bt(e))return!0;return console.warn(`[phlex-reactive] refused client attr op on ${JSON.stringify(e)} — skipped`),!1}function wt(e,t){if(e?.localName!=="img")return console.warn(`[phlex-reactive] copy_media targets an <img>, not <${e?.localName}> — skipped`),null;let r=t?.localName==="img"?t:null,n=r?.getAttribute("src"),i=!1;for(let a of["srcset","src"]){let o=n?r.getAttribute(a):null;if(o==null){if(e.hasAttribute(a))i=e.removeAttribute(a)??!0}else if(e.getAttribute(a)!==o)i=e.setAttribute(a,o)??!0}if(i)G(e);let s=r?.getAttribute("alt")??"";if(e.getAttribute("alt")!==s)e.setAttribute("alt",s);return r?s:!1}var lr='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function dr(e){return e.querySelectorAll?.(lr)?.[0]??null}function Ae(e){if(Array.isArray(e))return e;if(typeof e!=="string")return[];try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}var We=Object.freeze({backspace:"Backspace",delete:"Delete",enter:"Enter",tab:"Tab",esc:"Escape",space:" ",up:"ArrowUp",down:"ArrowDown",left:"ArrowLeft",right:"ArrowRight",home:"Home",end:"End",page_up:"PageUp",page_down:"PageDown"}),Be=Object.freeze(["meta","ctrl","alt","shift"]);function Y(e,t,r){let n=e.split("+");for(let a of Be)if(n.includes(a)!==Boolean(t[`${a}Key`]))return!1;let i=n.find((a)=>!Be.includes(a));if(i===void 0||typeof t.key!=="string")return!0;let s=r&&Object.hasOwn(r,i)?r[i]:Object.hasOwn(We,i)?We[i]:/^[a-z0-9]$/.test(i)?i:null;return typeof s==="string"&&s.toLowerCase()===t.key.toLowerCase()}var fr=(e)=>e&&typeof e==="object"?e.keys:String(e);function ie(e,t,r){let n=t.target;if(e?.inEditable!==!0&&(n?.isContentEditable||/^(input|textarea|select)$/.test(n?.localName)))return!1;let i=/[Mm]ac|iP/.test(navigator.userAgentData?.platform??navigator.platform)?"meta":"ctrl";return Y(fr(e).replace(/^mod\+/,`${i}+`),t,r)}function hr(e){if(Array.isArray(e))return[{ops:e,legacy:!0}];if(e&&typeof e==="object")return[e];if(typeof e!=="string")return[];let t=e.trim();if(t.startsWith("["))return[{ops:Ae(t),legacy:!0}];let r=[];for(let n of t.split(" ")){if(n==="")continue;let i=null;try{i=JSON.parse(n)}catch{i=null}if(i&&typeof i==="object"&&!Array.isArray(i))r.push(i);else console.warn(`[phlex-reactive] malformed on_client binding record ${JSON.stringify(n)} — skipped`)}return r}function je(e,t,r){if(e.legacy)return!0;let n=e.on;if(typeof n!=="string"||n==="")return!1;let i=n.indexOf(".");if(t.type!==(i<0?n:n.slice(0,i)))return!1;if(Boolean(e.window)!==Ee(t.currentTarget))return!1;return i<0||r===null||Y(n.slice(i+1),t,r)}function mr(e,t){let r=e.detail;if(r===void 0)return!0;if(r===null||typeof r!=="object"||Array.isArray(r))return!1;let n=t.detail;if(n===null||typeof n!=="object")return!1;return Object.keys(r).every((i)=>n[i]===r[i])}var Ue=new WeakMap;function pr(e,t,r){if(!r.once)return!1;let n=t.currentTarget??e.element,i=Ue.get(e);if(!i)i=new WeakMap,Ue.set(e,i);let s=i.get(n);if(!s)s=new Set,i.set(n,s);let a=t.params?.ops,c=(n===globalThis.window?`${typeof a==="string"?a:JSON.stringify(a??null)}|`:"")+JSON.stringify(r);if(s.has(c))return!0;return s.add(c),!1}var Je=new WeakMap;function gr(e,t){if(e===null||typeof e!=="object")return!1;let r=e.params?.ops,n=typeof r==="string"?r:JSON.stringify(r??null),i=Je.get(e);if(!i)i=new WeakMap,Je.set(e,i);let s=i.get(t);if(!s)s=new Map,i.set(t,s);let a=s.get(e.currentTarget);if(!a)a=new Set,s.set(e.currentTarget,a);if(a.has(n))return!0;return a.add(n),!1}function de(e,t,r){for(let n of e){if(!Array.isArray(n))continue;let[i,s={}]=n;if(!Object.hasOwn($e,i)){console.warn(`[phlex-reactive] unknown client op ${JSON.stringify(i)} — skipped`);continue}let a=t(s);if(a.length===0&&r)r(i,s);for(let o of a)if($e[i](o,s,t),s?.keep===!0)Qe(o,i,s,t)}}function br(e,t){let r=e.to;if(t){if(r==="@root")return[t];if(typeof r!=="string"||r==="")return[];if(e.global)return[...document.querySelectorAll(r)];return[...t.querySelectorAll(r)]}if(typeof r!=="string"||r===""||r==="@root")return[];return[...document.querySelectorAll(r)]}function yr(e){let t=e.getAttribute?.("data-reactive-persist");return Boolean(t)&&t!=="off"}function Se(e){return["defer-token","defer-src","lazy-on","lazy-visible"].some((t)=>e.getAttribute?.(`data-reactive-${t}`)!=null)}var He='[data-controller~="reactive"]',vr='[data-controller~="reactive"],[data-reactive-dormant~="reactive"]',fe=(e)=>e.getAttribute?.("data-reactive-token-value")==null&&!Se(e);function Ke(e,t,r){let n=e?.closest?.(t);while(n&&n!==r&&fe(n))n=n.parentElement?.closest?.(t);return n??null}var D=new WeakMap,q=new WeakMap;function _r(e){return(e.getAttribute?.("data-action")??"").includes("reactive#trackDirty")||e.getAttribute?.("data-reactive-clipboard")!=null||e.querySelector?.('[data-action*="reactive#trackDirty"],[data-reactive-clipboard]')!=null}function wr(e){return["show-targets","group-targets","on-complete","filter-input","tags-field"].some((t)=>e.getAttribute?.(`data-reactive-${t}`)!=null)||(e.querySelectorAll?.("[data-reactive-show-field], [data-reactive-show]")??[]).length>0||e.querySelector?.("[data-reactive-nested-json], [data-reactive-nested-list], [data-reactive-confirm-when-param], [data-reactive-enable], [data-reactive-select-all], [data-reactive-count], [data-reactive-editable], [data-reactive-media]")!=null}function Ar(e){return e.getAttribute?.("data-reactive-compute-inputs-param")!=null}function Sr(e){return Boolean(e.matches?.("[data-reactive-sortable],[data-reactive-sortable-source]")||e.querySelector?.("[data-reactive-sortable],[data-reactive-sortable-source]"))}function At(e){return e.getAttribute?.("data-reactive-presence")!=null}function Er(e){return Boolean(e.matches?.("[data-reactive-countdown]")||e.querySelector?.("[data-reactive-countdown]"))}var Tr=[["persist",[yr,null,null,!0]],["defer",[Se,null]],["form",[_r,null]],["bindings",[wr,null,null,!0]],["compute",[Ar,null,null,!0]],["sortable",[Sr,null]],["presence",[At,null]],["countdown",[Er,null]],["effects",[(e)=>["enter","update","exit"].some((t)=>e.getAttribute?.(`data-reactive-effect-${t}`)!=null),null]],["hints",[(e)=>e.querySelector?.("[data-reactive-optimistic-param], [data-reactive-busy-param], [data-reactive-loading-param]")!=null,null]],["devtools",[(e)=>e.getAttribute?.("data-reactive-debug")==="true",null]]],w=new Map(Tr),ze=new Map,p=new Map,Fr=new Map;function g(e,t,r){St.set(e,[t,r]),Lr(e)}var St=new Map;function Lr(e){let t=w.get(e),[r,n]=St.get(e);t[1]=r,t[2]=n}function Gr(e,t){t.install?.(I),p.set(e,t),Fr.set(e,t)}function Et(e){let t=[];for(let[r,[n]]of w){if(!n||p.has(r))continue;try{if(e.some((i)=>n(i)))t.push(r)}catch{}}return t}function Tt(e){return O(e).catch((t)=>z(e,"load",t))}function O(e){let t=ze.get(e);if(!t)t=(w.get(e)[1]??(()=>Promise.reject(Error("this entry has no way to import it"))))().then((n)=>(n.install?.(I),p.set(e,n),n)),ze.set(e,t);return t}var Ve=new Set;function z(e,t,r){let n=e+t;if(Ve.has(n))return;Ve.add(n),console.error(`[phlex-reactive] the "${e}" feature module (phlex/reactive/features/${e}) is unavailable: ${t}. If you bundle or vendor the client, alias or pin phlex/reactive/features/* (README: esbuild / webpack / bun).`,r)}function y(e,t){let r=p.get(e);if(r)return t(r);O(e).then(t,(n)=>z(e,"load",n))}var kr=1e4;function oe(){let e=Number(globalThis.document?.head?.querySelector?.('meta[name="phlex-reactive-feature-timeout"]')?.content);return Number.isFinite(e)&&e>0?e:kr}function Yr(){return[...w.keys()]}var Ge=Promise.resolve();function Ye(e,t,r){let n=I.waiting.get(e);if(n&&n[t]===r)delete n[t]}var I={enter:lt,exit:dt,count:mt,text:E,served:we,waiting:new WeakMap};var P=Symbol.for("phlex-reactive.early"),xr=1e4,Rr=1500,Ee=(e)=>e!=null&&(e===globalThis.window||e.window===e),Nr="dispatch";function se(){return globalThis[P]??={queue:[],connected:new WeakSet},globalThis[P]}function Or(){let e=Number(globalThis.document?.querySelector?.('meta[name="phlex-reactive-early-ttl"]')?.content);return Number.isFinite(e)&&e>0?e:xr}function Ir(e){let t={};for(let{name:r,value:n}of Array.from(e.attributes??[])){let i=/^data-reactive-(.+)-param$/i.exec(r);if(!i)continue;let s;try{s=JSON.parse(n)}catch{s=n}t[i[1].replace(/[-_]([a-z0-9])/g,(a,o)=>o.toUpperCase())]=s}return t}function Pr(e,t,r){return{[P]:!0,type:e.type,detail:e.detail,target:e.target,currentTarget:r?t.ownerDocument.defaultView:t,params:Ir(t),key:e.key,code:e.code,metaKey:e.metaKey,ctrlKey:e.ctrlKey,altKey:e.altKey,shiftKey:e.shiftKey,button:e.button,submitter:e.submitter,bubbles:e.bubbles,timeStamp:e.timeStamp,defaultPrevented:e.defaultPrevented,preventDefault(){},stopPropagation(){},stopImmediatePropagation(){}}}var V=new WeakMap;function Mr(e,{token:t,type:r,method:n,filter:i,win:s},a){let o=V.get(e);if(!o)V.set(e,o=new Map);let c=s?`${t} ${a}`:t;if(o.has(c))return!1;return o.set(c,{type:r,method:n,filter:i,win:s,params:a,armed:!0}),!0}function Xe(e,t,r,n){if(e?.[P])return!1;let i=Ee(e?.currentTarget),s=i?n:e?.currentTarget,a=Dr(e,s,i?`@${t}`:t),o=V.get(s),c=i&&JSON.stringify(e.params);for(let l of o?.values()??[]){if(!l.armed||l.method!==t||l.type!==e.type||Boolean(l.win)!==i)continue;if(i&&l.params!==c)continue;if(l.filter&&!Y(l.filter,e,r))continue;return l.armed=!1,!0}return a}var U=new WeakMap;function Cr(e,t,r){let n=U.get(e);if(!n)U.set(e,n=new Map),setTimeout(()=>U.delete(e));let i=n.get(t)??{};n.set(t,i),i[r]=(i[r]??0)+1}function Dr(e,t,r){let n=e&&U.get(e)?.get(t);if(!n?.[r])return!1;return n[r]-=1,!0}class Ft extends kt{static values={token:String};#w;#l=new Map;#d=new Map;#ne;#k;#B;#x=0;#f=new Map;#R=new WeakMap;#t;featuresReady=Ge;#r=new Map;#N=new Set;#h=!1;#n=null;#m=new Map;#A=new Map;#p=new Map;#g=0;#j;#qe=0;#We=0;connect(){if(gt=!0,se().connected.add(this.element),D.set(this.element,this),this.element.id==="")console.warn("[phlex-reactive] a reactive root has no id; its next-action token can't self-match "+"and may fall back to the first token in the response → a silent HTTP 403 on the NEXT action. "+"Put id: on the SAME element as reactive_attrs — use div(**reactive_root) (emits id + token together), "+"or div(id:, **reactive_attrs). The id: must NOT be on a child. See the README.");if(this.element.getAttribute?.("data-reactive-token-value")!=null||Se(this.element))this.#t=(e)=>{if(e.type==="focusin"?!e.target.hasAttribute?.("data-reactive-editable"):e.target!==this.element)return;if(e.type===W)this.#H();this.#U(!0)},this.element.addEventListener?.("turbo:morph-element",this.#t),this.element.addEventListener?.("focusin",this.#t),this.element.addEventListener?.(W,this.#t);this.element.querySelectorAll?.("[data-reactive-editable]").forEach(_e),this.#g++,this.featuresReady=Ge,this.#U(),J(this.element),this.#ae()}#Be(e){}#je(e,t,r,n){}#Ue(){}#Je(e,t){}#U(e){{let t=this.#g,r=[];for(let[s,[a]]of w){if(!a||this.#N.has(s))continue;let o=p.get(s);if(o&&!o.connect)continue;try{if(a(this.element))r.push(s)}catch(c){this.#b(s,"detect",c)}}if(r.length===0)return;for(let s of r)this.#N.add(s);if(!this.#h&&r.every((s)=>p.has(s))){for(let s of r)this.#O(t,s,p.get(s),e);return}for(let s of r){let a=this.#ie(t,s),o=[];for(let l of w.keys()){if(l===s)break;if(this.#p.has(l))o.push(this.#p.get(l))}let c=Promise.all(o).then(()=>a).then((l)=>l&&this.#O(t,s,l,e));if(this.#p.set(s,c),w.get(s)[3])this.#n=c}let n=this.#n;n?.then(()=>{if(this.#n===n)this.#n=null}),this.#h=!0;let i=Promise.all(this.#p.values()).then(()=>{if(this.featuresReady===i)this.#h=!1});this.featuresReady=i}}#ie(e,t){{let r=()=>e===this.#g;return this.#oe(t),new Promise((n)=>{let i=!1,s=setTimeout(()=>{if(this.#m.delete(s),i=!0,r())this.#b(t,"timeout",Error(`not loaded after ${oe()} ms`));n(null)},oe());this.#m.set(s,n);let a=()=>{clearTimeout(s),this.#m.delete(s)};O(t).then((o)=>{if(a(),i)queueMicrotask(()=>this.#O(e,t,o));else n(o)},(o)=>{if(a(),r())this.#b(t,"load",o);n(null)})})}}#oe(e){{let t=w.get(e)[2];if(!t)return;let r={};try{this.#A.set(e,[t(this.element,r),r]),I.waiting.set(this.element,{...I.waiting.get(this.element),[e]:r})}catch(n){this.#b(e,"detect",n)}}}#J(e,t){{let[r,n]=this.#A.get(e)??[];if(this.#A.delete(e),!t)Ye(this.element,e,n);try{r?.()}catch(i){console.error(`[phlex-reactive] the "${e}" feature module failed to stop waiting`,i)}return n}}#O(e,t,r,n){{if(e!==this.#g)return;let i=this.#J(t);try{r.connect?.(this,this.#e(),n,i),this.#r.set(t,r)}catch(s){this.#b(t,"connect",s)}}}#e(){return this.#j??={emit:(e,t,r)=>this.#o(e,t,r),reseed:()=>this.#H(),proceed:(e,t,r,n)=>this.#P(e,t,r,0,0,null,n),forgetToken:()=>{this.#w=void 0},owns:(e)=>this.#F(e),ownership:()=>this.#Z(),opTargets:(e)=>this.#W(e),diagnose:(e,t)=>this.#q(e,t),applyOps:(e,t)=>de(e,(r)=>this.#W(t!=null&&r.to==null?{...r,to:t}:r),(r,n)=>this.#q(`client op "${r}"`,n)),listnavOptions:(e)=>this.#v(e),collectFields:()=>this.#Q(),plain:st,text:E,served:we,copyMedia:wt,setValue:_t,confirm:(e,t)=>Promise.resolve().then(()=>Fe(e,t)).catch(()=>!1)},this.#j}#H(){this.#r.get("form")?.reseed(this),this.#r.get("bindings")?.reseed(this),this.#r.get("compute")?.seed(this)}#b(e,t,r){if(z(e,t,r),this.#i("feature"),t==="load"&&this.element.getAttribute?.("data-reactive-defer-pending"))this.element.removeAttribute("data-reactive-defer-pending"),this.element.removeAttribute("aria-busy");this.#o("reactive:error",{kind:"feature",feature:e,phase:t,error:r})}#se(){{this.#g++;for(let[t,r]of this.#m)clearTimeout(t),r(null);this.#m.clear();for(let t of[...this.#A.keys()]){let r=this.#J(t,!0),n=this.element;y(t,(i)=>{i.abandon?.(n,r),Ye(n,t,r)})}this.#N.clear(),this.#p.clear(),this.#h=!1,this.#n=null;let e=[...this.#r];this.#r.clear();for(let[t,r]of e)try{r.disconnect?.(this,this.#e())}catch(n){console.error(`[phlex-reactive] the "${t}" feature module failed to disconnect`,n)}}}#ae(){if(this.element.setAttribute?.("data-reactive-connected",""),this.element.isConnected)this.element.dispatchEvent?.(new CustomEvent("reactive:connect",{bubbles:!0,composed:!0,detail:{id:this.element.id}}));this.#ce();for(let[e,t]of q.get(this.element)??[]){if(e.currentTarget!==t)Object.defineProperty(e,"currentTarget",{value:t,configurable:!0});this.dispatch(e)}q.delete(this.element)}#I=new Set;#ce(){let{queue:e}=se();if(e.length===0)return;let t=[];for(let i=e.length-1;i>=0;i--){let{root:s}=e[i];if(s===this.element||!s.isConnected)t.unshift(...e.splice(i,1))}let r=Or(),n=new Map;for(let i of t){let s=n.get(i.event)??[new Set,new Set];n.set(i.event,s);let a=s[+!!i.win];if(a.has(i.el))continue;a.add(i.el);let o=i.win?Math.min(Rr,r):r,c=i.root!==this.element?"its root left the page before a controller connected":performance.now()-i.at>o?`it is older than the ${o} ms ${i.win?"window-trigger":"early-event"} TTL`:i.el.isConnected&&this.element.contains(i.el)?null:"its element left the root before the controller connected";if(c){if(this.#$())console.warn(`[phlex-reactive] dropped an early "${i.event.type}" trigger: ${c}`);continue}this.#ue(i)}}#ue({event:e,el:t,descs:r,win:n}){let i=Pr(e,t,n),s=this.application?.schema?.keyMappings,a=(t.getAttribute("data-action")??"").split(/\s+/),o=n?this.element:t;for(let c of r){if(!a.includes(c.token))continue;if(c.filter&&!Y(c.filter,e,s))continue;if(/#\w+.*:once\b/.test(c.token)){if(!Mr(o,c,n&&JSON.stringify(i.params)))continue;this.#I.add(o)}if(Cr(e,o,n?`@${c.method}`:c.method),c.method==="runOps")this.runOps(i);else this.dispatch(i)}}disconnect(){if(this.#se(),this.#be(),this.#ve(),this.#t)this.element.removeEventListener?.("turbo:morph-element",this.#t),this.element.removeEventListener?.("focusin",this.#t),this.element.removeEventListener?.(W,this.#t);if(se().connected.delete(this.element),D.get(this.element)===this)D.delete(this.element);this.element.removeAttribute?.("data-reactive-connected");for(let e of this.#I)V.delete(e);this.#I.clear()}dispatch(e){if(e.params?.action&&e.params.action!==Me&&this.#le())return this.#de(e);let t=e.params?.shortcut;if(t!=null&&!ie(t,e,this.application?.schema?.keyMappings))return;if(Xe(e,"dispatch",this.application?.schema?.keyMappings,this.element))return;let{action:r,params:n,debounce:i,throttle:s,confirm:a,confirmWhen:o,outside:c,window:l,optimistic:d}=e.params;if(!r)return;let h=e.params.busy??e.params.loading;if(c&&this.element.contains(e.target))return;let f=e.currentTarget??e.target;if((t!=null||!l)&&!this.#te(d,f))e.preventDefault();if(r===Me){let S=()=>{{let m=this.#r.get("defer");if(m)return m.materialize(this)}if(this.tokenValue)return this.#P(f,r,"{}")};return this.#h?this.featuresReady.then(S):S()}let b=this.#K(a,o),v=()=>this.#P(f,r,n,i,s,d,h);if(!b)return v();if(b instanceof Promise)return b.then((S)=>S?this.#S(S,f,v):v());this.#S(b,f,v)}#S(e,t,r){return Promise.resolve().then(()=>Fe(e,{el:t})).catch(()=>!1).then((n)=>{if(n)r()})}#K(e,t){if(e)return e;if(!t)return null;{let r=p.get("bindings");if(r)return r.confirmMessage(this,this.#e(),t);return this.#z("bindings").then((n)=>n&&n.confirmMessage(this,this.#e(),t))}}#z(e){{let t;return Promise.race([O(e).catch((r)=>(z(e,"load",r),null)),new Promise((r)=>t=setTimeout(()=>r(null),oe()))]).finally(()=>clearTimeout(t))}}#le(){return!this.tokenValue&&fe(this.element)}#de(e){let t=Ke(this.element.parentElement,vr);if(!t){if(this.element.closest?.('[data-reactive-verbose="true"], [data-reactive-debug="true"]'))console.warn(`[phlex-reactive] "${e.params.action}": no token on this root or above, nothing sent`);return}let r=D.get(t);if(r)return r.dispatch(e);let{shortcut:n,window:i,optimistic:s}=e.params,a=e.currentTarget??e.target;if((n!=null||!i)&&!this.#te(s,a))e.preventDefault();q.set(t,[...q.get(t)??[],[e,a]]);let o=t.dataset;if(o.reactiveDormant)o.controller=`${o.controller??""} ${o.reactiveDormant}`.trim(),delete o.reactiveDormant}runOps(e){let t=e.params?.ops;if(t?.shortcut!=null&&!ie(t.shortcut,e,this.application?.schema?.keyMappings))return;if(Xe(e,"runOps",this.application?.schema?.keyMappings,this.element))return;if(gr(e,this))return;let r=e.params??{},n=e.currentTarget??e.target,i=hr(r.ops),s=i.filter((o)=>je(o,e,null)),a=s.length<=1?s:s.filter((o)=>je(o,e,this.application?.schema?.keyMappings));if(a.length===0&&i.length>0){if(this.#$())this.#_((o)=>o.noBinding(this,e));return}for(let o of a){if(o.outside&&e[P])continue;if(!mr(o,e))continue;if(o.shortcut!=null&&!ie(o.shortcut,e,this.application?.schema?.keyMappings))continue;if(pr(this,e,o))continue;this.#fe(o.legacy?{...r,ops:o.ops,debounce:void 0,throttle:void 0}:o,e,n,i.indexOf(o))}}#fe(e,t,r,n){let{ops:i,confirm:s,confirmWhen:a,outside:o,window:c,shortcut:l}=e;if(o&&this.element.contains(t.target))return;if(l!=null||!c)t.preventDefault();let d=this.#K(s,a),h=this.#he(e,n,r,()=>this.#Ne(this.#Re(i)));if(!d)return h();if(d instanceof Promise)return d.then((f)=>f?this.#S(f,r,h):h());this.#S(d,r,h)}#he(e,t,r,n){let i=Number(e.debounce)||0,s=Number(e.throttle)||0;if(i<=0&&s<=0)return n;let a=JSON.stringify([t,e]);if(i>0)return()=>this.#V(r,a,i,n);return()=>this.#G(r,a,s,n)}recompute(e){return p.get("compute")?.recompute(this,this.#e(),e)}tagsAdd(e){if(e?.defaultPrevented)return;if(this.#v(e).some((t)=>t.hasAttribute?.("data-reactive-highlighted")))return;return this.#y("tagsAdd",e)}tagsPick(e){return this.#y("tagsPick",e)}tagsRemove(e){return this.#y("tagsRemove",e)}nestedAdd(e){return this.#y("nestedAdd",e)}nestedRemove(e){return this.#y("nestedRemove",e)}syncNestedJson(e){return p.get("bindings")?.syncNestedJson(this,this.#e(),e)}#y(e,t){{let r=p.get("bindings");if(r)return r[e](this,this.#e(),t);t?.preventDefault?.();let n={currentTarget:t?.currentTarget??null,target:t?.target??null,preventDefault(){}};return y("bindings",(i)=>i[e](this,this.#e(),n))}}trackDirty(){(this.#r.get("form")??p.get("form"))?.scan(this,this.#e())}listnavNext(e){this.#E(e,(t,r)=>t<0?0:(t+1)%r)}listnavPrev(e){this.#E(e,(t,r)=>t<0?r-1:(t-1+r)%r)}listnavFirst(e){this.#E(e,()=>0)}listnavLast(e){this.#E(e,(t,r)=>r-1)}listnavPick(e){let t=this.#v(e),r=t.findIndex((n)=>n.hasAttribute("data-reactive-highlighted"));if(r<0)return;e.preventDefault(),t[r].click()}listnavClose(e){for(let t of this.#v(e))t.removeAttribute("data-reactive-highlighted")}#E(e,t){let r=this.#v(e);if(!r.length)return;e.preventDefault();let n=this.#me(e),i=globalThis.document?.activeElement,s=n?r.findIndex((o)=>o===i||i!=null&&o.contains?.(i)):r.findIndex((o)=>o.hasAttribute("data-reactive-highlighted")),a=r[t(s,r.length)];if(n)a.focus?.();else{for(let o of r)o.removeAttribute("data-reactive-highlighted");a.setAttribute("data-reactive-highlighted","true")}a.scrollIntoView?.({block:"nearest"})}#me(e){return(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-focus-param")==="true"}#v(e){let r=(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-option-param")??this.element.getAttribute("data-reactive-listnav-option-param");if(!r)return[];let n=this.#Z();return Array.from(this.element.querySelectorAll(r)).filter((i)=>!i.hidden&&n(i))}#P(e,t,r,n,i,s,a){if(this.#o("reactive:before-dispatch",{action:t,params:this.#ee(r),element:this.element},{cancelable:!0}).defaultPrevented)return;let c=Number(n)||0;if(c>0)return this.#ge(e,c,t,r,s,a);let l=Number(i)||0;if(l>0)return this.#ye(e,l,t,r,s,a);return this.#T(t,r,s,e,a)}#T(e,t,r,n,i){let s={inverse:null,undo:[],resurrect:null},a=this.#Oe(e,n,s),o=Boolean(r||i),c=(f)=>{if(!o||!f)return;let b=this.#e();if(s.inverse=f.optimistic(this,b,r,n),s.undo.push(...f.busy(this,b,i,n)),this.#C())s.resurrect=f.resurrection(this,b,r,n)},l=p.get("hints");if(!o||l)c(l);let d=()=>this.#Se(e,t,s,a),h=()=>this.#n?this.#n.then(d):d();return this.queue=(this.queue??Promise.resolve()).then(()=>o&&!l?this.#pe().then(c).then(h):h()),this.queue}#pe(){return this.#z("hints")}#ge(e,t,r,n,i,s){this.#V(e,Nr,t,()=>this.#T(r,n,i,e,s))}#V(e,t,r,n){this.#M(e,t);let i=()=>{this.#M(e,t),n()},s=setTimeout(i,r);if(!Ee(e))e?.addEventListener?.("blur",i,{once:!0});let a=this.#l.get(e);if(!a)this.#l.set(e,a=new Map);a.set(t,{timer:s,flush:i})}#M(e,t){let r=this.#l.get(e),n=r?.get(t);if(!n)return;if(clearTimeout(n.timer),e?.removeEventListener?.("blur",n.flush),r.delete(t),r.size===0)this.#l.delete(e)}#be(){for(let[e,t]of[...this.#l])for(let r of[...t.keys()])this.#M(e,r)}#ye(e,t,r,n,i,s){return this.#G(e,r,t,()=>this.#T(r,n,i,e,s))}#G(e,t,r,n){let i=this.#d.get(e)??new Map;if(i.has(t))return;let s=setTimeout(()=>{if(i.delete(t),i.size===0)this.#d.delete(e)},r);return i.set(t,s),this.#d.set(e,i),n()}#ve(){for(let e of this.#d.values())for(let t of e.values())clearTimeout(t);this.#d.clear()}#o(e,t,{cancelable:r=!1}={}){let n=new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:r,detail:t});return(this.element.isConnected?this.element:document).dispatchEvent(n),n}#s(e,t,r,n){let i=()=>{if(!this.element.isConnected){console.warn("[phlex-reactive] retry() ignored — the reactive root left the DOM");return}return this.#T(e,t)};this.#o("reactive:error",{action:e,params:r,...n,retry:i})}#i(e){if(this.element?.isConnected===!1)return;this.element?.setAttribute?.("data-reactive-error",e)}#_e(){this.element?.removeAttribute?.("data-reactive-error")}#we(){let e=document.querySelector("[data-reactive-error-flash]");if(!e?.content)return;let t=e.getAttribute("data-reactive-error-flash")||"flash",r=document.getElementById(t);if(!r)return;r.appendChild(e.content.cloneNode(!0))}#Ae(){{let e=p.get("devtools");if(e)return e.delay();if(ct())return O("devtools").then((t)=>t.delay(),()=>{})}}#C(){return this.element?.getAttribute?.("data-reactive-debug")==="true"}#Y(){return typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now()}async#Se(e,t,r,n){let{fields:i,files:s}=this.#Q(),a=this.#ee(t),o={...i,...a},c=this.#a,l=s.length>0,d=l?this.#ke(c,e,o,s):JSON.stringify({token:c,act:e,params:o}),h=this.#C()?{action:e,paramNames:Object.keys(a),fieldNames:Object.keys(i),encoding:l?"multipart":"json",status:null,streams:[],tokenRefreshed:!1,started:this.#Y()}:null;await this.#Ae();try{if(navigator.onLine===!1){this.#c(r.inverse),this.#i("offline"),this.#s(e,t,o,{kind:"offline"});return}let f;try{let m={Accept:"text/vnd.turbo-stream.html","X-CSRF-Token":this.#De()};if(!l)m["Content-Type"]="application/json";let L=this.#$e();if(L)m["X-Pgbus-Connection"]=L;let M=At(this.element)&&document.getElementById(`reactive-presence-src-${this.element.id}`)?.getAttribute("connection-id");if(M)m["X-Reactive-Presence"]=M;let Te=Jt(this.element);if(Te)m["X-Reactive-Held"]=Te;mt("action"),f=await fetch(this.#Me(),{method:"POST",headers:m,body:d,credentials:"same-origin",signal:AbortSignal.timeout(this.#Ce())})}catch(m){if(console.error("[phlex-reactive] action error",m),this.#c(r.inverse),m?.name==="TimeoutError"||m?.name==="AbortError"){this.#i("timeout"),this.#s(e,t,o,{kind:"timeout"});return}this.#we(),this.#i("network"),this.#s(e,t,o,{kind:"network"});return}if(h)h.status=f.status;if(f.redirected){console.error("[phlex-reactive] action was redirected (auth/CSRF?) — no update applied"),this.#c(r.inverse),this.#i("redirected"),this.#s(e,t,o,{kind:"redirected",status:f.status});return}if(!f.ok){let m=await f.text();if(console.error(`[phlex-reactive] action failed: HTTP ${f.status}`,m),this.#c(r.inverse),(f.headers.get("Content-Type")||"").includes("turbo-stream")){let L=this.#X(m);if(this.#a=L??this.#a,h)this.#_((M)=>M.recordBody(h,m,L));Pe(this.element,m,!1)}this.#i("http"),this.#s(e,t,o,{kind:"http",status:f.status,body:m});return}let b=f.headers.get("Content-Type")||"";if(!b.includes("turbo-stream")){console.error(`[phlex-reactive] expected a turbo-stream, got "${b}" — no update applied`),this.#c(r.inverse),this.#i("content-type"),this.#s(e,t,o,{kind:"content-type",status:f.status});return}let v=await f.text(),S=this.#X(v);if(this.#a=S??this.#a,h)this.#_((m)=>m.recordBody(h,v,S));if(Pe(this.element,v),r.resurrect)queueMicrotask(r.resurrect);return this.#_e(),this.#o("reactive:applied",{action:e,params:o,html:v}),v}catch(f){console.error("[phlex-reactive] action error",f),this.#c(r.inverse),this.#o("reactive:error",{action:e,params:o,kind:"apply"})}finally{if(n?.(),h)this.#_((f)=>f.trace(this,{...h,ms:this.#Y()-h.started}))}}get#a(){return this.#w??this.tokenValue}set#a(e){this.#w=e}tokenValueChanged(){this.#w=void 0}#X(e){let t=this.element.id;if(!t)return e.match(/data-reactive-token-value="([^"]+)"/)?.[1];let{token:r,self:n}=this.#Ee(t),i=e.match(r);if(i)return i[1];let s=e.match(n);if(s)return s[1].match(/data-reactive-token-value="([^"]+)"/)?.[1];return}#Ee(e){let t=this.#B;if(t&&t.id===e)return t;let r=Yt(e);return this.#B={id:e,token:new RegExp(`<turbo-stream\\b[^>]*\\baction="reactive:token"[^>]*\\btarget="${r}"[^>]*\\bdata-reactive-token-value="([^"]+)"`),self:new RegExp(`<turbo-stream\\b[^>]*\\baction="(?:replace|update)"[^>]*\\btarget="${r}"[^>]*>([\\s\\S]*?)</turbo-stream>`)}}#F(e){return e.closest('[data-controller~="reactive"]')===this.element}#Z(){if(this.element.querySelectorAll('[data-controller~="reactive"]').length===0)return()=>!0;return(t)=>this.#F(t)}#Te(){let e=this.element.querySelectorAll(He);if(e.length===0||[...e].every(fe))return()=>!0;return(t)=>Ke(t,He,this.element)===this.element}#Q(){let e={},t=[],r=this.#Te(),n=[];this.element.querySelectorAll("input[name], select[name], textarea[name]").forEach((o)=>{if(!r(o))return;if(o.type==="file")for(let c of o.files??[])t.push({name:o.name,file:c,multiple:o.multiple});else n.push(o)});let i=[];this.element.querySelectorAll(`[name]${tr}`).forEach((o)=>{if(r(o))i.push(o)});let s=this.#Fe(n),a=this.#Le(n);for(let o of n)if(s.has(o.name)){let c=e[o.name]??(e[o.name]=[]);if(o.type==="checkbox"||o.type==="radio"){if(o.checked)c.push(o.value)}else if(o.type==="hidden"){if(!a.has(o.name))c.push(o.value)}else if(o.multiple&&o.options){for(let l of o.options)if(l.selected)c.push(l.value)}else c.push(o.value)}else if(o.type==="checkbox")e[o.name]=o.checked;else if(o.type==="radio"){if(o.checked)e[o.name]=o.value}else e[o.name]=o.value;return i.forEach((o)=>{let c=o.getAttribute("name");if(!c)return;let l=o.getAttribute("data-reactive-editable")!=null?E(o):o.value??o.textContent??o.innerHTML??"",d=e[c];if(String(c).endsWith("[]")&&!nr(o))return;if(String(c).endsWith("[]")&&(d===void 0||Array.isArray(d))){(Array.isArray(d)?d:e[c]=[]).push(l);return}if(d==null||d==="")e[c]=l}),{fields:e,files:t}}#Fe(e){let t=new Set;for(let r of e){if(r.type==="radio")continue;if(String(r.name).endsWith("[]"))t.add(r.name)}return t}#Le(e){let t=new Set;for(let r of e)if(r.type==="checkbox")t.add(r.name);return t}#ke(e,t,r,n){let i=new FormData;i.append("token",e),i.append("act",t);let s=[];for(let[o,c]of Object.entries(r))if(Array.isArray(c)&&String(o).endsWith("[]"))if(c.length===0)s.push(String(o).slice(0,-2));else{let l=`${this.#L(o)}[]`;for(let d of c)i.append(l,String(d))}else this.#D(i,this.#L(o),c);for(let o of s)i.append("empty_groups[]",o);let a=this.#xe(n);for(let{name:o,file:c,multiple:l}of n){let h=l||a.has(o)?`${this.#L(o)}[]`:this.#L(o);i.append(h,c,c.name)}return i}#L(e){let t=String(e),r=t.indexOf("[");if(r===-1)return`params[${t}]`;return`params${[t.slice(0,r),...t.slice(r).match(/[^\[\]]+/g)??[]].map((i)=>`[${i}]`).join("")}`}#D(e,t,r){if(r==null)e.append(t,"");else if(Array.isArray(r))r.forEach((n,i)=>this.#D(e,`${t}[${i}]`,n));else if(typeof r==="object")for(let[n,i]of Object.entries(r))this.#D(e,`${t}[${n}]`,i);else e.append(t,String(r))}#xe(e){let t=new Map;for(let{name:r}of e)t.set(r,(t.get(r)??0)+1);return new Set([...t].filter(([,r])=>r>1).map(([r])=>r))}#ee(e){if(!e)return{};try{return typeof e==="string"?JSON.parse(e):e}catch{return{}}}#Re(e){return Ae(e)}#Ne(e){de(e,(t)=>this.#W(t),(t,r)=>this.#q(`client op "${t}"`,r))}#$(){return this.element?.getAttribute?.("data-reactive-verbose")==="true"||this.#C()}#q(e,t){if(!this.#$())return;this.#_((r)=>r.diagnose(this,e,t))}#_(e){y("devtools",e)}#W(e){let t=e.to;if(t==="@root")return[this.element];if(typeof t!=="string"||t==="")return[];if(e.global)return[...document.querySelectorAll(t)];return[...this.element.querySelectorAll(t)].filter((r)=>this.#F(r))}#te(e,t){if(e?.checked!=="keep")return!1;let r=t?.type;return r==="checkbox"||r==="radio"}#c(e){if(!e)return;if(!this.element.isConnected)return;for(let t of e)t()}#Oe(e,t,r){this.#Ie(e,t),lt();let n=!1;return()=>{if(n)return;n=!0,this.#Pe(e,t),dt();for(let i of r.undo)i()}}#Ie(e,t){if(this.#u(t,e,1),this.#u(this.element,e,1),this.#f.set(e,(this.#f.get(e)??0)+1),this.#x++===0)this.element.setAttribute("aria-busy","true");for(let r of this.#re(e))this.#u(r,e,1)}#Pe(e,t){this.#u(t,e,-1),this.#u(this.element,e,-1);let r=(this.#f.get(e)??1)-1;if(r<=0)this.#f.delete(e);else this.#f.set(e,r);if(--this.#x<=0)this.#x=0,this.element.removeAttribute("aria-busy");for(let n of this.#re(e))this.#u(n,e,-1)}#u(e,t,r){if(!e||typeof e.getAttribute!=="function")return;let n=this.#R.get(e)??new Map,i=(n.get(t)??0)+r;if(i<=0)n.delete(t);else n.set(t,i);if(n.size===0){this.#R.delete(e),e.removeAttribute("data-reactive-busy");return}this.#R.set(e,n),e.setAttribute("data-reactive-busy",[...n.keys()].join(" "))}#re(e){return[...this.element.querySelectorAll?.("[data-reactive-busy-on]")??[]].filter((r)=>r.getAttribute("data-reactive-busy-on")===e&&this.#F(r))}#Me(){return this.#ne??=document.querySelector('meta[name="phlex-reactive-action-path"]')?.content||"/reactive/actions"}#Ce(){if(this.#k!=null)return this.#k;let e=document.querySelector('meta[name="phlex-reactive-timeout"]')?.content,t=Number(e);return this.#k=Number.isFinite(t)&&t>0?t:30000}#De(){return document.querySelector('meta[name="csrf-token"]')?.content??""}#$e(){return document.querySelector("pgbus-stream-source[connection-id]")?.getAttribute("connection-id")||document.querySelector('meta[name="pgbus-connection-id"]')?.content||null}}if(typeof window<"u")if(window.Turbo)De();else document.addEventListener("turbo:load",De,{once:!0});g("persist",()=>import("phlex/reactive/features/persist"),$r);g("defer",()=>import("phlex/reactive/features/defer"));g("form",()=>import("phlex/reactive/features/form"));g("bindings",()=>import("phlex/reactive/features/bindings"));g("compute",()=>import("phlex/reactive/features/compute"),qr);g("sortable",()=>import("phlex/reactive/features/sortable"));g("presence",()=>import("phlex/reactive/features/presence"));g("countdown",()=>import("phlex/reactive/features/countdown"));g("effects",()=>import("phlex/reactive/features/effects"));g("hints",()=>import("phlex/reactive/features/hints"));g("devtools",()=>import("phlex/reactive/features/devtools"));ve();function $r(e,t){let r=()=>{t.edited=!0},n=(s)=>{let a=s.target;if(s.detail?.success&&a?.tagName==="FORM"&&a.contains?.(e))t.submitted=!0},i=["input","change","lexxy:change","trix-change"];for(let s of i)e.addEventListener?.(s,r);return document.addEventListener("turbo:submit-end",n),()=>{for(let s of i)e.removeEventListener?.(s,r);document.removeEventListener("turbo:submit-end",n)}}function qr(e,t){let r=()=>{t.edited=!0};return e.addEventListener?.("input",r),e.addEventListener?.("change",r),()=>{e.removeEventListener?.("input",r),e.removeEventListener?.("change",r)}}var Wr=1000,F=null,Lt,X=new Set;function Br(e){return Tt(e).then((t)=>{if(e!=="effects")return;Lt=t,t?.sweep()})}ot((e,t)=>{let r=e.detail,n=r?.render;if(typeof n!=="function")return;let i=r.newStream??e.target,s=Et(jr(i)).filter((o)=>!X.has(o));if(!t&&!X.has("effects")&&Ur(i))s.push("effects");if(s.length===0&&!F)return t?.wrap(e);if(s.length>0){for(let c of s)X.add(c);let o=F=Promise.race([Promise.all([F,...s.map(Br)]),new Promise((c)=>setTimeout(c,Wr))]).then(()=>{if(F!==o)return;F=null,X.clear()})}let a=F;r.render=async(o)=>{await a;let c={target:e.target,detail:{newStream:r.newStream,render:n}};(t??Lt)?.wrap(c),await c.detail.render(o)}});function jr(e){let t=e?.querySelector?.("template")?.content;if(!t)return[];let r=[...t.querySelectorAll?.('[data-controller~="reactive"]')??[]];for(let n of t.children??[])if(n.matches?.('[data-controller~="reactive"]')&&!r.includes(n))r.unshift(n);return r.push(t),r}function Ur(e){return Boolean(e?.hasAttribute?.("data-reactive-effect")||document.getElementById?.(e?.getAttribute?.("target"))?.matches?.("[data-reactive-effect-update],[data-reactive-effect-exit]")||e?.querySelector?.("template")?.content?.querySelector?.("[data-reactive-effect-enter],[data-reactive-dismiss-after]")||document.querySelector?.("[data-reactive-dismiss-after]:not([data-reactive-dismiss-scheduled])"))}var rn=Ft;export{ut as ACTIVE_ATTR,tr as EDITOR_SELECTOR,rr as EDITOR_TAGS,ht as REQUESTS_ATTR,Xt as checkReactiveRegistration,mt as countReactiveRequest,rn as default,E as editableValue,lt as enterReactiveActivity,Yt as escapeRegExp,dt as exitReactiveActivity,Tt as loadReactiveFeature,ot as onReactiveStreamWithoutEffects,zr as reactiveActivityCount,Yr as reactiveFeatureNames,De as registerReactiveActions,Ot as registerReactiveDefer,ve as registerReactiveDev,It as registerReactiveDismiss,It as registerReactiveEffects,Gr as registerReactiveFeature,g as registerReactiveFeatureLoader,qt as registerReactiveImageFallback,Nt as registerReactiveJs,$t as registerReactiveKeep,Dt as registerReactiveModals,Bt as registerReactiveMorphFocus,Kt as registerReactiveOffline,Wt as registerReactivePlaintext,It as registerReactiveStreamRender,Rt as registerReactiveToken,xt as registerReactiveVisit,Vr as resetReactiveActivity,we as serverText,Et as unloadedFeaturesFor};
7
7
 
8
- //# debugId=6910A0CAAAD8BBBF64756E2164756E21
8
+ //# debugId=5538221910F6A13C64756E2164756E21
9
9
  //# sourceMappingURL=core.min.js.map