phlex-reactive 0.15.4 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd638899f7bcd09bffdd26692f13bf1b8e22ec2e3ceadf614e337edd03459ed5
4
- data.tar.gz: fefc53fbdf9f3e36405a2665c23fff709230405e944107e0d0ed946ee31de392
3
+ metadata.gz: bb2e7841a38e3400b1777833cde2f16a73794b54c29f9e0ceb1a2b02c358263d
4
+ data.tar.gz: 8023c8ab7f9bb88833282c33c99a7797f565fb491795cf9b0c7566d0040653ef
5
5
  SHA512:
6
- metadata.gz: d9bbd2c39abf405afd5e68ce8ad231a62c75a9af578db96315bb716184107846a5d2fe031a58f968a2bf62fa25b9aeb9f82937276f8170324a9e43c1cc1f853d
7
- data.tar.gz: 4981aaaa21ceba8bef392dae7d7beaf433ed8a0ac81de38931198a8ef1e0a3e75ed243592aefbf27965f81b593d2a3398404a2486759a3da073466a2928a04f9
6
+ metadata.gz: 5257d059749e070f6b7e369e89c06fbca8b5c6b0cb9d6663b7983081a9af5a7831ba7f4d46b01da97d04a49f5fe727b6d760351f449d140e4ccffb2881cfd7c3
7
+ data.tar.gz: 0e29f1ca596e632855b89c9dacf2b1e0e4b6fc0db3f836f662d61c8349c0fbda0f11ebb706fe165acfcfb4ed9fbcd4d630154db8f25c023b8d7ce547dbaf9cab
data/CHANGELOG.md CHANGED
@@ -403,6 +403,22 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
403
403
 
404
404
  ### Fixed
405
405
 
406
+ - **A server trigger inside a client-only root reaches the component around it
407
+ (#410).** A `ClientBindings` component (a `reactive_filter` list, a
408
+ `reactive_show` wrapper, an `on_client` menu) renders a root with no token.
409
+ Rendered inside a server component, it swallowed that component's `on(...)`
410
+ triggers: Stimulus sends the action to the nearest root, which had no token,
411
+ and the outer root's field collection skipped every control under it (the
412
+ #15 rule). A tokenless client-only root is now transparent to server round
413
+ trips: `dispatch` forwards to the nearest token-bearing root above (skipping
414
+ further client-only roots, waking a dormant one), and that root's action
415
+ collects the controls under nested client-only roots. A nested server
416
+ component keeps its own fields and triggers, and client bindings stay on
417
+ their own root. With no token-bearing root above, nothing is sent, and
418
+ `verbose_errors`/debug logs one warning. Lazy and deferred shells are not
419
+ client-only. Client: +414 B gzipped in the default bundle, +415 B in the
420
+ split core.
421
+
406
422
  - **`reactive_media` waits for `take` characters before calling a key a miss
