@but212/atom-effect-jquery 0.8.2
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.
- package/LICENSE +21 -0
- package/README.md +198 -0
- package/dist/atom-effect-jquery.min.js +2 -0
- package/dist/atom-effect-jquery.min.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +159 -0
- package/dist/index.mjs +1799 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Jeongil Suk
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# @but212/atom-effect-jquery
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@but212/atom-effect-jquery)
|
|
4
|
+
[](https://github.com/but212/atom-effect-jquery/blob/main/LICENSE)
|
|
5
|
+
|
|
6
|
+
**Reactive jQuery bindings powered by [atom-effect](https://github.com/but212/atom-effect).**
|
|
7
|
+
|
|
8
|
+
`@but212/atom-effect-jquery` brings modern, fine-grained reactivity to jQuery applications. It allows you to bind DOM elements directly to atoms, ensuring efficient updates without manual DOM manipulation. It also features automatic cleanup of effects when elements are removed from the DOM, resolving one of the biggest pain points in jQuery development (memory leaks).
|
|
9
|
+
|
|
10
|
+
## Features
|
|
11
|
+
|
|
12
|
+
- **Fine-grained Reactivity:** Powered by `@but212/atom-effect`.
|
|
13
|
+
- **Two-way Data Binding:** Seamless synchronization for inputs (`val`, `checked`).
|
|
14
|
+
- **Auto-Cleanup:** Effects are automatically disposed when elements are removed from the DOM (via MutationObserver).
|
|
15
|
+
- **Reparenting-Safe:** DOM elements moved via `.appendTo()`, `.prependTo()`, etc. preserve their reactivity (critical for drag-and-drop libraries like Sortable).
|
|
16
|
+
- **Async Removal Handling:** `atomList` properly handles async removal animations without ghost items.
|
|
17
|
+
- **Smart Input Formatting:** `atomVal` allows intermediate input (e.g., `1.`, `00`) during typing; formatting is applied on blur.
|
|
18
|
+
- **Optimized List Rendering:** `atomList` for efficient array rendering with LIS-based keyed diffing.
|
|
19
|
+
- **Debug Mode:** Visual highlighting of DOM updates to trace reactivity.
|
|
20
|
+
- **jQuery Integration:** Batching support for standard jQuery events.
|
|
21
|
+
|
|
22
|
+
## Requirements
|
|
23
|
+
|
|
24
|
+
- **jQuery**: >=3.0.0
|
|
25
|
+
- **@but212/atom-effect**: >=0.8.0
|
|
26
|
+
|
|
27
|
+
## Installation
|
|
28
|
+
|
|
29
|
+
### NPM
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm install @but212/atom-effect-jquery jquery @but212/atom-effect
|
|
33
|
+
# or
|
|
34
|
+
pnpm add @but212/atom-effect-jquery jquery @but212/atom-effect
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### CDN
|
|
38
|
+
|
|
39
|
+
```html
|
|
40
|
+
<!-- Load jQuery -->
|
|
41
|
+
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
|
|
42
|
+
<!-- Load atom-effect-jquery -->
|
|
43
|
+
<script src="https://cdn.jsdelivr.net/npm/@but212/atom-effect-jquery@0.8.2"></script>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Basic Usage
|
|
47
|
+
|
|
48
|
+
```javascript
|
|
49
|
+
// If using NPM:
|
|
50
|
+
// import $ from 'jquery';
|
|
51
|
+
// import '@but212/atom-effect-jquery';
|
|
52
|
+
|
|
53
|
+
// 1. Create State
|
|
54
|
+
const count = $.atom(0);
|
|
55
|
+
const doubled = $.computed(() => count.value * 2);
|
|
56
|
+
|
|
57
|
+
// 2. Bind to DOM
|
|
58
|
+
$('#count').atomText(count);
|
|
59
|
+
$('#doubled').atomText(doubled);
|
|
60
|
+
|
|
61
|
+
// 3. Update State (DOM updates automatically)
|
|
62
|
+
$('#increment').on('click', () => count.value++);
|
|
63
|
+
$('#decrement').on('click', () => count.value--);
|
|
64
|
+
|
|
65
|
+
// 4. React to changes (Side Effects)
|
|
66
|
+
$.effect(() => {
|
|
67
|
+
console.log(`Current count: ${count.value}, Doubled: ${doubled.value}`);
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## API Reference
|
|
72
|
+
|
|
73
|
+
### Static Methods
|
|
74
|
+
|
|
75
|
+
The library extends the main jQuery function `$`:
|
|
76
|
+
|
|
77
|
+
- `$.atom(initialValue)`: Creates a writable atom.
|
|
78
|
+
- `$.computed(() => ...)`: Creates a derived computed atom.
|
|
79
|
+
- `$.effect(() => ...)`: Runs a side effect.
|
|
80
|
+
- `$.batch(() => ...)`: Batches multiple updates into a single render.
|
|
81
|
+
- `$.nextTick()`: Returns a Promise that resolves after the next update cycle.
|
|
82
|
+
|
|
83
|
+
### DOM Binding Methods
|
|
84
|
+
|
|
85
|
+
All methods are chainable and return the jQuery object.
|
|
86
|
+
|
|
87
|
+
#### Text & Content
|
|
88
|
+
|
|
89
|
+
- **`.atomText(atom, formatter?)`**
|
|
90
|
+
Updates `textContent`. Optional formatter function.
|
|
91
|
+
- **`.atomHtml(atom)`**
|
|
92
|
+
Updates `innerHTML`. (⚠️ Use with caution regarding XSS).
|
|
93
|
+
|
|
94
|
+
#### Attributes & Styles
|
|
95
|
+
|
|
96
|
+
- **`.atomClass(className, booleanAtom)`**
|
|
97
|
+
Toggles a class based on the atom's truthy value.
|
|
98
|
+
- **`.atomCss(property, atom, unit?)`**
|
|
99
|
+
Updates a CSS property. Optional unit (e.g., 'px') can be appended.
|
|
100
|
+
- **`.atomAttr(attribute, atom)`**
|
|
101
|
+
Updates an HTML attribute.
|
|
102
|
+
- **`.atomProp(property, atom)`**
|
|
103
|
+
Updates a DOM property (e.g., `disabled`, `readOnly`).
|
|
104
|
+
- **`.atomShow(booleanAtom)`** / **`.atomHide(booleanAtom)`**
|
|
105
|
+
Toggles visibility using jQuery's `.toggle()`.
|
|
106
|
+
|
|
107
|
+
#### Two-Way Binding
|
|
108
|
+
|
|
109
|
+
- **`.atomVal(atom, options?)`**
|
|
110
|
+
Two-way binding for input elements.
|
|
111
|
+
- `options.debounce`: Debounce input updates (ms).
|
|
112
|
+
- `options.format`: Format value before ensuring it in DOM.
|
|
113
|
+
- *Note:* Automatically handles IME types (e.g., for Korean/Chinese).
|
|
114
|
+
- **`.atomChecked(booleanAtom)`**
|
|
115
|
+
Two-way binding for checkboxes and radios.
|
|
116
|
+
|
|
117
|
+
#### Events
|
|
118
|
+
|
|
119
|
+
- **`.atomOn(event, handler)`**
|
|
120
|
+
Adds an event listener where the handler is automatically wrapped in `$.batch()`.
|
|
121
|
+
|
|
122
|
+
### Unified Binding (`.atomBind`)
|
|
123
|
+
|
|
124
|
+
For cleaner code when setting multiple bindings at once.
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
$('div').atomBind({
|
|
128
|
+
text: nameAtom,
|
|
129
|
+
class: { 'active': isActiveAtom },
|
|
130
|
+
css: { 'color': colorAtom },
|
|
131
|
+
on: { click: () => console.log('clicked') }
|
|
132
|
+
});
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### List Rendering (`.atomList`)
|
|
136
|
+
|
|
137
|
+
Efficiently renders a list of atoms.
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
const items = $.atom(['Apple', 'Banana']);
|
|
141
|
+
|
|
142
|
+
$('ul').atomList(items, {
|
|
143
|
+
// Unique key for efficient diffing (required)
|
|
144
|
+
key: (item) => item,
|
|
145
|
+
|
|
146
|
+
// Render function returning an HTML string or Element
|
|
147
|
+
render: (item) => `<li>${item}</li>`,
|
|
148
|
+
|
|
149
|
+
// Optional: Bind events/atoms to the created element
|
|
150
|
+
bind: ($el, item) => {
|
|
151
|
+
$el.on('click', () => alert(item));
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Component Mounting (`.atomMount`)
|
|
157
|
+
|
|
158
|
+
Mounts a functional component that manages its own lifecycle.
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
const Counter = ($el, props) => {
|
|
162
|
+
const count = $.atom(props.initial || 0);
|
|
163
|
+
|
|
164
|
+
$el.append('<span>0</span>');
|
|
165
|
+
$el.find('span').atomText(count);
|
|
166
|
+
|
|
167
|
+
// Return cleanup function (optional)
|
|
168
|
+
return () => console.log('Unmounted');
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
$('#app').atomMount(Counter, { initial: 10 });
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Advanced Features
|
|
175
|
+
|
|
176
|
+
### Transparent Lifecycle Management
|
|
177
|
+
|
|
178
|
+
Memory management is handled automatically through overrides of standard jQuery methods. You don't need to manually dispose of bindings.
|
|
179
|
+
|
|
180
|
+
- **`.remove()` / `.empty()`**: Automatically cleans up all associated reactivity and event listeners to prevent memory leaks.
|
|
181
|
+
- **`.detach()`**: Preserves bindings and reactivity. Perfect for moving elements around in the DOM without losing their state connection.
|
|
182
|
+
- **Auto-Cleanup**: A `MutationObserver` acts as a safety net for elements removed via other means (e.g. `innerHTML`), ensuring eventual cleanup.
|
|
183
|
+
|
|
184
|
+
### Performance Optimization
|
|
185
|
+
|
|
186
|
+
The library automatically patches jQuery's event methods (`.on`, `.off`) to wrap handlers in `$.batch()`. This ensures that multiple state updates triggering within a single event (e.g., a click handler) are batched together, resulting in a single re-render.
|
|
187
|
+
|
|
188
|
+
### Debug Mode
|
|
189
|
+
|
|
190
|
+
Enable debug mode to see console logs for every DOM update and visually highlight updated elements in the browser.
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
$.atom.debug = true;
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
MIT
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(E,u){typeof exports=="object"&&typeof module<"u"?u(exports,require("jquery")):typeof define=="function"&&define.amd?define(["exports","jquery"],u):(E=typeof globalThis<"u"?globalThis:E||self,u(E.AtomEffectJQuery={},E.jQuery))})(this,(function(E,u){"use strict";const ze={ONE_SECOND_MS:1e3},Z={IDLE:"idle",PENDING:"pending",RESOLVED:"resolved",REJECTED:"rejected"},$={DISPOSED:1,EXECUTING:2},f={DIRTY:1,IDLE:2,PENDING:4,RESOLVED:8,REJECTED:16,RECOMPUTING:32,HAS_ERROR:64},V={MAX_EXECUTIONS_PER_SECOND:1e3,MAX_EXECUTIONS_PER_EFFECT:100,MAX_EXECUTIONS_PER_FLUSH:1e4,MAX_FLUSH_ITERATIONS:1e3,MIN_FLUSH_ITERATIONS:10},Ee={MAX_DEPENDENCIES:1e3,WARN_INFINITE_LOOP:!0},B=1073741823,R=typeof process<"u"&&process.env&&process.env.NODE_ENV!=="production",Xe=Object.freeze([]);class F extends Error{constructor(e,s=null,n=!0){super(e),this.name="AtomError",this.cause=s,this.recoverable=n,this.timestamp=new Date}}class G extends F{constructor(e,s=null){super(e,s,!0),this.name="ComputedError"}}class M extends F{constructor(e,s=null){super(e,s,!1),this.name="EffectError"}}class ee extends F{constructor(e,s=null){super(e,s,!1),this.name="SchedulerError"}}const m={COMPUTED_MUST_BE_FUNCTION:"Computed function must be a function",COMPUTED_SUBSCRIBER_MUST_BE_FUNCTION:"Subscriber listener must be a function or Subscriber object",COMPUTED_ASYNC_PENDING_NO_DEFAULT:"Async computation is pending. No default value provided",COMPUTED_COMPUTATION_FAILED:"Computed computation failed",COMPUTED_ASYNC_COMPUTATION_FAILED:"Async computed computation failed",COMPUTED_DEPENDENCY_SUBSCRIPTION_FAILED:"Failed to subscribe to dependency",ATOM_SUBSCRIBER_MUST_BE_FUNCTION:"Subscription listener must be a function or Subscriber object",ATOM_SUBSCRIBER_EXECUTION_FAILED:"Error occurred while executing atom subscribers",ATOM_INDIVIDUAL_SUBSCRIBER_FAILED:"Error during individual atom subscriber execution",EFFECT_MUST_BE_FUNCTION:"Effect function must be a function",EFFECT_EXECUTION_FAILED:"Effect execution failed",EFFECT_CLEANUP_FAILED:"Effect cleanup function execution failed",LARGE_DEPENDENCY_GRAPH:t=>`Large dependency graph detected: ${t} dependencies`,UNSUBSCRIBE_NON_EXISTENT:"Attempted to unsubscribe a non-existent listener",CALLBACK_ERROR_IN_ERROR_HANDLER:"Error occurred during onError callback execution"},ae=Symbol("debugName"),Qe=Symbol("id"),le=Symbol("type"),ge=Symbol("noDefaultValue");function Ge(t){return"dependencies"in t&&Array.isArray(t.dependencies)}let me=0;function Se(t,e,s){if(t._visitedEpoch!==s){if(t._visitedEpoch=s,t===e)throw new G("Indirect circular dependency detected");if(Ge(t)){const n=t.dependencies;for(let i=0;i<n.length;i++){const r=n[i];r&&Se(r,e,s)}}}}const O={enabled:typeof process<"u"&&process.env?.NODE_ENV==="development",maxDependencies:Ee.MAX_DEPENDENCIES,warnInfiniteLoop:Ee.WARN_INFINITE_LOOP,warn(t,e){this.enabled&&t&&console.warn(`[Atom Effect] ${e}`)},checkCircular(t,e){if(t===e)throw new G("Direct circular dependency detected");this.enabled&&(me++,Se(t,e,me))},attachDebugInfo(t,e,s){if(!this.enabled)return;const n=t;n[ae]=`${e}_${s}`,n[Qe]=s,n[le]=e},getDebugName(t){if(t!=null&&ae in t)return t[ae]},getDebugType(t){if(t!=null&&le in t)return t[le]}};let He=1;const Je=()=>He++;class ye{constructor(){this.id=Je()&B,this.flags=0}}class De extends ye{constructor(){super(),this.version=0,this._lastSeenEpoch=-1}subscribe(e){if(typeof e=="object"&&e!==null&&"execute"in e)return this._objectSubscribers.add(e);if(typeof e!="function")throw new F(m.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);return this._functionSubscribers.add(e)}subscriberCount(){return this._functionSubscribers.size+this._objectSubscribers.size}_notifySubscribers(e,s){this._functionSubscribers.forEachSafe(n=>n(e,s),n=>console.error(new F(m.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,n))),this._objectSubscribers.forEachSafe(n=>n.execute(),n=>console.error(new F(m.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED,n)))}}let te=0;function Ie(){return te=(te+1|0)&B,te}function Ye(){return te}let se=0,fe=0,ne=!1;function Ce(){return ne?(R&&console.warn("Warning: startFlush() called during flush - ignored to prevent infinite loop detection bypass"),!1):(ne=!0,se=se+1&B,fe=0,!0)}function ve(){ne=!1}function Ke(){return ne?++fe:0}class We{constructor(){this.queueA=[],this.queueB=[],this.queue=this.queueA,this.queueSize=0,this._epoch=0,this.isProcessing=!1,this.isBatching=!1,this.batchDepth=0,this.batchQueue=[],this.batchQueueSize=0,this.isFlushingSync=!1,this.maxFlushIterations=V.MAX_FLUSH_ITERATIONS}get phase(){return this.isProcessing||this.isFlushingSync?2:this.isBatching?1:0}schedule(e){if(typeof e!="function")throw new ee("Scheduler callback must be a function");e._nextEpoch!==this._epoch&&(e._nextEpoch=this._epoch,this.isBatching||this.isFlushingSync?this.batchQueue[this.batchQueueSize++]=e:(this.queue[this.queueSize++]=e,this.isProcessing||this.flush()))}flush(){if(this.isProcessing||this.queueSize===0)return;this.isProcessing=!0;const e=this.queue,s=this.queueSize;this.queue=this.queue===this.queueA?this.queueB:this.queueA,this.queueSize=0,this._epoch++,queueMicrotask(()=>{const n=Ce();this._processJobs(e,s),this.isProcessing=!1,n&&ve(),this.queueSize>0&&!this.isBatching&&this.flush()})}flushSync(){this.isFlushingSync=!0;const e=Ce();try{this._mergeBatchQueue(),this._drainQueue()}finally{this.isFlushingSync=!1,e&&ve()}}_mergeBatchQueue(){if(this._epoch++,this.batchQueueSize>0){for(let e=0;e<this.batchQueueSize;e++){const s=this.batchQueue[e];s&&s._nextEpoch!==this._epoch&&(s._nextEpoch=this._epoch,this.queue[this.queueSize++]=s)}this.batchQueueSize=0}}_drainQueue(){let e=0;for(;this.queueSize>0;){if(++e>this.maxFlushIterations){this._handleFlushOverflow();break}this._processCurrentQueue(),this._mergeBatchQueue()}}_processCurrentQueue(){const e=this.queue,s=this.queueSize;this.queue=this.queue===this.queueA?this.queueB:this.queueA,this.queueSize=0,this._epoch++,this._processJobs(e,s)}_handleFlushOverflow(){console.error(new ee(`Maximum flush iterations (${this.maxFlushIterations}) exceeded. Possible infinite loop.`)),this.queueSize=0,this.queue.length=0,this.batchQueueSize=0}_processJobs(e,s){for(let n=0;n<s;n++)try{e[n]?.()}catch(i){console.error(new ee("Error occurred during scheduler execution",i))}e.length=0}startBatch(){this.batchDepth++,this.isBatching=!0}endBatch(){this.batchDepth=Math.max(0,this.batchDepth-1),this.batchDepth===0&&(this.flushSync(),this.isBatching=!1)}setMaxFlushIterations(e){if(e<V.MIN_FLUSH_ITERATIONS)throw new ee(`Max flush iterations must be at least ${V.MIN_FLUSH_ITERATIONS}`);this.maxFlushIterations=e}}const J=new We;function j(t){if(typeof t!="function")throw new F("Batch callback must be a function");J.startBatch();try{return t()}finally{J.endBatch()}}const q={current:null,run(t,e){const s=this.current;this.current=t;try{return e()}finally{this.current=s}},getCurrent(){return this.current}};function de(t){if(typeof t!="function")throw new F("Untracked callback must be a function");const e=q.current;q.current=null;try{return t()}finally{q.current=e}}class ie{constructor(){this.subscribers=null}add(e){if(this.subscribers||(this.subscribers=[]),this.subscribers.indexOf(e)!==-1)return()=>{};this.subscribers.push(e);let s=!1;return()=>{s||(s=!0,this.remove(e))}}remove(e){if(!this.subscribers)return!1;const s=this.subscribers.indexOf(e);if(s===-1)return!1;const n=this.subscribers.length-1;return s!==n&&(this.subscribers[s]=this.subscribers[n]),this.subscribers.pop(),!0}has(e){return this.subscribers?this.subscribers.indexOf(e)!==-1:!1}forEach(e){if(this.subscribers)for(let s=0;s<this.subscribers.length;s++)e(this.subscribers[s],s)}forEachSafe(e,s){if(this.subscribers)for(let n=0;n<this.subscribers.length;n++)try{e(this.subscribers[n],n)}catch(i){s?s(i):console.error("[SubscriberManager] Error in subscriber callback:",i)}}get size(){return this.subscribers?.length??0}get hasSubscribers(){return this.subscribers!==null&&this.subscribers.length>0}clear(){this.subscribers=null}toArray(){return this.subscribers?[...this.subscribers]:[]}}function _e(t){return t!==null&&typeof t=="object"&&"value"in t&&"subscribe"in t&&typeof t.subscribe=="function"}function Te(t){if(O.enabled&&(t==null||typeof t=="object")){const e=O.getDebugType(t);if(e)return e==="computed"}return _e(t)&&"invalidate"in t&&typeof t.invalidate=="function"}function Ne(t){return t!=null&&typeof t.then=="function"}function Ze(t){return typeof t=="object"&&t!==null}function Re(t){return(typeof t=="object"||typeof t=="function")&&t!==null&&typeof t.addDependency=="function"}function Ue(t){return typeof t=="function"&&typeof t.addDependency!="function"}function Oe(t){return Ze(t)&&typeof t.execute=="function"}class $e extends De{constructor(e,s){super(),this._isNotificationScheduled=!1,this._value=e,this._functionSubscribersStore=new ie,this._objectSubscribersStore=new ie,this._sync=s,this._notifyTask=this._flushNotifications.bind(this),O.attachDebugInfo(this,"atom",this.id)}get _functionSubscribers(){return this._functionSubscribersStore}get _objectSubscribers(){return this._objectSubscribersStore}get value(){const e=q.getCurrent();return e&&this._track(e),this._value}set value(e){if(Object.is(this._value,e))return;const s=this._value;this.version=this.version+1&B,this._value=e,!(!this._functionSubscribersStore.hasSubscribers&&!this._objectSubscribersStore.hasSubscribers)&&this._scheduleNotification(s)}_track(e){if(Re(e)){e.addDependency(this);return}if(Ue(e)){this._functionSubscribersStore.add(e);return}Oe(e)&&this._objectSubscribersStore.add(e)}_scheduleNotification(e){this._isNotificationScheduled||(this._pendingOldValue=e,this._isNotificationScheduled=!0),this._sync&&!J.isBatching?this._flushNotifications():J.schedule(this._notifyTask)}_flushNotifications(){if(!this._isNotificationScheduled)return;const e=this._pendingOldValue,s=this._value;this._pendingOldValue=void 0,this._isNotificationScheduled=!1,this._notifySubscribers(s,e)}peek(){return this._value}dispose(){this._functionSubscribersStore.clear(),this._objectSubscribersStore.clear(),this._value=void 0}}function Ae(t,e={}){return new $e(t,e.sync??!1)}class pe{constructor(){this.pool=[],this.maxPoolSize=50,this.maxReusableCapacity=256,this.stats=R?{acquired:0,released:0,rejected:{frozen:0,tooLarge:0,poolFull:0}}:null}acquire(){return R&&this.stats&&this.stats.acquired++,this.pool.pop()??[]}release(e,s){if(!(s&&e===s)){if(Object.isFrozen(e)){R&&this.stats&&this.stats.rejected.frozen++;return}if(e.length>this.maxReusableCapacity){R&&this.stats&&this.stats.rejected.tooLarge++;return}if(this.pool.length>=this.maxPoolSize){R&&this.stats&&this.stats.rejected.poolFull++;return}e.length=0,this.pool.push(e),R&&this.stats&&this.stats.released++}}getStats(){if(!R||!this.stats)return null;const{acquired:e,released:s,rejected:n}=this.stats,i=n.frozen+n.tooLarge+n.poolFull;return{acquired:e,released:s,rejected:n,leaked:e-s-i,poolSize:this.pool.length}}reset(){this.pool.length=0,R&&this.stats&&(this.stats.acquired=0,this.stats.released=0,this.stats.rejected={frozen:0,tooLarge:0,poolFull:0})}}const I=Object.freeze([]),A=Object.freeze([]),C=Object.freeze([]),L=new pe,z=new pe,x=new pe;function et(t,e,s,n){if(e!==I&&s!==A)for(let r=0;r<e.length;r++){const o=e[r];o&&(o._tempUnsub=s[r])}const i=z.acquire();i.length=t.length;for(let r=0;r<t.length;r++){const o=t[r];o&&(o._tempUnsub?(i[r]=o._tempUnsub,o._tempUnsub=void 0):(O.checkCircular(o,n),i[r]=o.subscribe(n)))}if(e!==I)for(let r=0;r<e.length;r++){const o=e[r];o?._tempUnsub&&(o._tempUnsub(),o._tempUnsub=void 0)}return s!==A&&z.release(s),i}function H(t,e,s){if(t instanceof TypeError)return new e(`Type error (${s}): ${t.message}`,t);if(t instanceof ReferenceError)return new e(`Reference error (${s}): ${t.message}`,t);if(t instanceof F)return t;const n=t instanceof Error?t.message:String(t),i=t instanceof Error?t:null;return new e(`Unexpected error (${s}): ${n}`,i)}const xe=f.RESOLVED|f.PENDING|f.REJECTED,re=Array(xe+1).fill(Z.IDLE);re[f.RESOLVED]=Z.RESOLVED,re[f.PENDING]=Z.PENDING,re[f.REJECTED]=Z.REJECTED;class we extends De{constructor(e,s={}){if(typeof e!="function")throw new G(m.COMPUTED_MUST_BE_FUNCTION);if(super(),this._cachedErrors=null,this._errorCacheEpoch=-1,this._value=void 0,this.flags=f.DIRTY|f.IDLE,this._error=null,this._promiseId=0,this._equal=s.equal??Object.is,this._fn=e,this._defaultValue="defaultValue"in s?s.defaultValue:ge,this._hasDefaultValue=this._defaultValue!==ge,this._onError=s.onError??null,this.MAX_PROMISE_ID=Number.MAX_SAFE_INTEGER-1,this._functionSubscribersStore=new ie,this._objectSubscribersStore=new ie,this._dependencies=I,this._dependencyVersions=C,this._unsubscribes=A,this._notifyJob=()=>{this._functionSubscribersStore.forEachSafe(n=>n(),n=>console.error(n)),this._objectSubscribersStore.forEachSafe(n=>n.execute(),n=>console.error(n))},this._trackable=Object.assign(()=>this._markDirty(),{addDependency:n=>{}}),O.attachDebugInfo(this,"computed",this.id),O.enabled){const n=this;n.subscriberCount=()=>this._functionSubscribersStore.size+this._objectSubscribersStore.size,n.isDirty=()=>this._isDirty(),n.dependencies=this._dependencies,n.stateFlags=this._getFlagsAsString()}if(s.lazy===!1)try{this._recompute()}catch{}}get _functionSubscribers(){return this._functionSubscribersStore}get _objectSubscribers(){return this._objectSubscribersStore}get value(){return this._registerTracking(),this._computeValue()}peek(){return this._value}get state(){return this._registerTracking(),this._getAsyncState()}get hasError(){if(this._registerTracking(),this._isRejected())return!0;for(let e=0;e<this._dependencies.length;e++){const s=this._dependencies[e];if(s&&"hasError"in s&&s.hasError)return!0}return!1}get isValid(){return!this.hasError}get errors(){if(this._registerTracking(),!this.hasError)return Xe;const e=Ye();if(this._errorCacheEpoch===e&&this._cachedErrors!==null)return this._cachedErrors;const s=new Set;this._error&&s.add(this._error);for(let n=0;n<this._dependencies.length;n++){const i=this._dependencies[n];if(i&&"errors"in i){const r=i.errors;for(let o=0;o<r.length;o++){const c=r[o];c&&s.add(c)}}}return this._cachedErrors=Object.freeze([...s]),this._errorCacheEpoch=e,this._cachedErrors}get lastError(){return this._registerTracking(),this._error}get isPending(){return this._registerTracking(),this._isPending()}get isResolved(){return this._registerTracking(),this._isResolved()}invalidate(){this._markDirty(),this._dependencyVersions!==C&&(x.release(this._dependencyVersions),this._dependencyVersions=C),this._errorCacheEpoch=-1,this._cachedErrors=null}dispose(){if(this._unsubscribes!==A){for(let e=0;e<this._unsubscribes.length;e++){const s=this._unsubscribes[e];s&&s()}z.release(this._unsubscribes),this._unsubscribes=A}this._dependencies!==I&&(L.release(this._dependencies),this._dependencies=I),this._dependencyVersions!==C&&(x.release(this._dependencyVersions),this._dependencyVersions=C),this._functionSubscribersStore.clear(),this._objectSubscribersStore.clear(),this.flags=f.DIRTY|f.IDLE,this._error=null,this._value=void 0,this._promiseId=(this._promiseId+1)%this.MAX_PROMISE_ID,this._cachedErrors=null,this._errorCacheEpoch=-1}_isDirty(){return(this.flags&f.DIRTY)!==0}_setDirty(){this.flags|=f.DIRTY}_clearDirty(){this.flags&=-2}_isIdle(){return(this.flags&f.IDLE)!==0}_setIdle(){this.flags|=f.IDLE,this.flags&=-29}_isPending(){return(this.flags&f.PENDING)!==0}_setPending(){this.flags|=f.PENDING,this.flags&=-27}_isResolved(){return(this.flags&f.RESOLVED)!==0}_setResolved(){this.flags|=f.RESOLVED,this.flags&=-87}_isRejected(){return(this.flags&f.REJECTED)!==0}_setRejected(){this.flags|=f.REJECTED|f.HAS_ERROR,this.flags&=-15}_isRecomputing(){return(this.flags&f.RECOMPUTING)!==0}_setRecomputing(e){const s=f.RECOMPUTING;this.flags=this.flags&~s|-Number(e)&s}_getAsyncState(){return re[this.flags&xe]}_getFlagsAsString(){const e=[];return this._isDirty()&&e.push("DIRTY"),this._isIdle()&&e.push("IDLE"),this._isPending()&&e.push("PENDING"),this._isResolved()&&e.push("RESOLVED"),this._isRejected()&&e.push("REJECTED"),this._isRecomputing()&&e.push("RECOMPUTING"),e.join(" | ")}_computeValue(){return this._isRecomputing()?this._value:((this._isDirty()||this._isIdle())&&this._recompute(),this._isPending()?this._handlePending():this._isRejected()?this._handleRejected():this._value)}_recompute(){if(this._isRecomputing())return;this._setRecomputing(!0);const e=this._prepareComputationContext();let s=!1;try{const n=q.run(this._trackable,this._fn);this._commitDependencies(e),s=!0,Ne(n)?this._handleAsyncComputation(n):this._handleSyncResult(n)}catch(n){if(!s)try{this._commitDependencies(e),s=!0}catch(i){this._handleComputationError(i)}this._handleComputationError(n)}finally{this._cleanupContext(e,s),this._setRecomputing(!1)}}_prepareComputationContext(){const e=this._dependencies,s=this._dependencyVersions,n=L.acquire(),i=x.acquire(),r=Ie(),o={depCount:0},c=_=>{_._lastSeenEpoch!==r&&(_._lastSeenEpoch=r,o.depCount<n.length?(n[o.depCount]=_,i[o.depCount]=_.version):(n.push(_),i.push(_.version)),o.depCount++)},d=this._trackable.addDependency;return this._trackable.addDependency=c,{prevDeps:e,prevVersions:s,nextDeps:n,nextVersions:i,originalAdd:d,state:o}}_commitDependencies(e){const{nextDeps:s,nextVersions:n,state:i,prevDeps:r}=e;s.length=i.depCount,n.length=i.depCount,this._unsubscribes=et(s,r,this._unsubscribes,this),this._dependencies=s,this._dependencyVersions=n}_cleanupContext(e,s){this._trackable.addDependency=e.originalAdd,s?(e.prevDeps!==I&&L.release(e.prevDeps),e.prevVersions!==C&&x.release(e.prevVersions)):(L.release(e.nextDeps),x.release(e.nextVersions))}_handleSyncResult(e){const s=!this._isResolved()||!this._equal(this._value,e);this.version=this.version+Number(s)&B,this._value=e,this._clearDirty(),this._setResolved(),this._error=null,this._setRecomputing(!1),this._cachedErrors=null,this._errorCacheEpoch=-1}_handleAsyncComputation(e){this._setPending(),this._clearDirty(),this._notifyJob(),this._promiseId=this._promiseId>=this.MAX_PROMISE_ID?1:this._promiseId+1;const s=this._promiseId;e.then(n=>{s===this._promiseId&&this._handleAsyncResolution(n)}).catch(n=>{s===this._promiseId&&this._handleAsyncRejection(n)})}_handleAsyncResolution(e){const s=!this._isResolved()||!this._equal(this._value,e);this.version=this.version+Number(s)&B,this._value=e,this._clearDirty(),this._setResolved(),this._error=null,this._setRecomputing(!1),this._cachedErrors=null,this._errorCacheEpoch=-1,this._notifyJob()}_handleAsyncRejection(e){const s=H(e,G,m.COMPUTED_ASYNC_COMPUTATION_FAILED),n=!this._isRejected();if(this.version=this.version+Number(n)&B,this._error=s,this._setRejected(),this._clearDirty(),this._setRecomputing(!1),this._onError)try{this._onError(s)}catch(i){console.error(m.CALLBACK_ERROR_IN_ERROR_HANDLER,i)}this._notifyJob()}_handleComputationError(e){const s=H(e,G,m.COMPUTED_COMPUTATION_FAILED);if(this._error=s,this._setRejected(),this._clearDirty(),this._setRecomputing(!1),this._onError)try{this._onError(s)}catch(n){console.error(m.CALLBACK_ERROR_IN_ERROR_HANDLER,n)}throw s}_handlePending(){if(this._hasDefaultValue)return this._defaultValue;throw new G(m.COMPUTED_ASYNC_PENDING_NO_DEFAULT)}_handleRejected(){if(this._error?.recoverable&&this._hasDefaultValue)return this._defaultValue;throw this._error}execute(){this._markDirty()}_markDirty(){this._isRecomputing()||this._isDirty()||(this._setDirty(),this._notifyJob())}_registerTracking(){const e=q.getCurrent();if(e){if(Re(e)){e.addDependency(this);return}if(Ue(e)){this._functionSubscribersStore.add(e);return}Oe(e)&&this._objectSubscribersStore.add(e)}}}Object.freeze(we.prototype);function ke(t,e={}){return new we(t,e)}class tt extends ye{constructor(e,s={}){super(),this.run=()=>{if(this.isDisposed)throw new M(m.EFFECT_MUST_BE_FUNCTION);this._dependencyVersions!==C&&(x.release(this._dependencyVersions),this._dependencyVersions=C),this.execute()},this.dispose=()=>{if(!this.isDisposed){if(this._setDisposed(),this._safeCleanup(),this._unsubscribes!==A){for(let n=0;n<this._unsubscribes.length;n++){const i=this._unsubscribes[n];i&&i()}z.release(this._unsubscribes),this._unsubscribes=A}this._dependencies!==I&&(L.release(this._dependencies),this._dependencies=I),this._dependencyVersions!==C&&(x.release(this._dependencyVersions),this._dependencyVersions=C)}},this.addDependency=n=>{if(this.isExecuting&&this._nextDeps&&this._nextUnsubs&&this._nextVersions){const i=this._currentEpoch;if(n._lastSeenEpoch===i)return;n._lastSeenEpoch=i,this._nextDeps.push(n),this._nextVersions.push(n.version),n._tempUnsub?(this._nextUnsubs.push(n._tempUnsub),n._tempUnsub=void 0):this._subscribeTo(n)}},this.execute=()=>{if(this.isDisposed||this.isExecuting||!this._shouldExecute())return;this._checkInfiniteLoop(),this._setExecuting(!0),this._safeCleanup();const n=this._prepareEffectContext();let i=!1;try{const r=q.run(this,this._fn);this._commitEffect(n),i=!0,this._checkLoopWarnings(),Ne(r)?r.then(o=>{!this.isDisposed&&typeof o=="function"&&(this._cleanup=o)}).catch(o=>{console.error(H(o,M,m.EFFECT_EXECUTION_FAILED))}):this._cleanup=typeof r=="function"?r:null}catch(r){i=!0,console.error(H(r,M,m.EFFECT_EXECUTION_FAILED)),this._cleanup=null}finally{this._cleanupEffect(n,i),this._setExecuting(!1)}},this._currentEpoch=-1,this._lastFlushEpoch=-1,this._executionsInEpoch=0,this._fn=e,this._sync=s.sync??!1,this._maxExecutions=s.maxExecutionsPerSecond??V.MAX_EXECUTIONS_PER_SECOND,this._maxExecutionsPerFlush=s.maxExecutionsPerFlush??V.MAX_EXECUTIONS_PER_EFFECT,this._trackModifications=s.trackModifications??!1,this._cleanup=null,this._dependencies=I,this._dependencyVersions=C,this._unsubscribes=A,this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null,this._history=R?[]:null,this._executionCount=0,O.attachDebugInfo(this,"effect",this.id)}_prepareEffectContext(){const e=this._dependencies,s=this._dependencyVersions,n=this._unsubscribes,i=L.acquire(),r=x.acquire(),o=z.acquire(),c=Ie();if(e!==I&&n!==A)for(let d=0;d<e.length;d++){const _=e[d];_&&(_._tempUnsub=n[d])}return this._nextDeps=i,this._nextVersions=r,this._nextUnsubs=o,this._currentEpoch=c,{prevDeps:e,prevVersions:s,prevUnsubs:n,nextDeps:i,nextVersions:r,nextUnsubs:o}}_commitEffect(e){const s=e.nextDeps.length;e.nextDeps.length=s,e.nextVersions.length=s,this._dependencies=e.nextDeps,this._dependencyVersions=e.nextVersions,this._unsubscribes=e.nextUnsubs}_cleanupEffect(e,s){if(this._nextDeps=null,this._nextVersions=null,this._nextUnsubs=null,s){if(e.prevDeps!==I){for(let n=0;n<e.prevDeps.length;n++){const i=e.prevDeps[n];i?._tempUnsub&&(i._tempUnsub(),i._tempUnsub=void 0)}L.release(e.prevDeps)}e.prevUnsubs!==A&&z.release(e.prevUnsubs),e.prevVersions!==C&&x.release(e.prevVersions)}else{L.release(e.nextDeps),x.release(e.nextVersions);for(let n=0;n<e.nextUnsubs.length;n++)e.nextUnsubs[n]?.();if(z.release(e.nextUnsubs),e.prevDeps!==I)for(let n=0;n<e.prevDeps.length;n++){const i=e.prevDeps[n];i&&(i._tempUnsub=void 0)}}}_subscribeTo(e){try{const s=e.subscribe(()=>{this._trackModifications&&this.isExecuting&&(e._modifiedAtEpoch=this._currentEpoch),this._sync?this.execute():J.schedule(this.execute)});this._nextUnsubs&&this._nextUnsubs.push(s)}catch(s){console.error(H(s,M,m.EFFECT_EXECUTION_FAILED)),this._nextUnsubs&&this._nextUnsubs.push(()=>{})}}get isDisposed(){return(this.flags&$.DISPOSED)!==0}get executionCount(){return this._executionCount}get isExecuting(){return(this.flags&$.EXECUTING)!==0}_setDisposed(){this.flags|=$.DISPOSED}_setExecuting(e){const s=$.EXECUTING;this.flags=this.flags&~s|-Number(e)&s}_safeCleanup(){if(this._cleanup){try{this._cleanup()}catch(e){console.error(H(e,M,m.EFFECT_CLEANUP_FAILED))}this._cleanup=null}}_checkInfiniteLoop(){if(this._lastFlushEpoch!==se&&(this._lastFlushEpoch=se,this._executionsInEpoch=0),this._executionsInEpoch++,this._executionsInEpoch>this._maxExecutionsPerFlush&&this._throwInfiniteLoopError("per-effect"),Ke()>V.MAX_EXECUTIONS_PER_FLUSH&&this._throwInfiniteLoopError("global"),this._executionCount++,this._history){const e=Date.now();this._history.push(e),this._history.length>V.MAX_EXECUTIONS_PER_SECOND+10&&this._history.shift(),this._checkTimestampLoop(e)}}_checkTimestampLoop(e){const s=this._history;if(!s||this._maxExecutions<=0)return;const n=e-ze.ONE_SECOND_MS;let i=0;for(let r=s.length-1;r>=0&&!(s[r]<n);r--)i++;if(i>this._maxExecutions){const r=new M(`Effect executed ${i} times within 1 second. Infinite loop suspected`);if(this.dispose(),console.error(r),R)throw r}}_throwInfiniteLoopError(e){const s=new M(`Infinite loop detected (${e}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${fe}`);throw this.dispose(),console.error(s),s}_shouldExecute(){if(this._dependencies===I||this._dependencyVersions===C)return!0;for(let e=0;e<this._dependencies.length;e++){const s=this._dependencies[e];if(s){if("value"in s)try{de(()=>s.value)}catch{return!0}if(s.version!==this._dependencyVersions[e])return!0}}return!1}_checkLoopWarnings(){if(this._trackModifications&&O.enabled){const e=this._dependencies;for(let s=0;s<e.length;s++){const n=e[s];n&&n._modifiedAtEpoch===this._currentEpoch&&O.warn(!0,`Effect is reading a dependency (${O.getDebugName(n)||"unknown"}) that it just modified. Infinite loop may occur`)}}}}function y(t,e={}){if(typeof t!="function")throw new M(m.EFFECT_MUST_BE_FUNCTION);const s=new tt(t,e);return s.execute(),s}function b(t){return t!==null&&typeof t=="object"&&"value"in t&&"subscribe"in t}function g(t){return b(t)?t.value:t}function oe(t){const e=t.jquery?t[0]:t;if(!e)return"unknown";if(e.id)return`#${e.id}`;if(e.className){const s=String(e.className).split(/\s+/).filter(Boolean).join(".");return s?`${e.tagName.toLowerCase()}.${s}`:e.tagName.toLowerCase()}return e.tagName.toLowerCase()}function st(){if(typeof window<"u"){const t=window.__ATOM_DEBUG__;if(typeof t=="boolean")return t}try{if(typeof process<"u"&&process.env&&process.env.NODE_ENV==="development")return!0}catch{}return!1}let X=st();const h={get enabled(){return X},set enabled(t){X=t},log(t,...e){X&&console.log(`[atom-effect-jquery] ${t}:`,...e)},atomChanged(t,e,s){X&&console.log(`[atom-effect-jquery] Atom "${t||"anonymous"}" changed:`,e,"→",s)},domUpdated(t,e,s){if(!X)return;const n=oe(t);console.log(`[atom-effect-jquery] DOM updated: ${n}.${e} =`,s),nt(t)},cleanup(t){X&&console.log(`[atom-effect-jquery] Cleanup: ${t}`)},warn(...t){X&&console.warn("[atom-effect-jquery]",...t)}};function nt(t){const e=t[0];if(!e||!document.contains(e))return;const s="atom_debug_timer",n="atom_debug_cleanup_timer",i="atom_debug_org_style";clearTimeout(t.data(s)),clearTimeout(t.data(n)),t.data(i)||t.data(i,{outline:t.css("outline"),outlineOffset:t.css("outline-offset"),transition:t.css("transition")}),t.css({outline:"2px solid rgba(255, 68, 68, 0.8)","outline-offset":"1px",transition:"none"});const r=setTimeout(()=>{const o=t.data(i);t.css("transition","outline 0.5s ease-out"),requestAnimationFrame(()=>{t.css({outline:o?.outline||"","outline-offset":o?.outlineOffset||""});const c=setTimeout(()=>{t.css("transition",o?.transition||""),t.removeData(s),t.removeData(n),t.removeData(i)},500);t.data(n,c)})},100);t.data(s,r)}const it=new WeakMap;function Fe(t,e={}){const s=Ae(t,e);return e.name&&it.set(s,{name:e.name}),s}Object.defineProperty(Fe,"debug",{get(){return h.enabled},set(t){h.enabled=t}});function rt(){return new Promise(t=>setTimeout(t,0))}u.extend({atom:Fe,computed:ke,effect:y,batch:j,untracked:de,isAtom:_e,isComputed:Te,isReactive:t=>_e(t)||Te(t),nextTick:rt});function Me(){return{timeoutId:null,phase:"idle",hasFocus:!1}}function je(t,e,s={}){const{debounce:n,event:i="input",parse:r=p=>p,format:o=p=>String(p??"")}=s,c=Me(),d=()=>{c.phase="composing"},_=()=>{c.phase="idle",P()};t.on("compositionstart",d),t.on("compositionend",_);const v=()=>{c.hasFocus=!0},D=()=>{c.hasFocus=!1;const p=o(e.value);t.val()!==p&&t.val(p)};t.on("focus",v),t.on("blur",D);const P=()=>{c.phase==="idle"&&(c.phase="syncing-to-atom",j(()=>{e.value=r(t.val())}),c.phase="idle")},T=()=>{c.phase==="idle"&&(n?(c.timeoutId&&clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(P,n)):P())};return t.on(i,T),t.on("change",T),{effect:()=>{const p=o(e.value),Q=t.val();if(Q!==p){if(c.hasFocus&&r(Q)===e.value)return;c.phase="syncing-to-dom",t.val(p),h.domUpdated(t,"val",p),c.phase="idle"}},cleanup:()=>{t.off(i,T),t.off("change",T),t.off("compositionstart",d),t.off("compositionend",_),t.off("focus",v),t.off("blur",D),c.timeoutId&&clearTimeout(c.timeoutId)}}}class ot{effects=new WeakMap;cleanups=new WeakMap;boundElements=new WeakSet;preservedNodes=new WeakSet;keep(e){this.preservedNodes.add(e)}isKept(e){return this.preservedNodes.has(e)}trackEffect(e,s){const n=this.effects.get(e)||[];n.push(s),this.effects.set(e,n),this.boundElements.add(e)}trackCleanup(e,s){const n=this.cleanups.get(e)||[];n.push(s),this.cleanups.set(e,n),this.boundElements.add(e)}hasBind(e){return this.boundElements.has(e)}cleanup(e){if(!this.boundElements.has(e))return;h.cleanup(oe(e));const s=this.effects.get(e);s&&(this.effects.delete(e),s.forEach(i=>{try{i.dispose()}catch(r){h.warn("Effect dispose error:",r)}}));const n=this.cleanups.get(e);n&&(this.cleanups.delete(e),n.forEach(i=>{try{i()}catch(r){h.warn("Cleanup error:",r)}})),this.boundElements.delete(e)}cleanupTree(e){e.querySelectorAll("*").forEach(n=>{this.boundElements.has(n)&&this.cleanup(n)}),this.cleanup(e)}}const a=new ot;let Y=null;function Le(t=document.body){Y||(Y=new MutationObserver(e=>{for(const s of e)s.removedNodes.forEach(n=>{a.isKept(n)||n.isConnected||n.nodeType===1&&a.cleanupTree(n)})}),Y.observe(t,{childList:!0,subtree:!0}))}function ct(){Y?.disconnect(),Y=null}u.fn.atomText=function(t,e){return this.each(function(){const s=u(this);if(b(t)){const n=y(()=>{const i=g(t),r=e?e(i):String(i??"");s.text(r),h.domUpdated(s,"text",r)});a.trackEffect(this,n)}else{const n=e?e(t):String(t??"");s.text(n)}})},u.fn.atomHtml=function(t){return this.each(function(){const e=u(this);if(b(t)){const s=y(()=>{const n=String(g(t)??"");e.html(n),h.domUpdated(e,"html",n)});a.trackEffect(this,s)}else e.html(String(t??""))})},u.fn.atomClass=function(t,e){return this.each(function(){const s=u(this);if(b(e)){const n=y(()=>{const i=!!g(e);s.toggleClass(t,i),h.domUpdated(s,`class.${t}`,i)});a.trackEffect(this,n)}else s.toggleClass(t,!!e)})},u.fn.atomCss=function(t,e,s){return this.each(function(){const n=u(this);if(b(e)){const i=y(()=>{const r=g(e),o=s?`${r}${s}`:r;n.css(t,o),h.domUpdated(n,`css.${t}`,o)});a.trackEffect(this,i)}else n.css(t,s?`${e}${s}`:e)})},u.fn.atomAttr=function(t,e){return this.each(function(){const s=u(this),n=i=>{i==null||i===!1?s.removeAttr(t):i===!0?s.attr(t,t):s.attr(t,String(i)),h.domUpdated(s,`attr.${t}`,i)};if(b(e)){const i=y(()=>n(g(e)));a.trackEffect(this,i)}else n(e)})},u.fn.atomProp=function(t,e){return this.each(function(){const s=u(this);if(b(e)){const n=y(()=>{const i=g(e);s.prop(t,i),h.domUpdated(s,`prop.${t}`,i)});a.trackEffect(this,n)}else s.prop(t,e)})},u.fn.atomShow=function(t){return this.each(function(){const e=u(this);if(b(t)){const s=y(()=>{const n=!!g(t);e.toggle(n),h.domUpdated(e,"show",n)});a.trackEffect(this,s)}else e.toggle(!!t)})},u.fn.atomHide=function(t){return this.each(function(){const e=u(this);if(b(t)){const s=y(()=>{const n=!g(t);e.toggle(n),h.domUpdated(e,"hide",!n)});a.trackEffect(this,s)}else e.toggle(!t)})},u.fn.atomVal=function(t,e={}){return this.each(function(){const{effect:s,cleanup:n}=je(u(this),t,e),i=y(s);a.trackEffect(this,i),a.trackCleanup(this,n)})},u.fn.atomChecked=function(t){return this.each(function(){const e=u(this);let s=!1;const n=()=>{s||j(()=>{t.value=e.prop("checked")})};e.on("change",n),a.trackCleanup(this,()=>e.off("change",n));const i=y(()=>{s=!0,e.prop("checked",t.value),h.domUpdated(e,"checked",t.value),s=!1});a.trackEffect(this,i)})},u.fn.atomOn=function(t,e){return this.each(function(){const s=u(this),n=function(i){j(()=>e.call(this,i))};s.on(t,n),a.trackCleanup(this,()=>s.off(t,n))})},u.fn.atomUnbind=function(){return this.each(function(){a.cleanupTree(this)})};function ut(t,e){b(e)?t.effects.push(()=>{const s=String(g(e)??"");t.$el.text(s),h.domUpdated(t.$el,"text",s)}):t.$el.text(String(e??""))}function ht(t,e){b(e)?t.effects.push(()=>{const s=String(g(e)??"");t.$el.html(s),h.domUpdated(t.$el,"html",s)}):t.$el.html(String(e??""))}function at(t,e){for(const[s,n]of Object.entries(e))b(n)?t.effects.push(()=>{const i=!!g(n);t.$el.toggleClass(s,i),h.domUpdated(t.$el,`class.${s}`,i)}):t.$el.toggleClass(s,!!n)}function lt(t,e){for(const[s,n]of Object.entries(e))if(Array.isArray(n)){const[i,r]=n;b(i)?t.effects.push(()=>{const o=`${g(i)}${r}`;t.$el.css(s,o),h.domUpdated(t.$el,`css.${s}`,o)}):t.$el.css(s,`${i}${r}`)}else b(n)?t.effects.push(()=>{const i=g(n);t.$el.css(s,i),h.domUpdated(t.$el,`css.${s}`,i)}):t.$el.css(s,n)}function ft(t,e){for(const[s,n]of Object.entries(e)){const i=r=>{r==null||r===!1?t.$el.removeAttr(s):r===!0?t.$el.attr(s,s):t.$el.attr(s,String(r)),h.domUpdated(t.$el,`attr.${s}`,r)};b(n)?t.effects.push(()=>i(g(n))):i(n)}}function dt(t,e){for(const[s,n]of Object.entries(e))b(n)?t.effects.push(()=>{const i=g(n);t.$el.prop(s,i),h.domUpdated(t.$el,`prop.${s}`,i)}):t.$el.prop(s,n)}function _t(t,e){b(e)?t.effects.push(()=>{const s=!!g(e);t.$el.toggle(s),h.domUpdated(t.$el,"show",s)}):t.$el.toggle(!!e)}function pt(t,e){b(e)?t.effects.push(()=>{const s=!g(e);t.$el.toggle(s),h.domUpdated(t.$el,"hide",!s)}):t.$el.toggle(!e)}function bt(t,e){const s=Array.isArray(e)?e[0]:e,n=Array.isArray(e)?e[1]:{},{effect:i,cleanup:r}=je(t.$el,s,n);t.effects.push(i),t.trackCleanup(r)}function Et(t,e){const s=Me(),n=()=>{s.phase==="idle"&&j(()=>{e.value=t.$el.prop("checked")})};t.$el.on("change",n),t.trackCleanup(()=>t.$el.off("change",n)),t.effects.push(()=>{s.phase="syncing-to-dom",t.$el.prop("checked",e.value),h.domUpdated(t.$el,"checked",e.value),s.phase="idle"})}function gt(t,e){for(const[s,n]of Object.entries(e)){const i=function(r){j(()=>n.call(this,r))};t.$el.on(s,i),t.trackCleanup(()=>t.$el.off(s,i))}}u.fn.atomBind=function(t){return this.each(function(){const e=u(this),s=[],n={$el:e,el:this,effects:s,trackCleanup:i=>a.trackCleanup(this,i)};t.text!==void 0&&ut(n,t.text),t.html!==void 0&&ht(n,t.html),t.class&&at(n,t.class),t.css&<(n,t.css),t.attr&&ft(n,t.attr),t.prop&&dt(n,t.prop),t.show!==void 0&&_t(n,t.show),t.hide!==void 0&&pt(n,t.hide),t.val!==void 0&&bt(n,t.val),t.checked!==void 0&&Et(n,t.checked),t.on&>(n,t.on),s.forEach(i=>{const r=y(i);a.trackEffect(this,r)})})};function mt(t){if(t.length===0)return[];const e=t.slice(),s=[0];let n,i,r,o;const c=t.length;for(n=0;n<c;n++){const v=t[n];if(v!==-1){const D=s[s.length-1];if(t[D]<v){e[n]=D,s.push(n);continue}for(i=0,r=s.length-1;i<r;)o=(i+r)/2|0,t[s[o]]<v?i=o+1:r=o;v<t[s[i]]&&(i>0&&(e[n]=s[i-1]),s[i]=n)}}let d=s.length,_=s[d-1];for(;d-- >0;)s[d]=_,_=e[_];return s}u.fn.atomList=function(t,e){return this.each(function(){const s=u(this),n=oe(this),{key:i,render:r,bind:o,onAdd:c,onRemove:d,empty:_}=e,v=typeof i=="function"?i:p=>p[i],D=new Map;let P=[],T=null;const ue=new Set,Ve=y(()=>{const p=t.value,Q=[],Be=new Set;for(let l=0;l<p.length;l++){const S=p[l],U=v(S,l);Q.push(U),Be.add(U)}if(h.log("list",`${n} updating with ${p.length} items`),p.length===0&&_){T||(T=u(_),s.append(T));for(const[,l]of D){l.$el.remove();const S=l.$el[0];S&&a.cleanup(S)}D.clear(),P=[];return}else T&&(T.remove(),T=null);for(const[l,S]of D)if(!Be.has(l)){if(ue.has(l))continue;const U=()=>{S.$el.remove();const he=S.$el[0];he&&a.cleanup(he),ue.delete(l),h.log("list",`${n} removed item:`,l)};D.delete(l),ue.add(l),d?Promise.resolve(d(S.$el)).then(U):U()}const qe=new Map;P.forEach((l,S)=>qe.set(l,S));const yt=Q.map(l=>qe.get(l)??-1),Dt=mt(yt),It=new Set(Dt);let w=null;for(let l=p.length-1;l>=0;l--){const S=Q[l],U=p[l],he=It.has(l);if(D.has(S)){const N=D.get(S);if(!N)continue;N.item=U;const k=N.$el[0];if(!k)continue;if(e.update&&e.update(N.$el,U,l),!he)w?N.$el.insertBefore(w):N.$el.appendTo(s);else{const W=k.nextSibling;w&&W!==w?N.$el.insertBefore(w):!w&&W&&N.$el.appendTo(s)}w=k}else{const N=r(U,l),k=(N instanceof Element,u(N));D.set(S,{$el:k,item:U}),w?k.insertBefore(w):k.appendTo(s),o&&o(k,U,l),c&&c(k),h.log("list",`${n} added item:`,S);const W=k[0];W&&(w=W)}}P=Q});a.trackEffect(this,Ve),a.trackCleanup(this,()=>{D.clear(),P=[],T?.remove()})})};const ce=new WeakMap;u.fn.atomMount=function(t,e={}){return this.each(function(){const s=u(this),n=oe(this),i=ce.get(this);i&&(h.log("mount",`${n} unmounting existing component`),i()),h.log("mount",`${n} mounting component`);let r;try{r=t(s,e)}catch(d){console.error("[atom-effect-jquery] Mount error:",d);return}let o=!1;const c=()=>{if(!o){if(o=!0,h.log("mount",`${n} full cleanup`),typeof r=="function")try{r()}catch{}a.cleanupTree(this),ce.delete(this)}};ce.set(this,c),a.trackCleanup(this,c)})},u.fn.atomUnmount=function(){return this.each(function(){ce.get(this)?.()})};const K=new WeakMap;let Pe=!1;function be(){if(Pe)return;Pe=!0;const t=u.fn.on,e=u.fn.off,s=u.fn.remove,n=u.fn.empty,i=u.fn.detach;u.fn.remove=function(r){return(r?this.filter(r):this).each(function(){a.cleanupTree(this)}),s.call(this,r)},u.fn.empty=function(){return this.each(function(){this.querySelectorAll("*").forEach(o=>a.cleanup(o))}),n.call(this)},u.fn.detach=function(r){return(r?this.filter(r):this).each(function(){a.keep(this)}),i.call(this,r)},u.fn.on=function(...r){let o=-1;for(let c=r.length-1;c>=0;c--)if(typeof r[c]=="function"){o=c;break}if(o!==-1){const c=r[o];let d;K.has(c)?d=K.get(c):(d=function(..._){let v;return j(()=>{v=c.apply(this,_)}),v},K.set(c,d)),r[o]=d}return t.apply(this,r)},u.fn.off=function(...r){let o=-1;for(let c=r.length-1;c>=0;c--)if(typeof r[c]=="function"){o=c;break}if(o!==-1){const c=r[o];K.has(c)&&(r[o]=K.get(c))}return e.apply(this,r)}}const St=be;be(),u(()=>{Le(document.body)}),E.default=u,E.atom=Ae,E.batch=j,E.computed=ke,E.disableAutoCleanup=ct,E.effect=y,E.enableAutoCleanup=Le,E.enablejQueryBatching=St,E.enablejQueryOverrides=be,E.registry=a,E.untracked=de,Object.defineProperties(E,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
2
|
+
//# sourceMappingURL=atom-effect-jquery.min.js.map
|