phlex-reactive 0.15.4 → 0.16.0
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 +4 -4
- data/CHANGELOG.md +116 -0
- data/README.md +26 -2
- data/app/controllers/phlex/reactive/fragments_controller.rb +4 -3
- data/app/javascript/phlex/reactive/core.min.js +6 -6
- data/app/javascript/phlex/reactive/core.min.js.map +3 -3
- data/app/javascript/phlex/reactive/reactive_controller.min.js +4 -4
- data/app/javascript/phlex/reactive/reactive_controller.min.js.map +3 -3
- data/app/javascript/phlex/reactive/runtime.js +83 -1
- data/lib/generators/phlex/reactive/install/templates/phlex_reactive.rb.erb +2 -1
- data/lib/phlex/reactive/apm/subscriber.rb +5 -0
- data/lib/phlex/reactive/apm.rb +5 -6
- data/lib/phlex/reactive/authorization.rb +31 -5
- data/lib/phlex/reactive/client_bindings.rb +19 -0
- data/lib/phlex/reactive/component/dsl.rb +15 -1
- data/lib/phlex/reactive/component/helpers.rb +4 -0
- data/lib/phlex/reactive/component/identity.rb +17 -6
- data/lib/phlex/reactive/component/lazy.rb +4 -0
- data/lib/phlex/reactive/component/presence_declaration.rb +4 -0
- data/lib/phlex/reactive/component/registry.rb +76 -6
- data/lib/phlex/reactive/component/sortable.rb +3 -0
- data/lib/phlex/reactive/component.rb +4 -0
- data/lib/phlex/reactive/defer.rb +4 -4
- data/lib/phlex/reactive/doctor/ractor_readiness.rb +65 -0
- data/lib/phlex/reactive/doctor.rb +2 -0
- data/lib/phlex/reactive/engine.rb +25 -0
- data/lib/phlex/reactive/fragment.rb +5 -4
- data/lib/phlex/reactive/param_schema.rb +3 -2
- data/lib/phlex/reactive/pending/markup.rb +27 -9
- data/lib/phlex/reactive/pending.rb +4 -4
- data/lib/phlex/reactive/response.rb +3 -4
- data/lib/phlex/reactive/shareable.rb +87 -0
- data/lib/phlex/reactive/store.rb +73 -0
- data/lib/phlex/reactive/streamable.rb +49 -20
- data/lib/phlex/reactive/version.rb +1 -1
- data/lib/phlex/reactive.rb +293 -122
- data/sig/phlex/reactive/component.rbs +108 -0
- data/sig/phlex/reactive/param_schema.rbs +23 -0
- data/sig/phlex/reactive/response.rbs +70 -0
- data/sig/phlex/reactive/streamable.rbs +62 -0
- data/sig/phlex/reactive.rbs +231 -0
- metadata +9 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b96289b4a91d050b1631c5c31663714e3aba33370f1a4e8d87d04c662fa3ed81
|
|
4
|
+
data.tar.gz: 55c7126c343c696e66f4baf5d4c62d09a2e8fa8861c1bbe04b9b5f67c265c42c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c4298ac14bf00c485324d9b61ae72fb812e0c87f1afd66cc09a24c2f0dd0917b7bf40458dd37223ba79650b4cf8a3bd44745cb7bf66d74f27f19021a3969b1a5
|
|
7
|
+
data.tar.gz: a652652cfd5a2c7439c846afb421c8d99ff3cf902276da910e05228c7313cf9c3662c8c5391cfaab1316ec4399115d96cd5441fa9d4a8dbee74e032831d419d5
|
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,106 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.16.0]
|
|
10
|
+
|
|
11
|
+
### Upgrading from 0.15.x
|
|
12
|
+
|
|
13
|
+
- **The configuration is finalized automatically at boot (#364).** Nothing to
|
|
14
|
+
call: the engine runs `Phlex::Reactive.finalize!` once the app has booted,
|
|
15
|
+
after every initializer and every `after_initialize` block the app
|
|
16
|
+
registered. From then on every setting reads back as a frozen copy, and the
|
|
17
|
+
param-type and named-schema registries are closed (registering into either
|
|
18
|
+
after boot already raised). Booting the gem without the engine, call
|
|
19
|
+
`Phlex::Reactive.finalize!` at the end of your own boot.
|
|
20
|
+
|
|
21
|
+
- **The configuration's lists are frozen once the app has booted (#364).**
|
|
22
|
+
Append to `authorization_errors` in an initializer or an `after_initialize`
|
|
23
|
+
block, as before; after boot, assign a new list (`<<` raises `FrozenError`).
|
|
24
|
+
`around_action`, `on_action_error` and `register_token_upgrader` now replace
|
|
25
|
+
a frozen list instead of appending to it; `around_actions`,
|
|
26
|
+
`on_action_error_hooks` and `token_upgraders` are frozen, and
|
|
27
|
+
`authorization_methods`' default is a frozen list. A setting reads back
|
|
28
|
+
frozen too: change it by assigning, never in place.
|
|
29
|
+
|
|
30
|
+
- **Nothing an app configures makes boot raise (#364).** A value no Ractor can
|
|
31
|
+
share is kept as it is and works on the main Ractor only: a block written in
|
|
32
|
+
an initializer (`around_action`, `on_action_error`, `param_type`), a lambda
|
|
33
|
+
that closes over app state, a logger, an APM object, the verifier. An app
|
|
34
|
+
booting without a `secret_key_base` (a production rake task or build step)
|
|
35
|
+
keeps the verifier lazy, as before: the first token raises, not boot.
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **`Phlex::Reactive.finalize!`, `finalized?` and a test-only
|
|
40
|
+
`reset_finalization!` (#364).** `finalize!` freezes the param-type and
|
|
41
|
+
named-schema registries and stores every setting as a deep-frozen,
|
|
42
|
+
Ractor-shareable copy (the objects an app handed in are never frozen), so a
|
|
43
|
+
non-main Ractor can read the configuration. The engine calls it at boot (see
|
|
44
|
+
Upgrading). Writers keep working afterwards, and what they write is shared
|
|
45
|
+
too.
|
|
46
|
+
|
|
47
|
+
- **`Phlex::Reactive.renderer` takes a name (#364).** `renderer =
|
|
48
|
+
"ApplicationController"`, like `base_controller_name`, resolves on every read,
|
|
49
|
+
so a class Zeitwerk reloaded in development is picked up (and the per-thread
|
|
50
|
+
view contexts rebuild for it). A class keeps working, and keeps rendering the
|
|
51
|
+
class object it was given. The README and the install template show the name.
|
|
52
|
+
|
|
53
|
+
- **`phlex_reactive:doctor` reports Ractor readiness (#364).** An advisory line
|
|
54
|
+
(never a failure): eager loading on, the configuration finalized, and each
|
|
55
|
+
setting `finalize!` shares that still holds a value a non-main Ractor cannot
|
|
56
|
+
read, with its class (the verifier, never shareable, is left out).
|
|
57
|
+
|
|
58
|
+
- **RBS signatures (#364).** `sig/` covers the configuration and token surface
|
|
59
|
+
of `Phlex::Reactive`, a component's class-level DSL, Streamable (its instance
|
|
60
|
+
methods and its class methods), `Response`, `ParamSchema`, `Store` and
|
|
61
|
+
`Shareable`, and ships with the gem. Lint runs `rbs -I sig validate`; a spec
|
|
62
|
+
fails when a public method has no signature.
|
|
63
|
+
|
|
64
|
+
- **Concurrency conformance (#364).** conformance-kit 0.4's gates run in CI:
|
|
65
|
+
every `rubocop-thread_safety` cop, with no directory excludes (`NewThread`
|
|
66
|
+
is excluded only from the five spec files that start threads on purpose),
|
|
67
|
+
thread and Async contention examples over rendering, tokens, params and
|
|
68
|
+
broadcasts, a
|
|
69
|
+
Ruby 4.0 Ractor canary (param coercion, Stream wrapping, `Streamable#dom_id`,
|
|
70
|
+
configuration reads and token upgrades run in a non-main Ractor; rendering and
|
|
71
|
+
signing are pending on Phlex and ActiveSupport), and `conformance-audit
|
|
72
|
+
--strict`. A report-only kino smoke serves the dummy app in Ractor mode and
|
|
73
|
+
records the first blocker. Docs: a new "Concurrency & Ractors" guide page.
|
|
74
|
+
|
|
75
|
+
### Changed
|
|
76
|
+
|
|
77
|
+
- **No reader writes on first use (#364).** Every setting starts at its default
|
|
78
|
+
when the gem loads (the param-type registry is seeded then too; the verifier,
|
|
79
|
+
which needs `Rails.application`, is built by `finalize!` at boot when it can
|
|
80
|
+
be). With eager loading the engine also prepends `verify_authorized`'s
|
|
81
|
+
interceptor to every component and resolves every component's registries and
|
|
82
|
+
render memos at boot (a `ClientBindings`-only view's too), so a request
|
|
83
|
+
writes no class.
|
|
84
|
+
|
|
85
|
+
- **Per-Ractor state instead of `Concurrent::Map` and lock constants (#364).**
|
|
86
|
+
The fragment viewer warnings, the CSRF-name patterns, the once-per-process
|
|
87
|
+
config warnings, the APM adapter memo, the Streamable class registry, the
|
|
88
|
+
pending-markup variants and the registry's write lock live in
|
|
89
|
+
`Phlex::Reactive::Store` (`Ractor.store_if_absent`, with a Mutex-guarded
|
|
90
|
+
table on an engine without Ractors). `lib/` and `app/` no longer reference
|
|
91
|
+
`concurrent-ruby`, which was never a declared dependency.
|
|
92
|
+
|
|
93
|
+
### Fixed
|
|
94
|
+
|
|
95
|
+
- **Eager loading the gem raised `NoMethodError: undefined method 'to_json'`
|
|
96
|
+
in a process that had not loaded json yet (#364).** `Component::Sortable`
|
|
97
|
+
calls `Hash#to_json` while it loads; it now requires json itself.
|
|
98
|
+
|
|
99
|
+
- **`verify_authorized` could prepend two interceptors to one class (#364).**
|
|
100
|
+
The lazy, request-path `Authorization.instrument!` checked and prepended
|
|
101
|
+
without a lock; two threads first-calling it for one class both prepended.
|
|
102
|
+
It now holds a lock across the check and the prepend.
|
|
103
|
+
|
|
104
|
+
## [0.15.5] - 2026-10-15
|
|
105
|
+
|
|
106
|
+
Consolidates everything since 0.14.1; tags 0.14.2–0.15.4 shipped without
|
|
107
|
+
changelog sections, so this section spans the whole run to 0.15.5.
|
|
108
|
+
|
|
9
109
|
### Added
|
|
10
110
|
|
|
11
111
|
- **A server deadline counted down on the client — `reactive_countdown(until:, format: :ms, waiting:, done:)` (#400).**
|
|
@@ -403,6 +503,22 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
403
503
|
|
|
404
504
|
### Fixed
|
|
405
505
|
|
|
506
|
+
- **A server trigger inside a client-only root reaches the component around it
|
|
507
|
+
(#410).** A `ClientBindings` component (a `reactive_filter` list, a
|
|
508
|
+
`reactive_show` wrapper, an `on_client` menu) renders a root with no token.
|
|
509
|
+
Rendered inside a server component, it swallowed that component's `on(...)`
|
|
510
|
+
triggers: Stimulus sends the action to the nearest root, which had no token,
|
|
511
|
+
and the outer root's field collection skipped every control under it (the
|
|
512
|
+
#15 rule). A tokenless client-only root is now transparent to server round
|
|
513
|
+
trips: `dispatch` forwards to the nearest token-bearing root above (skipping
|
|
514
|
+
further client-only roots, waking a dormant one), and that root's action
|
|
515
|
+
collects the controls under nested client-only roots. A nested server
|
|
516
|
+
component keeps its own fields and triggers, and client bindings stay on
|
|
517
|
+
their own root. With no token-bearing root above, nothing is sent, and
|
|
518
|
+
`verbose_errors`/debug logs one warning. Lazy and deferred shells are not
|
|
519
|
+
client-only. Client: +414 B gzipped in the default bundle, +415 B in the
|
|
520
|
+
split core.
|
|
521
|
+
|
|
406
522
|
- **`reactive_media` waits for `take` characters before calling a key a miss
|
|
407
523
|
(#380).** A value shorter than `take:` sliced to a short key, missed the
|
|
408
524
|
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
|
|
@@ -3925,8 +3936,10 @@ Phlex::Reactive.authorization_errors = [Pundit::NotAuthorizedError]
|
|
|
3925
3936
|
Phlex::Reactive.authorization_methods = %i[authorize! authorize allowed_to?]
|
|
3926
3937
|
# Phlex::Reactive.verify_authorized = false # turn the guard off (not recommended)
|
|
3927
3938
|
|
|
3928
|
-
# Use your ApplicationController to render components (app helpers / Current)
|
|
3929
|
-
|
|
3939
|
+
# Use your ApplicationController to render components (app helpers / Current).
|
|
3940
|
+
# By name, like base_controller_name, it follows a code reload in development;
|
|
3941
|
+
# a Class keeps rendering the class object it was given:
|
|
3942
|
+
Phlex::Reactive.renderer = "ApplicationController"
|
|
3930
3943
|
|
|
3931
3944
|
# Sign tokens with a dedicated key instead of secret_key_base:
|
|
3932
3945
|
Phlex::Reactive.verifier = ActiveSupport::MessageVerifier.new(ENV["REACTIVE_KEY"])
|
|
@@ -3978,6 +3991,17 @@ Phlex::Reactive.around_action do |ctx, &action|
|
|
|
3978
3991
|
end
|
|
3979
3992
|
```
|
|
3980
3993
|
|
|
3994
|
+
**The configuration is finalized at boot.** Once the app has booted (after your
|
|
3995
|
+
initializers and every `after_initialize` block), the engine calls
|
|
3996
|
+
`Phlex::Reactive.finalize!` for you: the param-type and named-schema registries
|
|
3997
|
+
freeze, and every setting is stored as a frozen, Ractor-shareable copy (the
|
|
3998
|
+
objects you handed in are not frozen). Append to `authorization_errors` in an
|
|
3999
|
+
initializer; after boot, assign a new list (`<<` raises `FrozenError`). A value
|
|
4000
|
+
no Ractor can share (a block written in an initializer, a lambda that closes
|
|
4001
|
+
over app state, a logger, an APM object, the verifier) is kept as it is and
|
|
4002
|
+
works on the main Ractor only: finalizing never raises for it. Booting without
|
|
4003
|
+
the engine? Call `Phlex::Reactive.finalize!` at the end of your own boot.
|
|
4004
|
+
|
|
3981
4005
|
#### Two seams: HTTP-layer (`base_controller_name`) vs component-layer (`around_action`)
|
|
3982
4006
|
|
|
3983
4007
|
There are two places to wrap a reactive action, and they see different things:
|
|
@@ -45,8 +45,9 @@ module Phlex
|
|
|
45
45
|
# the session it was minted for.
|
|
46
46
|
CSRF_TOKEN_NAMES = %w[authenticity_token csrf-token].freeze
|
|
47
47
|
# One compiled pattern per forgery-protection field name (it is a
|
|
48
|
-
# class-level setting, so in practice one entry), not one per request
|
|
49
|
-
|
|
48
|
+
# class-level setting, so in practice one entry), not one per request:
|
|
49
|
+
# memoized in the per-Ractor table (Phlex::Reactive::Store) under this key.
|
|
50
|
+
CSRF_TOKEN_PATTERNS_KEY = :phlex_reactive_csrf_token_patterns
|
|
50
51
|
|
|
51
52
|
# Stands in for the response when asking the cookie jar what it WOULD
|
|
52
53
|
# write (CookieJar#write calls set_cookie / delete_cookie per pending
|
|
@@ -261,7 +262,7 @@ module Phlex
|
|
|
261
262
|
# An API base controller has no forgery protection (and so no such
|
|
262
263
|
# setting): the built-in names alone are checked then.
|
|
263
264
|
token_name = respond_to?(:request_forgery_protection_token, true) ? request_forgery_protection_token.to_s : ""
|
|
264
|
-
|
|
265
|
+
Phlex::Reactive::Store.table(CSRF_TOKEN_PATTERNS_KEY).fetch(token_name) do
|
|
265
266
|
names = (CSRF_TOKEN_NAMES | [token_name]).reject(&:empty?).map { Regexp.escape(it) }
|
|
266
267
|
/\bname\s*=\s*["']?(?:#{names.join("|")})(?![\w-])/i
|
|
267
268
|
end
|
|
@@ -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
|
-
`;
|
|
4
|
-
`);else if(a.nodeType===1)i(a);if(o)
|
|
5
|
-
`).replace(/\n$/,""),e.getAttribute("data-reactive-editable")==="multi"?t:t.replace(/\n/g," ")}var
|
|
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=
|
|
8
|
+
//# debugId=5538221910F6A13C64756E2164756E21
|
|
9
9
|
//# sourceMappingURL=core.min.js.map
|