407
423
  (#380).** A value shorter than `take:` sliced to a short key, missed the
408
424
  pool and wrote `blank_label` while the user was still typing. It is now
data/README.md CHANGED
@@ -904,6 +904,17 @@ named inputs, never a nested component's. An invoice editor's `save` sees its
904
904
  flat fields; each line-item row's `quantity`/`price` belong to that row's own
905
905
  action. No name-disjointness workarounds required.
906
906
 
907
+ A **client-only** helper (a `Phlex::Reactive::ClientBindings` component: a
908
+ `reactive_filter` list, a `reactive_show` wrapper) is the exception. Its root
909
+ has no token and no action, so it is transparent to server round trips: an
910
+ `on(...)` trigger inside it dispatches on the nearest server component above,
911
+ and that component's actions collect the controls inside it. Wrap a long
912
+ checkbox list in a searchable helper and its boxes still post to the form
913
+ around it (#410). The helper's own bindings stay on the helper's root. A
914
+ lazy or deferred shell (`reactive_lazy`, `reply.defer`) is never treated as
915
+ client-only, with or without a token: it is a server component still loading,
916
+ so it stays a boundary.
917
+
907
918
  **Debounced triggers (live-as-you-type).** Pass `debounce:` (milliseconds) to
908
919
  coalesce rapid events — typically keystrokes on an `"input"` trigger — into a
909
920
  single action round trip fired after the quiet period, instead of one POST per
@@ -1,9 +1,9 @@
1
- import{Controller as At}from"@hotwired/stimulus";import{confirmResolver as Ae}from"phlex/reactive/confirm";function St(){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 Et(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:token"])return;e["reactive:token"]=function(){let t=this.getAttribute("data-reactive-token-value"),n=this.getAttribute("target");if(!t||!n)return;let r=document.getElementById(n);if(r)r.setAttribute("data-reactive-token-value",t)}}function Tt(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:js"])return;e["reactive:js"]=function(){let t=ve(this.getAttribute("data-reactive-ops"));if(!t.length)return;let n=this.getAttribute("target"),r=this.getAttribute("data-reactive-verbose")==="true",i=n?document.getElementById(n):null;if(n&&!i){if(r)y("devtools",(s)=>s.missingRoot(n));return}ue(t,(s)=>hn(s,i),r?(s,a)=>y("devtools",(o)=>o.diagnoseStream(s,a,i)):void 0)}}function Ft(){let e=window.Turbo?.StreamActions;if(!e||e["reactive:defer"])return;e["reactive:defer"]=function(){y("defer",(t)=>t.streamAction(this))}}var Se=!1,oe=null;function Lt(){if(Se)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Se=!0,document.addEventListener("turbo:before-stream-render",(e)=>{if(qt(e),kt(e),Nt(e),oe)oe(e,p.get("effects"));else p.get("effects")?.wrap(e)})}var D="reactive:streamed";function kt(e){let t=e.detail,n=t?.render,r=t?.newStream??e.target,i=r?.getAttribute?.("action"),s=/^(append|prepend|update)$/.test(i);if(typeof n!=="function"||!(s||/^(before|after|replace)$/.test(i)))return;let a=r.getAttribute("target"),o=r.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 n(l);for(let d of c)if(d.isConnected)d.dispatchEvent(new Event(D))}}function le(e){return e?.tagName==="DIALOG"&&typeof e.showModal==="function"}function de(e){try{return e.matches(":modal")}catch{return!1}}function He(e){if(!le(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||de(e))return;if(e.open)e.close();e.showModal()}function xt(e){if(le(e)&&e.open)e.close()}function j(e){let n=[...e?.querySelectorAll?.("dialog[data-reactive-modal]")??[]];if(e?.matches?.("dialog[data-reactive-modal]"))n.push(e);for(let r of n)if(r.open&&!de(r))He(r)}function Nt(e){let t=e.detail,n=t?.render,r=t?.newStream??e.target;if(typeof n!=="function"||!r?.querySelector?.("template")?.content?.querySelector?.("dialog"))return;t.render=async(i)=>{await n(i),j(document)}}var Ee=!1;function Rt(){if(Ee)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Ee=!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 n=t.target,r=t.detail?.newElement;if(!le(n)||!r)return;if(r.hasAttribute?.("open"))e.delete(n);else e.add(n)}),document.addEventListener("turbo:before-morph-attribute",(t)=>{let{target:n,detail:r}=t;if(r?.attributeName!=="open"||r.mutationType!=="remove")return;if(!e.has(n)||!n.open||!de(n))return;e.delete(n),t.preventDefault(),n.close()})}var se=new WeakMap;function Ke(e,t,n,r){let i=se.get(e)??new Map;se.set(e,i);let s=(a,o)=>{i.delete(a),i.set(a,o)};if(t.endsWith("_class"))for(let a of n.classes??[])s(`.${a}`,e.classList.contains(a));else if(t.endsWith("_attr"))lt(n.name)||s(n.name,e.getAttribute(n.name));else if(t==="show"||t==="hide"||t==="toggle"){if(s("hidden",e.getAttribute("hidden")),n.expanded!=null)for(let a of r({...n,to:n.expanded}))Ke(a,"set_attr",{name:"aria-expanded"})}}var Te=!1;function It(){if(Te)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;Te=!0,document.addEventListener("turbo:morph-element",(e)=>{let t=e.target;for(let[n,r]of se.get(t)??[])if(n[0]===".")t.classList.toggle(n.slice(1),r);else if(r==null)t.removeAttribute(n);else if(t.getAttribute(n)!==r)t.setAttribute(n,r)})}var ze="data-reactive-image-fallback",k="data-reactive-image-state",ae="data-reactive-image-hidden",Y=null,ce="data-reactive-wrap-hidden";function Ve(e){if(e.hasAttribute("hidden"))return;e.setAttribute("hidden",""),e.setAttribute(ce,"")}function Ge(e){if(!e.hasAttribute(ce))return;e.removeAttribute("hidden"),e.removeAttribute(ce)}function x(e){if(e?.localName!=="img")return null;let t=e.getAttribute(ze);if(t==null)return null;try{return JSON.parse(t)||{}}catch{return{}}}var Ye=(e)=>e.getAttribute("src")||e.getAttribute("srcset");function fe(e,t){if(typeof t!=="string"||!t)return null;try{return e.closest('[data-controller~="reactive"]')?.querySelector(t)??null}catch{return null}}function Xe(e,t){let n=fe(e,t.alt);return n&&!n.contains(e)?n:null}function U(e,t,n){if(n==="error"){if(t.hide&&!e.hasAttribute("hidden"))e.setAttribute("hidden",""),e.setAttribute(ae,"");if(t.wrap){let i=fe(e,t.wrap);if(i)Ve(i);else console.warn(`[phlex-reactive] reactive_image_fallback wrap: ${JSON.stringify(t.wrap)} is not in the root — skipped`)}let r=Xe(e,t);if(r)r.textContent=e.getAttribute("alt")??"",r.hidden=!1}else z(e,t);e.setAttribute(k,n)}function z(e,t=x(e)){if(!t||e.getAttribute(k)==null)return;if(e.getAttribute(k)==="error"){if(e.hasAttribute(ae))e.removeAttribute("hidden");let n=fe(e,t.wrap);if(n)Ge(n);let r=Xe(e,t);if(r)r.hidden=!0}e.removeAttribute(k),e.removeAttribute(ae)}function Fe(e){let t=e.target,n=x(t);if(!n)return;if(e.type==="load")U(t,n,"loaded");else if(Ye(t))U(t,n,"error");else z(t,n)}function Pt(){if(Y)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;let e=new WeakMap;Y={error:Fe,load:Fe,"turbo:before-morph-element":(t)=>{let n=t.target,r=t.detail?.newElement,i=n?.getAttribute?.(k);if(i==null||!r||!x(n))return;let s=(a)=>n.getAttribute(a)===r.getAttribute?.(a);if(s("src")&&s("srcset"))e.set(n,i)},"turbo:morph-element":(t)=>{let n=t.target,r=e.get(n);if(r===void 0)return;e.delete(n),queueMicrotask(()=>{let i=x(n);if(i)U(n,i,r)})}};for(let[t,n]of Object.entries(Y))document.addEventListener(t,n,!0);for(let t of document.querySelectorAll?.(`img[${ze}]`)??[]){if(!t.complete||!Ye(t))continue;let n=`${t.getAttribute("src")} ${t.getAttribute("srcset")}`,r=(i)=>`${t.getAttribute("src")} ${t.getAttribute("srcset")}`===n&&U(t,x(t)??{},i);if(t.naturalWidth>0)r("loaded");else if(typeof t.decode==="function")t.decode().then(()=>r("loaded"),()=>r("error"));else r("error")}}function Ze(e){oe=e}var C,X=null,Le="[data-reactive-editable][contenteditable=plaintext-only]";function Qe(){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?.(Le))e.setAttribute("contenteditable","true");e.querySelectorAll?.(Le).forEach(q)}function Ot(){if(X||typeof document>"u"||typeof document.createElement!=="function")return;if(Qe())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 ke=!1;function xe(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 Mt(){if(ke)return;if(typeof document>"u"||typeof document.addEventListener!=="function")return;ke=!0,document.addEventListener("turbo:before-morph-element",(e)=>{let t=e.target,n=e.detail?.newElement;if(!n||e.defaultPrevented)return;let r=xe(t);if(r)Dt(t,n);if(t.hasAttribute?.("data-reactive-editable")){if(J.set(t,E(n)),!r)return;for(let{name:s}of[...t.attributes])if(!n.hasAttribute(s)&&s!=="contenteditable"&&s!==_)t.removeAttribute(s);for(let{name:s,value:a}of n.attributes)if(s!=="contenteditable"&&t.getAttribute(s)!==a)t.setAttribute(s,a);return e.preventDefault()}if(t.localName!=="input"||!r)return;let i=n.getAttribute("value");if(i==null)t.removeAttribute("value");else if(t.getAttribute("value")!==i)t.setAttribute("value",i)}),document.addEventListener("focusin",(e)=>be(e.target)),document.addEventListener("turbo:before-morph-attribute",(e)=>{let t=e.detail?.attributeName;if((t==="value"||t===_)&&xe(e.target))e.preventDefault()}),document.addEventListener("input",(e)=>{let t=e.target;if(t?.hasAttribute?.(_)&&me(t)===pe(t))t.removeAttribute(_)})}var _="data-reactive-held",he='[data-controller~="reactive"]',W=null,T=new Map;function me(e){return e.hasAttribute("data-reactive-editable")?E(e):e.value}function pe(e){return e.hasAttribute("data-reactive-editable")?ye(e):e.defaultValue}function Ct(e){if(e.hasAttribute("data-reactive-editable"))return E(e);return e.localName==="textarea"?e.textContent:e.getAttribute("value")??""}function Dt(e,t){let n=e.getAttribute("name");if(!n||/^(checkbox|radio)$/.test(e.type)||T.has(e.closest(he)))return;let r=Ct(t);if(r===me(e))return e.removeAttribute(_);if(r===pe(e))return;e.setAttribute(_,""),e.dispatchEvent(new CustomEvent("reactive:held",{bubbles:!0,detail:{name:n,theirs:r}}))}function $t(e){let t=[];for(let n of e.querySelectorAll(`[${_}]`)){if(n.closest(he)!==e)continue;let r=n.getAttribute("name");if(me(n)===pe(n))n.removeAttribute(_);else if(r&&!t.includes(r))t.push(r)}if(t.length===0)return null;return JSON.stringify(t).replace(/[\u007f-￿]/g,(n)=>`\\u${n.charCodeAt(0).toString(16).padStart(4,"0")}`)}function et(e){for(let t of e.querySelectorAll(`[${_}]`))if(t.closest(he)===e)t.removeAttribute(_)}function Ne(e,t,n=!0){let r={root:e,streams:0,release:n},i=W;W=r;try{window.Turbo.renderStreamMessage(t)}finally{W=i}if(n&&r.streams===0)et(e)}function qt(e){let t=W,n=e.detail,r=n?.render;if(!t||typeof r!=="function")return;t.streams++,n.render=async(i)=>{T.set(t.root,(T.get(t.root)||0)+1);try{return await r(i)}finally{let s=T.get(t.root)-1;if(s)T.set(t.root,s);else T.delete(t.root);if(t.release)et(t.root)}}}var Wt="__materialize",Re=!1;function Bt(){if(Re)return;if(typeof window>"u"||typeof document>"u")return;if(typeof window.addEventListener!=="function")return;Re=!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 jt="phlex-reactive:latency";function tt(){return typeof sessionStorage<"u"&&Boolean(sessionStorage.getItem(jt))}function ge(){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||tt())y("devtools",(t)=>e&&t.attach())}var nt="data-reactive-active",A=0;function rt(){if(A++,A===1)ot("reactive:busy")}function it(){if(A===0)return;if(A--,A===0)ot("reactive:idle")}function jn(){return A}function Un(){A=0,(typeof document<"u"?document.documentElement:null)?.removeAttribute?.(nt)}function ot(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.toggleAttribute==="function")t.toggleAttribute(nt,A>0);if(typeof document.dispatchEvent==="function"&&typeof CustomEvent==="function")document.dispatchEvent(new CustomEvent(e,{detail:{count:A}}))}var st="data-reactive-requests";function at(e){if(typeof document>"u")return;let t=document.documentElement;if(typeof t?.setAttribute!=="function"||!Ut(t))return;let n=Jt(t);n[e]=(Number(n[e])||0)+1,t.setAttribute(st,JSON.stringify(n))}function Ut(e){return e.hasAttribute?.("data-reactive-verbose")||!!document.querySelector?.('[data-reactive-verbose="true"]')}function Jt(e){try{let t=JSON.parse(e.getAttribute(st));if(t&&typeof t==="object")return{action:0,defer:0,...t}}catch{}return{action:0,defer:0}}function Ie(){St(),Et(),Tt(),Ft(),Lt(),Mt(),Rt(),It(),Pt(),Ot(),Bt(),ge()}function Ht(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var ct=Symbol.for("phlex-reactive.core");if(globalThis[ct])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[ct]=!0;var ut=!1;function Kt(){if(ut)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(Kt,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 lt(e){let t=String(e).toLowerCase();return t.startsWith("on")||zt.has(t)}var Z=new WeakMap;function Vt(e,t,n){let[r,i,s]=t;Z.get(e)?.(),e.classList.add(r,i),n();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,Z.delete(e),clearTimeout(l),globalThis.cancelAnimationFrame?.(o),e.removeEventListener("animationend",c),e.removeEventListener("transitionend",c),e.classList.remove(r,i,s)};Z.set(e,c),e.addEventListener("animationend",c),e.addEventListener("transitionend",c);let l=setTimeout(c,Gt(e))}function Gt(e){let t=0;try{let n=getComputedStyle(e);for(let r of["transition","animation"]){let[i,s]=["Duration","Delay"].map((o)=>String(n[r+o]).split(",").map((c)=>parseFloat(c)*(/ms/.test(c)?1:1000)||0)),a=String(n[r+"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 Yt=":is(lexxy-editor, trix-editor, [contenteditable=''], [contenteditable=true], [contenteditable=plaintext-only])",Xt=new Set(["lexxy-editor","trix-editor"]);function E(e){let t="",n=!1,r=(s)=>{if(n&&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
- `;n=!1,t+=s},i=(s)=>{for(let a of s.childNodes){let o=/^(div|p|li)$/.test(a.localName);if(o)n=!0;if(a.nodeType===3)a.data&&r(a.data);else if(a.localName==="br")r(`
4
- `);else if(a.nodeType===1)i(a);if(o)n=!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 be(e){if(e?.hasAttribute?.("data-reactive-editable")&&!J.has(e))J.set(e,E(e))}function ye(e){return be(e),J.get(e)}function Zt(e){return Xt.has(e.localName)?typeof e.value==="string":!0}var Pe=Object.freeze({show:(e,t,n)=>ee(e,!1,t,n),hide:(e,t,n)=>ee(e,!0,t,n),toggle:(e,t,n)=>ee(e,!e.hidden,t,n),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((n)=>e.classList.toggle(n)),set_attr:(e,t)=>{if(te(t.name))e.setAttribute(t.name,t.value??"")},remove_attr:(e,t)=>{if(te(t.name))e.removeAttribute(t.name)},toggle_attr:(e,t)=>{if(!te(t.name))return;if(Array.isArray(t.values)){let[n,r]=t.values;e.setAttribute(t.name,e.getAttribute(t.name)===n?r:n)}else if(e.hasAttribute(t.name))e.removeAttribute(t.name);else e.setAttribute(t.name,"")},focus:(e)=>e.focus?.(),focus_first:(e)=>an(e)?.focus?.(),blur:(e)=>{let t=e.ownerDocument?.activeElement??globalThis.document?.activeElement;if(t&&(t===e||e.contains?.(t)))t.blur?.()},show_modal:(e)=>He(e),close_dialog:(e)=>xt(e),text:(e,t)=>{let n=String(t.value??"");if(e.textContent!==n)e.textContent=n},copy_media:(e,t,n)=>{let r=null;try{r=n({...t,to:t.from})[0]??null}catch{}mt(e,r)},check_group:(e,t)=>{let n=t.global?document.querySelectorAll('[data-controller~="reactive"]'):[e];for(let r of n)y("bindings",(i)=>i.checkGroup(r,t.group,t.checked))},presence:(e,t)=>y("presence",(n)=>n.set(e,t.state)),dispatch:(e,t)=>{e.dispatchEvent(new CustomEvent(t.name,{bubbles:!0,composed:!0,detail:t.detail??{}}))},submit:(e,t,n)=>{let r=Qt(e);if(!r)return;let i=null;if(t?.submitter!=null&&typeof n==="function"){if(i=n({...t,to:t.submitter})[0]??null,!(i?.form===r&&(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?r.requestSubmit?.(i):r.requestSubmit?.()},paste_into:(e)=>en(e),preview_file:(e,t,n)=>tn(e,t,n),set_value:(e,t)=>ht(e,String(t.value??"")),persist_state:(e,t)=>y("persist",(n)=>n.writeState(e,t.state)),persist_clear:(e)=>y("persist",(t)=>t.clearRoot(e))});function Qt(e){if(e?.tagName==="FORM")return e;return e?.form??e?.closest?.("form")??null}function en(e){let t=globalThis.navigator?.clipboard;if(typeof t?.readText!=="function")return;t.readText().then((n)=>{if(!n)return;e.value=n,ft(e),e.focus?.()}).catch(()=>{})}var N=new Map,R=null;function tn(e,t,n){if(e?.tagName!=="INPUT"||e.type!=="file")return Q(`reads an input[type=file], not <${e?.localName}>`);let r=typeof n==="function"?n({...t,to:t.into})[0]:null;if(r?.tagName!=="IMG")return Q(`paints an <img>, and ${JSON.stringify(t.into)} is ${r?`a <${r.localName}>`:"not on the page"}`);let i=[...t.valid===!0&&e.validity?.valid===!1?[]:e.files??[]],s=nn(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(dt(r),o){let d=URL.createObjectURL(o);N.set(r,d),r.setAttribute("src",d),rn()}else r.removeAttribute("src");if(z(r),t.wrap!=null){let d=n({...t,to:t.wrap});if(d.length===0)Q(`wrap: ${JSON.stringify(t.wrap)} is not on the page`);for(let h of d)o?Ge(h):Ve(h)}if(t.name!=null)for(let d of n({...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 nn(e,t){let n=String((t===!0?e.getAttribute("accept"):typeof t==="string"&&t)||"").toLowerCase().split(",").map((r)=>r.trim()).filter(Boolean);if(n.length===0)return(r)=>r.type.startsWith("image/");return(r)=>{let i=r.type.toLowerCase();return n.some((s)=>s[0]==="."?String(r.name).toLowerCase().endsWith(s):s.endsWith("/*")?i.startsWith(s.slice(0,-1)):i===s)}}function Q(e){console.warn(`[phlex-reactive] preview_file ${e} — skipped`)}function dt(e){let t=N.get(e);if(t===void 0)return;if(N.delete(e),URL.revokeObjectURL(t),N.size===0)R?.disconnect(),R=null}function rn(){if(R||typeof MutationObserver!=="function"||!document?.documentElement)return;R=new MutationObserver(()=>{for(let[e,t]of N)if(!e.isConnected||e.getAttribute("src")!==t)dt(e)}),R.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["src"]})}function ft(e){if(typeof e.dispatchEvent==="function")e.dispatchEvent(new Event("input",{bubbles:!0}))}function ht(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 n=Oe(e);if(e.value=t,Oe(e)!==n)ft(e)}function Oe(e){return e.type==="select-multiple"?[...e.selectedOptions].map((t)=>t.value).join(`
6
- `):e.value}function on(e,t,n){if(n?.transition)Vt(e,n.transition,()=>e.hidden=t);else e.hidden=t}function ee(e,t,n,r){if(on(e,t,n),n?.expanded==null||typeof r!=="function")return;for(let i of r({...n,to:n.expanded}))i.setAttribute?.("aria-expanded",String(!t))}function te(e){if(!lt(e))return!0;return console.warn(`[phlex-reactive] refused client attr op on ${JSON.stringify(e)} — skipped`),!1}function mt(e,t){if(e?.localName!=="img")return console.warn(`[phlex-reactive] copy_media targets an <img>, not <${e?.localName}> — skipped`),null;let n=t?.localName==="img"?t:null,r=n?.getAttribute("src"),i=!1;for(let a of["srcset","src"]){let o=r?n.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)z(e);let s=n?.getAttribute("alt")??"";if(e.getAttribute("alt")!==s)e.setAttribute("alt",s);return n?s:!1}var sn='a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex="-1"])';function an(e){return e.querySelectorAll?.(sn)?.[0]??null}function ve(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 Me=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"}),Ce=Object.freeze(["meta","ctrl","alt","shift"]);function V(e,t,n){let r=e.split("+");for(let a of Ce)if(r.includes(a)!==Boolean(t[`${a}Key`]))return!1;let i=r.find((a)=>!Ce.includes(a));if(i===void 0||typeof t.key!=="string")return!0;let s=n&&Object.hasOwn(n,i)?n[i]:Object.hasOwn(Me,i)?Me[i]:/^[a-z0-9]$/.test(i)?i:null;return typeof s==="string"&&s.toLowerCase()===t.key.toLowerCase()}var cn=(e)=>e&&typeof e==="object"?e.keys:String(e);function ne(e,t,n){let r=t.target;if(e?.inEditable!==!0&&(r?.isContentEditable||/^(input|textarea|select)$/.test(r?.localName)))return!1;let i=/[Mm]ac|iP/.test(navigator.userAgentData?.platform??navigator.platform)?"meta":"ctrl";return V(cn(e).replace(/^mod\+/,`${i}+`),t,n)}function un(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:ve(t),legacy:!0}];let n=[];for(let r of t.split(" ")){if(r==="")continue;let i=null;try{i=JSON.parse(r)}catch{i=null}if(i&&typeof i==="object"&&!Array.isArray(i))n.push(i);else console.warn(`[phlex-reactive] malformed on_client binding record ${JSON.stringify(r)} — skipped`)}return n}function De(e,t,n){if(e.legacy)return!0;let r=e.on;if(typeof r!=="string"||r==="")return!1;let i=r.indexOf(".");if(t.type!==(i<0?r:r.slice(0,i)))return!1;if(Boolean(e.window)!==_e(t.currentTarget))return!1;return i<0||n===null||V(r.slice(i+1),t,n)}function ln(e,t){let n=e.detail;if(n===void 0)return!0;if(n===null||typeof n!=="object"||Array.isArray(n))return!1;let r=t.detail;if(r===null||typeof r!=="object")return!1;return Object.keys(n).every((i)=>r[i]===n[i])}var $e=new WeakMap;function dn(e,t,n){if(!n.once)return!1;let r=t.currentTarget??e.element,i=$e.get(e);if(!i)i=new WeakMap,$e.set(e,i);let s=i.get(r);if(!s)s=new Set,i.set(r,s);let a=t.params?.ops,c=(r===globalThis.window?`${typeof a==="string"?a:JSON.stringify(a??null)}|`:"")+JSON.stringify(n);if(s.has(c))return!0;return s.add(c),!1}var qe=new WeakMap;function fn(e,t){if(e===null||typeof e!=="object")return!1;let n=e.params?.ops,r=typeof n==="string"?n:JSON.stringify(n??null),i=qe.get(e);if(!i)i=new WeakMap,qe.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(r))return!0;return a.add(r),!1}function ue(e,t,n){for(let r of e){if(!Array.isArray(r))continue;let[i,s={}]=r;if(!Object.hasOwn(Pe,i)){console.warn(`[phlex-reactive] unknown client op ${JSON.stringify(i)} — skipped`);continue}let a=t(s);if(a.length===0&&n)n(i,s);for(let o of a)if(Pe[i](o,s,t),s?.keep===!0)Ke(o,i,s,t)}}function hn(e,t){let n=e.to;if(t){if(n==="@root")return[t];if(typeof n!=="string"||n==="")return[];if(e.global)return[...document.querySelectorAll(n)];return[...t.querySelectorAll(n)]}if(typeof n!=="string"||n===""||n==="@root")return[];return[...document.querySelectorAll(n)]}function mn(e){let t=e.getAttribute?.("data-reactive-persist");return Boolean(t)&&t!=="off"}function pt(e){return["defer-token","defer-src","lazy-on","lazy-visible"].some((t)=>e.getAttribute?.(`data-reactive-${t}`)!=null)}function pn(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 gn(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 bn(e){return e.getAttribute?.("data-reactive-compute-inputs-param")!=null}function yn(e){return Boolean(e.matches?.("[data-reactive-sortable],[data-reactive-sortable-source]")||e.querySelector?.("[data-reactive-sortable],[data-reactive-sortable-source]"))}function gt(e){return e.getAttribute?.("data-reactive-presence")!=null}function vn(e){return Boolean(e.matches?.("[data-reactive-countdown]")||e.querySelector?.("[data-reactive-countdown]"))}var _n=[["persist",[mn,null,null,!0]],["defer",[pt,null]],["form",[pn,null]],["bindings",[gn,null,null,!0]],["compute",[bn,null,null,!0]],["sortable",[yn,null]],["presence",[gt,null]],["countdown",[vn,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(_n),We=new Map,p=new Map,wn=new Map;function g(e,t,n){bt.set(e,[t,n]),An(e)}var bt=new Map;function An(e){let t=w.get(e),[n,r]=bt.get(e);t[1]=n,t[2]=r}function Jn(e,t){t.install?.(P),p.set(e,t),wn.set(e,t)}function yt(e){let t=[];for(let[n,[r]]of w){if(!r||p.has(n))continue;try{if(e.some((i)=>r(i)))t.push(n)}catch{}}return t}function vt(e){return I(e).catch((t)=>H(e,"load",t))}function I(e){let t=We.get(e);if(!t)t=(w.get(e)[1]??(()=>Promise.reject(Error("this entry has no way to import it"))))().then((r)=>(r.install?.(P),p.set(e,r),r)),We.set(e,t);return t}var Be=new Set;function H(e,t,n){let r=e+t;if(Be.has(r))return;Be.add(r),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).`,n)}function y(e,t){let n=p.get(e);if(n)return t(n);I(e).then(t,(r)=>H(e,"load",r))}var Sn=1e4;function re(){let e=Number(globalThis.document?.head?.querySelector?.('meta[name="phlex-reactive-feature-timeout"]')?.content);return Number.isFinite(e)&&e>0?e:Sn}function Hn(){return[...w.keys()]}var je=Promise.resolve();function Ue(e,t,n){let r=P.waiting.get(e);if(r&&r[t]===n)delete r[t]}var P={enter:rt,exit:it,count:at,text:E,served:ye,waiting:new WeakMap};var O=Symbol.for("phlex-reactive.early"),En=1e4,Tn=1500,_e=(e)=>e!=null&&(e===globalThis.window||e.window===e),Fn="dispatch";function ie(){return globalThis[O]??={queue:[],connected:new WeakSet},globalThis[O]}function Ln(){let e=Number(globalThis.document?.querySelector?.('meta[name="phlex-reactive-early-ttl"]')?.content);return Number.isFinite(e)&&e>0?e:En}function kn(e){let t={};for(let{name:n,value:r}of Array.from(e.attributes??[])){let i=/^data-reactive-(.+)-param$/i.exec(n);if(!i)continue;let s;try{s=JSON.parse(r)}catch{s=r}t[i[1].replace(/[-_]([a-z0-9])/g,(a,o)=>o.toUpperCase())]=s}return t}function xn(e,t,n){return{[O]:!0,type:e.type,detail:e.detail,target:e.target,currentTarget:n?t.ownerDocument.defaultView:t,params:kn(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 Nn(e,{token:t,type:n,method:r,filter:i,win:s},a){let o=K.get(e);if(!o)K.set(e,o=new Map);let c=s?`${t} ${a}`:t;if(o.has(c))return!1;return o.set(c,{type:n,method:r,filter:i,win:s,params:a,armed:!0}),!0}function Je(e,t,n,r){if(e?.[O])return!1;let i=_e(e?.currentTarget),s=i?r:e?.currentTarget,a=In(e,s,i?`@${t}`:t),o=K.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&&!V(l.filter,e,n))continue;return l.armed=!1,!0}return a}var B=new WeakMap;function Rn(e,t,n){let r=B.get(e);if(!r)B.set(e,r=new Map),setTimeout(()=>B.delete(e));let i=r.get(t)??{};r.set(t,i),i[n]=(i[n]??0)+1}function In(e,t,n){let r=e&&B.get(e)?.get(t);if(!r?.[n])return!1;return r[n]-=1,!0}class _t extends At{static values={token:String};#w;#l=new Map;#d=new Map;#ne;#k;#j;#x=0;#f=new Map;#N=new WeakMap;#t;featuresReady=je;#n=new Map;#R=new Set;#h=!1;#r=null;#m=new Map;#A=new Map;#p=new Map;#g=0;#U;#Ce=0;#De=0;connect(){if(ut=!0,ie().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||pt(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(be),this.#g++,this.featuresReady=je,this.#J(),j(this.element),this.#se()}#$e(e){}#qe(e,t,n,r){}#We(){}#Be(e,t){}#J(e){{let t=this.#g,n=[];for(let[s,[a]]of w){if(!a||this.#R.has(s))continue;let o=p.get(s);if(o&&!o.connect)continue;try{if(a(this.element))n.push(s)}catch(c){this.#b(s,"detect",c)}}if(n.length===0)return;for(let s of n)this.#R.add(s);if(!this.#h&&n.every((s)=>p.has(s))){for(let s of n)this.#I(t,s,p.get(s),e);return}for(let s of n){let a=this.#re(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.#I(t,s,l,e));if(this.#p.set(s,c),w.get(s)[3])this.#r=c}let r=this.#r;r?.then(()=>{if(this.#r===r)this.#r=null}),this.#h=!0;let i=Promise.all(this.#p.values()).then(()=>{if(this.featuresReady===i)this.#h=!1});this.featuresReady=i}}#re(e,t){{let n=()=>e===this.#g;return this.#ie(t),new Promise((r)=>{let i=!1,s=setTimeout(()=>{if(this.#m.delete(s),i=!0,n())this.#b(t,"timeout",Error(`not loaded after ${re()} ms`));r(null)},re());this.#m.set(s,r);let a=()=>{clearTimeout(s),this.#m.delete(s)};I(t).then((o)=>{if(a(),i)queueMicrotask(()=>this.#I(e,t,o));else r(o)},(o)=>{if(a(),n())this.#b(t,"load",o);r(null)})})}}#ie(e){{let t=w.get(e)[2];if(!t)return;let n={};try{this.#A.set(e,[t(this.element,n),n]),P.waiting.set(this.element,{...P.waiting.get(this.element),[e]:n})}catch(r){this.#b(e,"detect",r)}}}#H(e,t){{let[n,r]=this.#A.get(e)??[];if(this.#A.delete(e),!t)Ue(this.element,e,r);try{n?.()}catch(i){console.error(`[phlex-reactive] the "${e}" feature module failed to stop waiting`,i)}return r}}#I(e,t,n,r){{if(e!==this.#g)return;let i=this.#H(t);try{n.connect?.(this,this.#e(),r,i),this.#n.set(t,n)}catch(s){this.#b(t,"connect",s)}}}#e(){return this.#U??={emit:(e,t,n)=>this.#o(e,t,n),reseed:()=>this.#K(),proceed:(e,t,n,r)=>this.#O(e,t,n,0,0,null,r),forgetToken:()=>{this.#w=void 0},owns:(e)=>this.#F(e),ownership:()=>this.#D(),opTargets:(e)=>this.#B(e),diagnose:(e,t)=>this.#W(e,t),applyOps:(e,t)=>ue(e,(n)=>this.#B(t!=null&&n.to==null?{...n,to:t}:n),(n,r)=>this.#W(`client op "${n}"`,r)),listnavOptions:(e)=>this.#v(e),collectFields:()=>this.#Q(),plain:Qe,text:E,served:ye,copyMedia:mt,setValue:ht,confirm:(e,t)=>Promise.resolve().then(()=>Ae(e,t)).catch(()=>!1)},this.#U}#K(){this.#n.get("form")?.reseed(this),this.#n.get("bindings")?.reseed(this),this.#n.get("compute")?.seed(this)}#b(e,t,n){if(H(e,t,n),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:n})}#oe(){{this.#g++;for(let[t,n]of this.#m)clearTimeout(t),n(null);this.#m.clear();for(let t of[...this.#A.keys()]){let n=this.#H(t,!0),r=this.element;y(t,(i)=>{i.abandon?.(r,n),Ue(r,t,n)})}this.#R.clear(),this.#p.clear(),this.#h=!1,this.#r=null;let e=[...this.#n];this.#n.clear();for(let[t,n]of e)try{n.disconnect?.(this,this.#e())}catch(r){console.error(`[phlex-reactive] the "${t}" feature module failed to disconnect`,r)}}}#se(){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.#ae()}#P=new Set;#ae(){let{queue:e}=ie();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 n=Ln(),r=new Map;for(let i of t){let s=r.get(i.event)??[new Set,new Set];r.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(Tn,n):n,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.#q())console.warn(`[phlex-reactive] dropped an early "${i.event.type}" trigger: ${c}`);continue}this.#ce(i)}}#ce({event:e,el:t,descs:n,win:r}){let i=xn(e,t,r),s=this.application?.schema?.keyMappings,a=(t.getAttribute("data-action")??"").split(/\s+/),o=r?this.element:t;for(let c of n){if(!a.includes(c.token))continue;if(c.filter&&!V(c.filter,e,s))continue;if(/#\w+.*:once\b/.test(c.token)){if(!Nn(o,c,r&&JSON.stringify(i.params)))continue;this.#P.add(o)}if(Rn(e,o,r?`@${c.method}`:c.method),c.method==="runOps")this.runOps(i);else this.dispatch(i)}}disconnect(){if(this.#oe(),this.#me(),this.#ge(),this.#t)this.element.removeEventListener?.("turbo:morph-element",this.#t),this.element.removeEventListener?.("focusin",this.#t),this.element.removeEventListener?.(D,this.#t);ie().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&&!ne(t,e,this.application?.schema?.keyMappings))return;if(Je(e,"dispatch",this.application?.schema?.keyMappings,this.element))return;let{action:n,params:r,debounce:i,throttle:s,confirm:a,confirmWhen:o,outside:c,window:l,optimistic:d}=e.params;if(!n)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.#ke(d,f))e.preventDefault();if(n===Wt){let S=()=>{{let m=this.#n.get("defer");if(m)return m.materialize(this)}if(this.tokenValue)return this.#O(f,n,"{}")};return this.#h?this.featuresReady.then(S):S()}let b=this.#z(a,o),v=()=>this.#O(f,n,r,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,n){return Promise.resolve().then(()=>Ae(e,{el:t})).catch(()=>!1).then((r)=>{if(r)n()})}#z(e,t){if(e)return e;if(!t)return null;{let n=p.get("bindings");if(n)return n.confirmMessage(this,this.#e(),t);return this.#V("bindings").then((r)=>r&&r.confirmMessage(this,this.#e(),t))}}#V(e){{let t;return Promise.race([I(e).catch((n)=>(H(e,"load",n),null)),new Promise((n)=>t=setTimeout(()=>n(null),re()))]).finally(()=>clearTimeout(t))}}runOps(e){let t=e.params?.ops;if(t?.shortcut!=null&&!ne(t.shortcut,e,this.application?.schema?.keyMappings))return;if(Je(e,"runOps",this.application?.schema?.keyMappings,this.element))return;if(fn(e,this))return;let n=e.params??{},r=e.currentTarget??e.target,i=un(n.ops),s=i.filter((o)=>De(o,e,null)),a=s.length<=1?s:s.filter((o)=>De(o,e,this.application?.schema?.keyMappings));if(a.length===0&&i.length>0){if(this.#q())this.#_((o)=>o.noBinding(this,e));return}for(let o of a){if(o.outside&&e[O])continue;if(!ln(o,e))continue;if(o.shortcut!=null&&!ne(o.shortcut,e,this.application?.schema?.keyMappings))continue;if(dn(this,e,o))continue;this.#ue(o.legacy?{...n,ops:o.ops,debounce:void 0,throttle:void 0}:o,e,r,i.indexOf(o))}}#ue(e,t,n,r){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.#z(s,a),h=this.#le(e,r,n,()=>this.#Le(this.#Fe(i)));if(!d)return h();if(d instanceof Promise)return d.then((f)=>f?this.#S(f,n,h):h());this.#S(d,n,h)}#le(e,t,n,r){let i=Number(e.debounce)||0,s=Number(e.throttle)||0;if(i<=0&&s<=0)return r;let a=JSON.stringify([t,e]);if(i>0)return()=>this.#G(n,a,i,r);return()=>this.#Y(n,a,s,r)}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 n=p.get("bindings");if(n)return n[e](this,this.#e(),t);t?.preventDefault?.();let r={currentTarget:t?.currentTarget??null,target:t?.target??null,preventDefault(){}};return y("bindings",(i)=>i[e](this,this.#e(),r))}}trackDirty(){(this.#n.get("form")??p.get("form"))?.scan(this,this.#e())}listnavNext(e){this.#E(e,(t,n)=>t<0?0:(t+1)%n)}listnavPrev(e){this.#E(e,(t,n)=>t<0?n-1:(t-1+n)%n)}listnavFirst(e){this.#E(e,()=>0)}listnavLast(e){this.#E(e,(t,n)=>n-1)}listnavPick(e){let t=this.#v(e),n=t.findIndex((r)=>r.hasAttribute("data-reactive-highlighted"));if(n<0)return;e.preventDefault(),t[n].click()}listnavClose(e){for(let t of this.#v(e))t.removeAttribute("data-reactive-highlighted")}#E(e,t){let n=this.#v(e);if(!n.length)return;e.preventDefault();let r=this.#de(e),i=globalThis.document?.activeElement,s=r?n.findIndex((o)=>o===i||i!=null&&o.contains?.(i)):n.findIndex((o)=>o.hasAttribute("data-reactive-highlighted")),a=n[t(s,n.length)];if(r)a.focus?.();else{for(let o of n)o.removeAttribute("data-reactive-highlighted");a.setAttribute("data-reactive-highlighted","true")}a.scrollIntoView?.({block:"nearest"})}#de(e){return(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-focus-param")==="true"}#v(e){let n=(e?.currentTarget??e?.target??this.element).getAttribute?.("data-reactive-listnav-option-param")??this.element.getAttribute("data-reactive-listnav-option-param");if(!n)return[];let r=this.#D();return Array.from(this.element.querySelectorAll(n)).filter((i)=>!i.hidden&&r(i))}#O(e,t,n,r,i,s,a){if(this.#o("reactive:before-dispatch",{action:t,params:this.#ee(n),element:this.element},{cancelable:!0}).defaultPrevented)return;let c=Number(r)||0;if(c>0)return this.#he(e,c,t,n,s,a);let l=Number(i)||0;if(l>0)return this.#pe(e,l,t,n,s,a);return this.#T(t,n,s,e,a)}#T(e,t,n,r,i){let s={inverse:null,undo:[],resurrect:null},a=this.#xe(e,r,s),o=Boolean(n||i),c=(f)=>{if(!o||!f)return;let b=this.#e();if(s.inverse=f.optimistic(this,b,n,r),s.undo.push(...f.busy(this,b,i,r)),this.#C())s.resurrect=f.resurrection(this,b,n,r)},l=p.get("hints");if(!o||l)c(l);let d=()=>this.#_e(e,t,s,a),h=()=>this.#r?this.#r.then(d):d();return this.queue=(this.queue??Promise.resolve()).then(()=>o&&!l?this.#fe().then(c).then(h):h()),this.queue}#fe(){return this.#V("hints")}#he(e,t,n,r,i,s){this.#G(e,Fn,t,()=>this.#T(n,r,i,e,s))}#G(e,t,n,r){this.#M(e,t);let i=()=>{this.#M(e,t),r()},s=setTimeout(i,n);if(!_e(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 n=this.#l.get(e),r=n?.get(t);if(!r)return;if(clearTimeout(r.timer),e?.removeEventListener?.("blur",r.flush),n.delete(t),n.size===0)this.#l.delete(e)}#me(){for(let[e,t]of[...this.#l])for(let n of[...t.keys()])this.#M(e,n)}#pe(e,t,n,r,i,s){return this.#Y(e,n,t,()=>this.#T(n,r,i,e,s))}#Y(e,t,n,r){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)},n);return i.set(t,s),this.#d.set(e,i),r()}#ge(){for(let e of this.#d.values())for(let t of e.values())clearTimeout(t);this.#d.clear()}#o(e,t,{cancelable:n=!1}={}){let r=new CustomEvent(e,{bubbles:!0,composed:!0,cancelable:n,detail:t});return(this.element.isConnected?this.element:document).dispatchEvent(r),r}#s(e,t,n,r){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:n,...r,retry:i})}#i(e){if(this.element?.isConnected===!1)return;this.element?.setAttribute?.("data-reactive-error",e)}#be(){this.element?.removeAttribute?.("data-reactive-error")}#ye(){let e=document.querySelector("[data-reactive-error-flash]");if(!e?.content)return;let t=e.getAttribute("data-reactive-error-flash")||"flash",n=document.getElementById(t);if(!n)return;n.appendChild(e.content.cloneNode(!0))}#ve(){{let e=p.get("devtools");if(e)return e.delay();if(tt())return I("devtools").then((t)=>t.delay(),()=>{})}}#C(){return this.element?.getAttribute?.("data-reactive-debug")==="true"}#X(){return typeof performance<"u"&&typeof performance.now==="function"?performance.now():Date.now()}async#_e(e,t,n,r){let{fields:i,files:s}=this.#Q(),a=this.#ee(t),o={...i,...a},c=this.#a,l=s.length>0,d=l?this.#Ee(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.#X()}:null;await this.#ve();try{if(navigator.onLine===!1){this.#c(n.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.#Oe()};if(!l)m["Content-Type"]="application/json";let L=this.#Me();if(L)m["X-Pgbus-Connection"]=L;let M=gt(this.element)&&document.getElementById(`reactive-presence-src-${this.element.id}`)?.getAttribute("connection-id");if(M)m["X-Reactive-Presence"]=M;let we=$t(this.element);if(we)m["X-Reactive-Held"]=we;at("action"),f=await fetch(this.#Ie(),{method:"POST",headers:m,body:d,credentials:"same-origin",signal:AbortSignal.timeout(this.#Pe())})}catch(m){if(console.error("[phlex-reactive] action error",m),this.#c(n.inverse),m?.name==="TimeoutError"||m?.name==="AbortError"){this.#i("timeout"),this.#s(e,t,o,{kind:"timeout"});return}this.#ye(),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(n.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(n.inverse),(f.headers.get("Content-Type")||"").includes("turbo-stream")){let L=this.#Z(m);if(this.#a=L??this.#a,h)this.#_((M)=>M.recordBody(h,m,L));Ne(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(n.inverse),this.#i("content-type"),this.#s(e,t,o,{kind:"content-type",status:f.status});return}let v=await f.text(),S=this.#Z(v);if(this.#a=S??this.#a,h)this.#_((m)=>m.recordBody(h,v,S));if(Ne(this.element,v),n.resurrect)queueMicrotask(n.resurrect);return this.#be(),this.#o("reactive:applied",{action:e,params:o,html:v}),v}catch(f){console.error("[phlex-reactive] action error",f),this.#c(n.inverse),this.#o("reactive:error",{action:e,params:o,kind:"apply"})}finally{if(r?.(),h)this.#_((f)=>f.trace(this,{...h,ms:this.#X()-h.started}))}}get#a(){return this.#w??this.tokenValue}set#a(e){this.#w=e}tokenValueChanged(){this.#w=void 0}#Z(e){let t=this.element.id;if(!t)return e.match(/data-reactive-token-value="([^"]+)"/)?.[1];let{token:n,self:r}=this.#we(t),i=e.match(n);if(i)return i[1];let s=e.match(r);if(s)return s[1].match(/data-reactive-token-value="([^"]+)"/)?.[1];return}#we(e){let t=this.#j;if(t&&t.id===e)return t;let n=Ht(e);return this.#j={id:e,token:new RegExp(`<turbo-stream\\b[^>]*\\baction="reactive:token"[^>]*\\btarget="${n}"[^>]*\\bdata-reactive-token-value="([^"]+)"`),self:new RegExp(`<turbo-stream\\b[^>]*\\baction="(?:replace|update)"[^>]*\\btarget="${n}"[^>]*>([\\s\\S]*?)</turbo-stream>`)}}#F(e){return e.closest('[data-controller~="reactive"]')===this.element}#D(){if(this.element.querySelectorAll('[data-controller~="reactive"]').length===0)return()=>!0;return(t)=>this.#F(t)}#Q(){let e={},t=[],n=this.#D(),r=[];this.element.querySelectorAll("input[name], select[name], textarea[name]").forEach((o)=>{if(!n(o))return;if(o.type==="file")for(let c of o.files??[])t.push({name:o.name,file:c,multiple:o.multiple});else r.push(o)});let i=[];this.element.querySelectorAll(`[name]${Yt}`).forEach((o)=>{if(n(o))i.push(o)});let s=this.#Ae(r),a=this.#Se(r);for(let o of r)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("[]")&&!Zt(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}}#Ae(e){let t=new Set;for(let n of e){if(n.type==="radio")continue;if(String(n.name).endsWith("[]"))t.add(n.name)}return t}#Se(e){let t=new Set;for(let n of e)if(n.type==="checkbox")t.add(n.name);return t}#Ee(e,t,n,r){let i=new FormData;i.append("token",e),i.append("act",t);let s=[];for(let[o,c]of Object.entries(n))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.#$(i,this.#L(o),c);for(let o of s)i.append("empty_groups[]",o);let a=this.#Te(r);for(let{name:o,file:c,multiple:l}of r){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),n=t.indexOf("[");if(n===-1)return`params[${t}]`;return`params${[t.slice(0,n),...t.slice(n).match(/[^\[\]]+/g)??[]].map((i)=>`[${i}]`).join("")}`}#$(e,t,n){if(n==null)e.append(t,"");else if(Array.isArray(n))n.forEach((r,i)=>this.#$(e,`${t}[${i}]`,r));else if(typeof n==="object")for(let[r,i]of Object.entries(n))this.#$(e,`${t}[${r}]`,i);else e.append(t,String(n))}#Te(e){let t=new Map;for(let{name:n}of e)t.set(n,(t.get(n)??0)+1);return new Set([...t].filter(([,n])=>n>1).map(([n])=>n))}#ee(e){if(!e)return{};try{return typeof e==="string"?JSON.parse(e):e}catch{return{}}}#Fe(e){return ve(e)}#Le(e){ue(e,(t)=>this.#B(t),(t,n)=>this.#W(`client op "${t}"`,n))}#q(){return this.element?.getAttribute?.("data-reactive-verbose")==="true"||this.#C()}#W(e,t){if(!this.#q())return;this.#_((n)=>n.diagnose(this,e,t))}#_(e){y("devtools",e)}#B(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((n)=>this.#F(n))}#ke(e,t){if(e?.checked!=="keep")return!1;let n=t?.type;return n==="checkbox"||n==="radio"}#c(e){if(!e)return;if(!this.element.isConnected)return;for(let t of e)t()}#xe(e,t,n){this.#Ne(e,t),rt();let r=!1;return()=>{if(r)return;r=!0,this.#Re(e,t),it();for(let i of n.undo)i()}}#Ne(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 n of this.#te(e))this.#u(n,e,1)}#Re(e,t){this.#u(t,e,-1),this.#u(this.element,e,-1);let n=(this.#f.get(e)??1)-1;if(n<=0)this.#f.delete(e);else this.#f.set(e,n);if(--this.#x<=0)this.#x=0,this.element.removeAttribute("aria-busy");for(let r of this.#te(e))this.#u(r,e,-1)}#u(e,t,n){if(!e||typeof e.getAttribute!=="function")return;let r=this.#N.get(e)??new Map,i=(r.get(t)??0)+n;if(i<=0)r.delete(t);else r.set(t,i);if(r.size===0){this.#N.delete(e),e.removeAttribute("data-reactive-busy");return}this.#N.set(e,r),e.setAttribute("data-reactive-busy",[...r.keys()].join(" "))}#te(e){return[...this.element.querySelectorAll?.("[data-reactive-busy-on]")??[]].filter((n)=>n.getAttribute("data-reactive-busy-on")===e&&this.#F(n))}#Ie(){return this.#ne??=document.querySelector('meta[name="phlex-reactive-action-path"]')?.content||"/reactive/actions"}#Pe(){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}#Oe(){return document.querySelector('meta[name="csrf-token"]')?.content??""}#Me(){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)Ie();else document.addEventListener("turbo:load",Ie,{once:!0});g("persist",()=>import("phlex/reactive/features/persist"),Pn);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"),On);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"));ge();function Pn(e,t){let n=()=>{t.edited=!0},r=(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,n);return document.addEventListener("turbo:submit-end",r),()=>{for(let s of i)e.removeEventListener?.(s,n);document.removeEventListener("turbo:submit-end",r)}}function On(e,t){let n=()=>{t.edited=!0};return e.addEventListener?.("input",n),e.addEventListener?.("change",n),()=>{e.removeEventListener?.("input",n),e.removeEventListener?.("change",n)}}var Mn=1000,F=null,wt,G=new Set;function Cn(e){return vt(e).then((t)=>{if(e!=="effects")return;wt=t,t?.sweep()})}Ze((e,t)=>{let n=e.detail,r=n?.render;if(typeof r!=="function")return;let i=n.newStream??e.target,s=yt(Dn(i)).filter((o)=>!G.has(o));if(!t&&!G.has("effects")&&$n(i))s.push("effects");if(s.length===0&&!F)return t?.wrap(e);if(s.length>0){for(let c of s)G.add(c);let o=F=Promise.race([Promise.all([F,...s.map(Cn)]),new Promise((c)=>setTimeout(c,Mn))]).then(()=>{if(F!==o)return;F=null,G.clear()})}let a=F;n.render=async(o)=>{await a;let c={target:e.target,detail:{newStream:n.newStream,render:r}};(t??wt)?.wrap(c),await c.detail.render(o)}});function Dn(e){let t=e?.querySelector?.("template")?.content;if(!t)return[];let n=[...t.querySelectorAll?.('[data-controller~="reactive"]')??[]];for(let r of t.children??[])if(r.matches?.('[data-controller~="reactive"]')&&!n.includes(r))n.unshift(r);return n.push(t),n}function $n(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 Xn=_t;export{nt as ACTIVE_ATTR,Yt as EDITOR_SELECTOR,Xt as EDITOR_TAGS,st as REQUESTS_ATTR,Kt as checkReactiveRegistration,at as countReactiveRequest,Xn as default,E as editableValue,rt as enterReactiveActivity,Ht as escapeRegExp,it as exitReactiveActivity,vt as loadReactiveFeature,Ze as onReactiveStreamWithoutEffects,jn as reactiveActivityCount,Hn as reactiveFeatureNames,Ie as registerReactiveActions,Ft as registerReactiveDefer,ge as registerReactiveDev,Lt as registerReactiveDismiss,Lt as registerReactiveEffects,Jn as registerReactiveFeature,g as registerReactiveFeatureLoader,Pt as registerReactiveImageFallback,Tt as registerReactiveJs,It as registerReactiveKeep,Rt as registerReactiveModals,Mt as registerReactiveMorphFocus,Bt as registerReactiveOffline,Ot as registerReactivePlaintext,Lt as registerReactiveStreamRender,Et as registerReactiveToken,St as registerReactiveVisit,Un as resetReactiveActivity,ye as serverText,yt 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=487097BB218E972964756E2164756E21
8
+ //# debugId=5538221910F6A13C64756E2164756E21
9
9
  //# sourceMappingURL=core.min.js.map