@but212/atom-effect-jquery 0.21.2 → 0.22.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.
- package/README.md +1 -1
- package/dist/atom-effect-jquery.min.js +1 -1
- package/dist/atom-effect-jquery.min.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +267 -50
- package/dist/index.mjs +1304 -1078
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atom-effect-jquery.min.js","sources":["../../core/dist/index.mjs","../src/utils.ts","../src/debug.ts","../src/namespace.ts","../src/constants.ts","../src/registry.ts","../src/effect-factory.ts","../src/types.ts","../src/input-binding.ts","../src/unified.ts","../src/chainable.ts","../src/list.ts","../src/mount.ts","../src/route.ts","../src/fetch.ts","../src/jquery-patch.ts","../src/index.ts"],"sourcesContent":["const A = {\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}, l = {\n DISPOSED: 1,\n EXECUTING: 8\n}, K = {\n DISPOSED: 1,\n /** Marker bit: identifies this node as a computed. */\n IS_COMPUTED: 2,\n DIRTY: 8,\n IDLE: 16,\n PENDING: 32,\n RESOLVED: 64,\n REJECTED: 128,\n RECOMPUTING: 256,\n HAS_ERROR: 512\n}, a = {\n DISPOSED: 1,\n SYNC: 8,\n NOTIFICATION_SCHEDULED: 16\n}, Ct = {\n MAX_SIZE: 1e3,\n WARMUP_SIZE: 100,\n ENABLE_STATS: !1\n}, p = {\n // Infinite loop protection\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n // Batch processing limits to prevent blocking the main thread for too long\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n // Memory management\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}, ot = {\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3\n}, X = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1\n}, B = 1073741823, J = typeof process < \"u\" && process.env && !1 || !1, ht = Object.freeze([]);\nclass C extends Error {\n constructor(t, e = null, s = !0) {\n super(t), this.cause = e, this.recoverable = s, this.name = \"AtomError\";\n }\n}\nclass E extends C {\n constructor(t, e = null) {\n super(t, e, !0), this.name = \"ComputedError\";\n }\n}\nclass g extends C {\n constructor(t, e = null) {\n super(t, e, !1), this.name = \"EffectError\";\n }\n}\nclass m extends C {\n constructor(t, e = null) {\n super(t, e, !1), this.name = \"SchedulerError\";\n }\n}\nconst ct = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), ut = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), U = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), L = {\n // Dev mode flag\n enabled: J,\n warnInfiniteLoop: ot.WARN_INFINITE_LOOP,\n warn(i, t) {\n },\n checkCircular(i, t) {\n if (i === t)\n throw new E(\"Direct circular dependency detected\");\n },\n attachDebugInfo(i, t, e) {\n },\n getDebugName: (i) => i?.[ct],\n getDebugType: (i) => i?.[ut]\n};\nlet lt = 1;\nconst _t = () => lt++;\nfunction Z(i, t, e) {\n if (typeof t == \"function\") {\n const n = t;\n for (let r = 0, o = e.length; r < o; r++) {\n const h = e[r];\n if (h && h.fn === n) return;\n }\n e.push(new M(n, void 0));\n return;\n }\n if (\"addDependency\" in t) {\n t.addDependency(i);\n return;\n }\n const s = t;\n for (let n = 0, r = e.length; n < r; n++) {\n const o = e[n];\n if (o && o.sub === s) return;\n }\n e.push(new M(void 0, s));\n}\nfunction G(i, t, e) {\n const s = /* @__PURE__ */ new Map();\n for (let n = 0, r = t.length; n < r; n++) {\n const o = t[n];\n o?.unsub && s.set(o.node, o.unsub);\n }\n for (let n = 0, r = i.length; n < r; n++) {\n const o = i[n];\n if (!o) continue;\n const h = o.node, I = s.get(h);\n I !== void 0 ? (o.unsub = I, s.delete(h)) : (L.checkCircular(h, e), o.unsub = h.subscribe(e));\n }\n for (const n of s.values())\n n();\n}\nclass v {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}\nclass M {\n constructor(t, e) {\n this.fn = t, this.sub = e;\n }\n}\nconst c = {\n // Computed Errors\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n // Atom Errors\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n // Effect Errors\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n // Scheduler Errors\n SCHEDULER_FLUSH_OVERFLOW: (i, t) => `Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,\n // System / Debug\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n // Effect frequency\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\"\n};\nfunction D(i, t, e) {\n if (i instanceof C)\n return i;\n const s = i instanceof Error, n = s ? i.message : String(i), r = s ? i : void 0, h = `${s ? i.constructor.name : \"Unexpected error\"} (${e}): ${n}`;\n return new t(h, r);\n}\nclass tt {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = -1, this.id = _t() & B;\n }\n}\nclass et extends tt {\n /**\n * Adds subscriber.\n */\n subscribe(t) {\n const e = typeof t == \"function\";\n if (!e && (!t || typeof t.execute != \"function\"))\n throw D(\n new TypeError(\"Invalid subscriber\"),\n C,\n c.ATOM_SUBSCRIBER_MUST_BE_FUNCTION\n );\n const s = this._subscribers;\n for (let r = 0, o = s.length; r < o; r++) {\n const h = s[r];\n if (h && (e ? h.fn === t : h.sub === t))\n return () => {\n };\n }\n const n = new M(\n e ? t : void 0,\n e ? void 0 : t\n );\n return s.push(n), () => this._unsubscribe(n);\n }\n _unsubscribe(t) {\n const e = this._subscribers, s = e.indexOf(t);\n if (s === -1) return;\n const n = e.pop();\n s < e.length && n && (e[s] = n);\n }\n subscriberCount() {\n return this._subscribers.length;\n }\n _notifySubscribers(t, e) {\n if (this._subscribers.length === 0) return;\n const s = this._subscribers.slice(0), n = s.length;\n for (let r = 0; r < n; r++) {\n const o = s[r];\n if (o)\n try {\n o.fn ? o.fn(t, e) : o.sub && o.sub.execute();\n } catch (h) {\n this._handleNotifyError(h);\n }\n }\n }\n _handleNotifyError(t) {\n console.error(D(t, C, c.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n}\nlet x = 0;\nconst z = () => (x = x + 1 & B || 1, x), w = (i) => i + 1 & B;\nlet H = 0, k = !1, st = 0;\nconst at = () => st;\nfunction Q() {\n return k ? !1 : (k = !0, st = z(), H = 0, !0);\n}\nconst Y = () => {\n k = !1;\n}, ft = () => k ? ++H : 0;\nclass Et {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isBatching = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = p.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get phase() {\n return this._isProcessing || this._isFlushingSync ? 2 : this._isBatching ? 1 : 0;\n }\n get queueSize() {\n return this._size;\n }\n get isBatching() {\n return this._isBatching;\n }\n /**\n * Schedules job.\n */\n schedule(t) {\n if (t._nextEpoch !== this._epoch) {\n if (t._nextEpoch = this._epoch, this._isBatching || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n this._queueBuffer[this._bufferIndex][this._size++] = t, this._isProcessing || this._flush();\n }\n }\n /**\n * Triggers flush.\n */\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n /**\n * Scheduler loop.\n */\n _runLoop() {\n try {\n if (this._size === 0) return;\n const t = Q();\n this._drainQueue(), t && Y();\n } finally {\n this._isProcessing = !1, this._size > 0 && !this._isBatching && this._flush();\n }\n }\n _flushSync() {\n this._isFlushingSync = !0;\n const t = Q();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = !1, t && Y();\n }\n }\n _mergeBatchQueue() {\n if (this._batchQueueSize === 0) return;\n const t = ++this._epoch, e = this._batchQueue, s = this._queueBuffer[this._bufferIndex];\n let n = this._size;\n for (let r = 0; r < this._batchQueueSize; r++) {\n const o = e[r];\n o._nextEpoch !== t && (o._nextEpoch = t, s[n++] = o);\n }\n this._size = n, this._batchQueueSize = 0, e.length > p.BATCH_QUEUE_SHRINK_THRESHOLD && (e.length = 0);\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._processQueue(), this._mergeBatchQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, e = this._queueBuffer[t], s = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch++;\n for (let n = 0; n < s; n++)\n try {\n e[n]();\n } catch (r) {\n console.error(new m(\"Error occurred during scheduler execution\", r));\n }\n e.length = 0;\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n if (console.error(\n new m(\n c.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t)\n )\n ), this._size = 0, this._queueBuffer[this._bufferIndex].length = 0, this._batchQueueSize = 0, this.onOverflow)\n try {\n this.onOverflow(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++, this._isBatching = !0;\n }\n endBatch() {\n this._batchDepth !== 0 && --this._batchDepth === 0 && (this._flushSync(), this._isBatching = !1);\n }\n setMaxFlushIterations(t) {\n if (t < p.MIN_FLUSH_ITERATIONS)\n throw new m(\n `Max flush iterations must be at least ${p.MIN_FLUSH_ITERATIONS}`\n );\n this._maxFlushIterations = t;\n }\n}\nconst b = new Et(), V = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), it = /* @__PURE__ */ Symbol.for(\"atom-effect/computed\"), nt = /* @__PURE__ */ Symbol.for(\"atom-effect/effect\"), _ = {\n /** Active listener. */\n current: null,\n /**\n * Executes in context.\n *\n * @param listener - The subscriber.\n * @param fn - The logic to execute.\n * @returns The result of `fn`.\n */\n run(i, t) {\n const e = this.current;\n this.current = i;\n try {\n return t();\n } finally {\n this.current = e;\n }\n }\n};\nfunction Tt(i) {\n const t = _.current;\n if (t === null) return i();\n _.current = null;\n try {\n return i();\n } finally {\n _.current = t;\n }\n}\nvar j;\nclass dt extends et {\n constructor(t, e) {\n super(), this._pendingOldValue = void 0, this._notifyTask = () => this._flushNotifications(), this._subscribers = [], this[j] = !0, this._value = t, e && (this.flags |= a.SYNC), L.attachDebugInfo(this, \"atom\", this.id);\n }\n get value() {\n const t = _.current;\n return t && Z(this, t, this._subscribers), this._value;\n }\n set value(t) {\n const e = this._value;\n if (Object.is(e, t)) return;\n this._value = t, this.version = w(this.version);\n const s = this.flags;\n if (!(this._subscribers.length === 0 || s & a.NOTIFICATION_SCHEDULED)) {\n if (this._pendingOldValue = e, this.flags = s | a.NOTIFICATION_SCHEDULED, s & a.SYNC && !b.isBatching) {\n this._flushNotifications();\n return;\n }\n b.schedule(this._notifyTask);\n }\n }\n /**\n * Triggers subscribers.\n */\n _flushNotifications() {\n const t = this.flags;\n if (!(t & a.NOTIFICATION_SCHEDULED) || t & a.DISPOSED)\n return;\n const e = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags &= -17, this._notifySubscribers(this._value, e);\n }\n peek() {\n return this._value;\n }\n dispose() {\n this.flags & a.DISPOSED || (this._subscribers.length = 0, this.flags |= a.DISPOSED, this._value = void 0, this._pendingOldValue = void 0);\n }\n [(j = V, Symbol.dispose)]() {\n this.dispose();\n }\n}\nfunction Ot(i, t = {}) {\n return new dt(i, t.sync ?? !1);\n}\nclass pt {\n /**\n * @param limit - Max unique arrays to hold (default: 50). Prevents the pool itself from consuming too much memory.\n * @param capacity - Max length of an array to accept (default: 256).\n * @param enableStats - Force-enable stats even in production (default: false).\n */\n constructor(t = 50, e = 256, s = !1) {\n this.limit = t, this.capacity = e, this.pool = [], this.stats = null, this.stats = s ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 }\n } : null;\n }\n /**\n * Acquires array.\n */\n acquire() {\n return this.stats && this.stats.acquired++, this.pool.pop() ?? [];\n }\n /**\n * Releases array.\n *\n * @param arr - Array to release.\n * @param emptyConst - Optional empty constant.\n */\n release(t, e) {\n if (!(e && t === e)) {\n if (t.length > this.capacity) {\n this.stats && this.stats.rejected.tooLarge++;\n return;\n }\n if (this.pool.length >= this.limit) {\n this.stats && this.stats.rejected.poolFull++;\n return;\n }\n if (Object.isFrozen(t)) {\n this.stats && this.stats.rejected.frozen++;\n return;\n }\n t.length = 0, this.pool.push(t), this.stats && this.stats.released++;\n }\n }\n /**\n * Pool stats.\n */\n getStats() {\n if (!this.stats) return null;\n const { acquired: t, released: e, rejected: s } = this.stats, n = t - e - (s.frozen + s.tooLarge + s.poolFull);\n return {\n acquired: t,\n released: e,\n rejected: { ...s },\n leaked: n,\n poolSize: this.pool.length\n };\n }\n /**\n * Resets pool.\n */\n reset() {\n this.pool.length = 0, this.stats && (this.stats = {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 }\n });\n }\n}\nconst u = Object.freeze(\n []\n), f = new pt();\nfunction bt(i) {\n return i !== null && typeof i == \"object\" && V in i;\n}\nfunction At(i) {\n return i !== null && typeof i == \"object\" && it in i;\n}\nfunction Nt(i) {\n return i !== null && typeof i == \"object\" && nt in i;\n}\nfunction rt(i) {\n return i !== null && typeof i == \"object\" && typeof i.then == \"function\";\n}\nvar q, $;\nconst { IDLE: N, DIRTY: S, PENDING: R, RESOLVED: d, REJECTED: O, HAS_ERROR: y, RECOMPUTING: T, DISPOSED: P, IS_COMPUTED: It } = K;\nfunction St(i) {\n return i & d ? A.RESOLVED : i & R ? A.PENDING : i & O ? A.REJECTED : A.IDLE;\n}\nclass gt extends et {\n constructor(t, e = {}) {\n if (typeof t != \"function\") throw new E(c.COMPUTED_MUST_BE_FUNCTION);\n super(), this[$] = !0, this[q] = !0, this._error = null, this._promiseId = 0, this._subscribers = [], this._links = u, this._asyncStartAggregateVersion = 0, this._asyncRetryCount = 0, this._trackEpoch = -1, this._trackLinks = u, this._trackCount = 0, this._value = void 0, this.flags = It | S | N, this._equal = e.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in e ? e.defaultValue : U, this._onError = e.onError ?? null;\n const s = e.maxAsyncRetries;\n if (this._maxAsyncRetries = s != null && s >= 0 ? s : X.MAX_ASYNC_RETRIES, L.attachDebugInfo(this, \"computed\", this.id), e.lazy === !1)\n try {\n this._recompute();\n } catch {\n }\n }\n _track() {\n const t = _.current;\n t && Z(this, t, this._subscribers);\n }\n get value() {\n this._track();\n const t = this.flags;\n if ((t & (d | S | N)) === d)\n return this._value;\n if (t & P)\n throw new E(c.COMPUTED_DISPOSED);\n if (t & T) {\n if (this._defaultValue !== U) return this._defaultValue;\n throw new E(c.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if (t & (S | N) && (this._recompute(), this.flags & d))\n return this._value;\n const e = this._defaultValue, s = e !== U;\n if (this.flags & R) {\n if (s) return e;\n throw new E(c.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if (this.flags & O) {\n if (s) return e;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n return this._track(), St(this.flags);\n }\n get hasError() {\n if (this._track(), this.flags & (O | y)) return !0;\n const t = this._links;\n for (let e = 0, s = t.length; e < s; e++) {\n const n = t[e]?.node;\n if (n && n.flags & y) return !0;\n }\n return !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n if (this._track(), !this.hasError) return ht;\n const t = [];\n this._error && t.push(this._error);\n const e = this._links;\n for (let s = 0, n = e.length; s < n; s++) {\n const r = e[s].node;\n if (r.flags & y) {\n const h = r.errors;\n if (h.length > 0)\n for (let I = 0; I < h.length; I++) {\n const F = h[I];\n F && t.indexOf(F) === -1 && t.push(F);\n }\n }\n }\n return Object.freeze(t);\n }\n get lastError() {\n return this._track(), this._error;\n }\n get isPending() {\n return this._track(), (this.flags & R) !== 0;\n }\n get isResolved() {\n return this._track(), (this.flags & d) !== 0;\n }\n invalidate() {\n this._markDirty();\n }\n dispose() {\n if (this.flags & P) return;\n const t = this._links;\n if (t !== u) {\n for (let e = 0, s = t.length; e < s; e++)\n t[e].unsub?.();\n f.release(t), this._links = u;\n }\n this._subscribers.length = 0, this.flags = P | S | N, this._error = null, this._value = void 0;\n }\n [($ = V, q = it, Symbol.dispose)]() {\n this.dispose();\n }\n addDependency(t) {\n if (t._lastSeenEpoch !== this._trackEpoch) {\n if (t._lastSeenEpoch = this._trackEpoch, this._trackCount < this._trackLinks.length) {\n const e = this._trackLinks[this._trackCount];\n e.node = t, e.version = t.version;\n } else\n this._trackLinks.push(new v(t, t.version));\n this._trackCount++;\n }\n }\n _recompute() {\n if (this.flags & T) return;\n this.flags |= T;\n const t = this._links;\n this._trackEpoch = z(), this._trackLinks = f.acquire(), this._trackCount = 0;\n let e = !1;\n try {\n const s = _.run(this, this._fn);\n this._trackLinks.length = this._trackCount, G(this._trackLinks, t, this), this._links = this._trackLinks, e = !0, rt(s) ? this._handleAsyncComputation(s) : this._finalizeResolution(s);\n } catch (s) {\n if (!e)\n try {\n this._trackLinks.length = this._trackCount, G(this._trackLinks, t, this), this._links = this._trackLinks, e = !0;\n } catch {\n }\n this._handleError(s, c.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n e && t !== u ? f.release(t) : e || f.release(this._trackLinks), this._trackEpoch = -1, this._trackLinks = u, this._trackCount = 0, this.flags &= ~T;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | R) & -217, this._notifySubscribers(void 0, void 0), this._asyncStartAggregateVersion = this._captureVersionSnapshot(), this._asyncRetryCount = 0, this._promiseId = (this._promiseId + 1) % X.MAX_PROMISE_ID;\n const e = this._promiseId;\n t.then(\n (s) => {\n if (e === this._promiseId) {\n if (this._captureVersionSnapshot() !== this._asyncStartAggregateVersion)\n return this._asyncRetryCount++ < this._maxAsyncRetries ? this._markDirty() : this._handleError(\n new E(\n `Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`\n ),\n c.COMPUTED_ASYNC_COMPUTATION_FAILED\n );\n this._finalizeResolution(s), this._notifySubscribers(s, void 0);\n }\n },\n (s) => e === this._promiseId && this._handleError(s, c.COMPUTED_ASYNC_COMPUTATION_FAILED)\n );\n }\n _captureVersionSnapshot() {\n let t = 0;\n const e = this._links;\n for (let s = 0, n = e.length; s < n; s++)\n t = (t << 5) - t + e[s].node.version | 0;\n return t;\n }\n _handleError(t, e, s = !1) {\n const n = D(t, E, e);\n if (!s && !(this.flags & O) && (this.version = w(this.version)), this._error = n, this.flags = this.flags & -121 | O | y, this._onError)\n try {\n this._onError(n);\n } catch (r) {\n console.error(c.CALLBACK_ERROR_IN_ERROR_HANDLER, r);\n }\n if (s) throw n;\n this._notifySubscribers(void 0, void 0);\n }\n _finalizeResolution(t) {\n (!(this.flags & d) || !this._equal(this._value, t)) && (this.version = w(this.version)), this._value = t, this._error = null, this.flags = (this.flags | d) & -697;\n }\n execute() {\n this._markDirty();\n }\n /** @internal */\n _markDirty() {\n this.flags & (T | S) || (this.flags |= S, this._notifySubscribers(void 0, void 0));\n }\n}\nfunction yt(i, t = {}) {\n return new gt(i, t);\n}\nvar W;\nclass Dt extends tt {\n constructor(t, e = {}) {\n super(), this[W] = !0, this._cleanup = null, this._links = u, this._nextLinks = null, this._prevLinks = u, this._currentEpoch = -1, this._lastFlushEpoch = -1, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._fn = t, this._onError = e.onError ?? null, this._sync = e.sync ?? !1, this._maxExecutions = e.maxExecutionsPerSecond ?? p.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = e.maxExecutionsPerFlush ?? p.MAX_EXECUTIONS_PER_EFFECT, this._sync ? (this._executeTask = void 0, this._notifyCallback = () => this.execute()) : (this._executeTask = () => this.execute(), this._notifyCallback = () => b.schedule(this._executeTask)), L.attachDebugInfo(this, \"effect\", this.id);\n }\n run() {\n if (this.flags & l.DISPOSED)\n throw new g(c.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.flags & l.DISPOSED || (this.flags |= l.DISPOSED, this._execCleanup(), this._unsubLinks(this._links), this._links !== u && f.release(this._links), this._links = u, this._prevLinks = u);\n }\n [(W = nt, Symbol.dispose)]() {\n this.dispose();\n }\n addDependency(t) {\n if (!(this.flags & l.EXECUTING)) return;\n const e = this._currentEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._nextLinks, n = this._prevLinks;\n for (let r = 0, o = n.length; r < o; r++) {\n const h = n[r];\n if (h && h.node === t && h.unsub) {\n h.version = t.version, s.push(h), n[r] = null;\n return;\n }\n }\n try {\n const r = t.subscribe(this._notifyCallback);\n s.push(new v(t, t.version, r));\n } catch (r) {\n const o = D(r, g, c.EFFECT_EXECUTION_FAILED);\n if (console.error(o), this._onError)\n try {\n this._onError(o);\n } catch {\n }\n s.push(new v(t, t.version, void 0));\n }\n }\n /**\n * Executes effect with tracking.\n */\n execute(t = !1) {\n if (this.flags & (l.DISPOSED | l.EXECUTING) || !t && this._links.length > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), this.flags |= l.EXECUTING, this._execCleanup(), this._prevLinks = this._links;\n const e = f.acquire();\n this._nextLinks = e, this._currentEpoch = z();\n let s = !1;\n try {\n const n = _.run(this, this._fn);\n this._links = e, s = !0, rt(n) ? this._handleAsyncResult(n) : this._cleanup = typeof n == \"function\" ? n : null;\n } catch (n) {\n this._links = e, s = !0, this._handleExecutionError(n), this._cleanup = null;\n } finally {\n this._finalizeDependencies(s, this._prevLinks, e), this.flags &= -9;\n }\n }\n _handleAsyncResult(t) {\n const e = ++this._execId;\n t.then(\n (s) => {\n if (e !== this._execId || this.flags & l.DISPOSED) {\n if (typeof s == \"function\")\n try {\n s();\n } catch (n) {\n this._handleExecutionError(n, c.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof s == \"function\" && (this._cleanup = s);\n },\n (s) => e === this._execId && this._handleExecutionError(s)\n );\n }\n _finalizeDependencies(t, e, s) {\n if (this._nextLinks = null, this._prevLinks = u, t) {\n for (let n = 0, r = e.length; n < r; n++) {\n const o = e[n];\n o && o.unsub?.();\n }\n e !== u && f.release(e);\n } else\n this._unsubLinks(s), f.release(s);\n }\n _unsubLinks(t) {\n for (let e = 0, s = t.length; e < s; e++)\n t[e]?.unsub?.();\n }\n _isDirty() {\n const t = this._links, e = _.current;\n _.current = null;\n try {\n for (let s = 0, n = t.length; s < n; s++) {\n const r = t[s], o = r.node;\n if (o.flags & K.IS_COMPUTED)\n try {\n o.value;\n } catch {\n return !0;\n }\n if (o.version !== r.version) return !0;\n }\n return !1;\n } finally {\n _.current = e;\n }\n }\n _execCleanup() {\n if (this._cleanup) {\n try {\n this._cleanup();\n } catch (t) {\n this._handleExecutionError(t, c.EFFECT_CLEANUP_FAILED);\n }\n this._cleanup = null;\n }\n }\n _checkInfiniteLoops() {\n const t = at();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), ft() > p.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++;\n }\n get isDisposed() {\n return (this.flags & l.DISPOSED) !== 0;\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & l.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const e = new g(\n `Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${H}`\n );\n throw this.dispose(), console.error(e), e;\n }\n _handleExecutionError(t, e = c.EFFECT_EXECUTION_FAILED) {\n const s = D(t, g, e);\n if (console.error(s), this._onError)\n try {\n this._onError(s);\n } catch (n) {\n console.error(D(n, g, c.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n}\nfunction Rt(i, t = {}) {\n if (typeof i != \"function\")\n throw new g(c.EFFECT_MUST_BE_FUNCTION);\n const e = new Dt(i, t);\n return e.execute(), e;\n}\nfunction kt(i) {\n if (typeof i != \"function\")\n throw new TypeError(\"Batch callback must be a function\");\n b.startBatch();\n try {\n return i();\n } finally {\n b.endBatch();\n }\n}\nexport {\n V as ATOM_BRAND,\n A as AsyncState,\n C as AtomError,\n it as COMPUTED_BRAND,\n E as ComputedError,\n ot as DEBUG_CONFIG,\n L as DEBUG_RUNTIME,\n nt as EFFECT_BRAND,\n g as EffectError,\n Ct as POOL_CONFIG,\n p as SCHEDULER_CONFIG,\n m as SchedulerError,\n Ot as atom,\n kt as batch,\n yt as computed,\n Rt as effect,\n bt as isAtom,\n At as isComputed,\n Nt as isEffect,\n b as scheduler,\n Tt as untracked\n};\n//# sourceMappingURL=index.mjs.map\n","import { isAtom, isComputed } from '@but212/atom-effect';\nimport type { ComputedAtom, ReactiveValue, ReadonlyAtom } from './types';\n\n/**\n * Checks if a given value is a reactive object (Atom or Computed).\n */\nexport function isReactive(value: unknown): value is ReadonlyAtom<unknown> | ComputedAtom<unknown> {\n return isAtom(value) || isComputed(value);\n}\n\n/**\n * Extracts the underlying raw value from a ReactiveValue.\n */\nexport function getValue<T>(source: ReactiveValue<T>): T {\n return isReactive(source) ? source.value : (source as T);\n}\n\n/**\n * Generates a CSS selector string for a DOM element.\n * Optimized for zero-allocation parsing using native classList.\n */\nexport function getSelector(el: Element | JQuery): string {\n if (!el) return 'unknown';\n const dom = 'jquery' in el ? (el as JQuery)[0] : (el as Element);\n if (!dom) return 'unknown';\n\n const id = dom.id;\n if (id && typeof id === 'string') return `#${id}`;\n\n const tagName = dom.tagName.toLowerCase();\n const classes = dom.classList;\n\n if (classes && classes.length > 0) {\n let res = tagName;\n for (let i = 0, len = classes.length; i < len; i++) {\n const cls = classes[i];\n if (cls) res += `.${cls}`;\n }\n return res;\n }\n return tagName;\n}\n\n/**\n * Basic HTML sanitization for XSS mitigation.\n * Note: This is NOT a replacement for a full-featured sanitizer like DOMPurify.\n * It prevents common attacks like <script> tags and javascript: protocols.\n */\nexport function sanitizeHtml(html: string): string {\n let safe = String(html ?? '');\n\n // 0. Pre-process: Remove null bytes and control characters (bypass vectors)\n // These are often used to bypass regex filters while browsers ignore them\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\n safe = safe.replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g, '');\n\n // 1. Remove dangerous tags entirely (content included or tag stripped)\n // Lightweight first pass — DOMPurify handles the full sanitization.\n // Note: svg/math are NOT removed — they have legitimate uses (icons, equations).\n // Their event handlers (on*) are already neutralized in step 3.\n // Also remove processing instructions <? ... ?> which can be abused in some contexts\n safe = safe.replace(/<\\?[\\s\\S]*?\\?>/g, '');\n\n // Loop tag removal to prevent nested reassembly bypass (e.g. \"<scr<script>ipt>\")\n const dangerousTagPattern =\n /(<(script|iframe|object|embed|base|meta|applet|noscript)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript)\\b[^>]*\\/?>)/gim;\n let prev: string;\n do {\n prev = safe;\n safe = safe.replace(dangerousTagPattern, '');\n } while (safe !== prev);\n\n // 2. Neutralize dangerous protocols (javascript:, vbscript:)\n // Simple whitespace-tolerant regex. Entity-based obfuscation is left to DOMPurify.\n // Step 0 already strips null bytes/control chars, so basic spacing tricks are caught here.\n const protocolRegex =\n /(j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t)\\s*:/gi;\n safe = safe.replace(protocolRegex, 'data-unsafe-protocol:');\n\n // Separately handle dangerous data URIs (e.g. text/html, base64 encoded scripts)\n // Allows common inline images (data:image/...) including SVG while blocking executable payloads.\n const dangerousDataUriRegex =\n /data\\s*:\\s*(?:text\\/html|application\\/javascript|text\\/javascript|text\\/vbscript|text\\/xml|application\\/xhtml\\+xml)/gim;\n safe = safe.replace(dangerousDataUriRegex, 'data-unsafe-protocol:');\n\n // 3. Neutralize event handlers (on* attributes)\n // Replaces \"onclick=\" with \"data-unsafe-attr=\"\n safe = safe.replace(/\\bon\\w+\\s*=/gim, 'data-unsafe-attr=');\n\n // 4. Neutralize CSS expressions (IE legacy but dangerous) and behavior\n // expression(...), behavior:url(...)\n safe = safe\n .replace(/expression\\s*\\(/gim, 'data-unsafe-css(')\n .replace(/behavior\\s*:/gim, 'data-unsafe-css:');\n\n return safe;\n}\n\n/**\n * Checks if a given attribute value contains a dangerous protocol (javascript:, vbscript:).\n * Used by atomAttr/bindAttr to guard URL-bearing attributes.\n */\nconst URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'srcset',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n]);\n\nconst DANGEROUS_PROTOCOL_RE = /^\\s*(?:javascript|vbscript)\\s*:/i;\n\nexport function isDangerousUrl(attrName: string, value: string): boolean {\n if (!URL_ATTRS.has(attrName.toLowerCase())) return false;\n return DANGEROUS_PROTOCOL_RE.test(value);\n}\n\n/**\n * Checks if a CSS value contains dangerous protocols in url() functions.\n * e.g. background-image: url(\"javascript:alert(1)\")\n */\nexport function isDangerousCssValue(value: string): boolean {\n // fast check for url(\n if (!value.toLowerCase().includes('url(')) return false;\n\n // Check for dangerous protocols inside url(...)\n // Pattern matches: url( ['\"]? protocol:\n const dangerousCssUrlRe = /url\\s*\\(\\s*(?:[\"']?\\s*)?(?:javascript|vbscript)\\s*:/i;\n return dangerousCssUrlRe.test(value);\n}\n\n/**\n * Shallow equality check for plain objects.\n * Returns true if both objects have the same keys with identical values (===).\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n const objB = b as Record<string, unknown>;\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i]!;\n if ((a as Record<string, unknown>)[key] !== objB[key]) return false;\n }\n return true;\n}\n\n/**\n * Longest Increasing Subsequence (LIS)\n * Optimized for hardware and TypeScript strict null checks.\n * Time Complexity: O(N log N), Space Complexity: $O(N)$.\n */\nexport function getLIS(arr: Int32Array | number[]): Int32Array {\n const len = arr.length;\n if (len === 0) return new Int32Array(0);\n\n const predecessors = new Int32Array(len);\n const result = new Int32Array(len);\n let resultLen = 0;\n\n for (let i = 0; i < len; i++) {\n const val = arr[i];\n if (val === undefined || val === -1) continue;\n\n const lastIdx = resultLen > 0 ? result[resultLen - 1] : undefined;\n if (resultLen === 0 || (lastIdx !== undefined && (arr[lastIdx] ?? -1) < val)) {\n predecessors[i] = lastIdx ?? -1;\n result[resultLen++] = i;\n continue;\n }\n\n // Binary search for insertion point\n let left = 0;\n let right = resultLen - 1;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const midIdx = result[mid];\n if (midIdx !== undefined && (arr[midIdx] ?? -1) < val) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n const leftIdx = result[left];\n if (leftIdx !== undefined && val < (arr[leftIdx] ?? Number.MAX_SAFE_INTEGER)) {\n if (left > 0) {\n predecessors[i] = result[left - 1] ?? -1;\n }\n result[left] = i;\n }\n }\n\n const lis = new Int32Array(resultLen);\n if (resultLen > 0) {\n let curr: number | undefined = result[resultLen - 1];\n for (let i = resultLen - 1; i >= 0 && curr !== undefined && curr !== -1; i--) {\n lis[i] = curr;\n curr = predecessors[curr];\n }\n }\n\n return lis;\n}\n","/**\n * Debug Mode\n *\n * When $.atom.debug = true is enabled:\n * 1. Logs state changes to the console.\n * 2. Visually highlights DOM updates (red border flash).\n *\n * Debug mode can be enabled in two ways:\n * 1. Build-time: import.meta.env.DEV\n * 2. Runtime: $.atom.debug = true or window.__ATOM_DEBUG__ = true\n */\n\nimport { getSelector } from './utils';\n\n/**\n * Determines the initial debug state based on environment.\n * Priority: window.__ATOM_DEBUG__ > import.meta.env.DEV\n */\nfunction getInitialDebugState(): boolean {\n if (typeof window !== 'undefined') {\n const flag = (window as Window & { __ATOM_DEBUG__?: boolean }).__ATOM_DEBUG__;\n if (typeof flag === 'boolean') return flag;\n }\n\n if (import.meta.env?.DEV && import.meta.env.MODE !== 'test') return true;\n\n return false;\n}\n\nlet debugEnabled = getInitialDebugState();\n\nexport const debug = {\n get enabled() {\n return debugEnabled;\n },\n set enabled(value: boolean) {\n debugEnabled = value;\n },\n\n log<T>(type: string, ...args: T[]) {\n if (debugEnabled) {\n console.log(`[atom-effect-jquery] ${type}:`, ...args);\n }\n },\n\n atomChanged<T>(name: string | undefined, oldVal: T, newVal: T) {\n if (debugEnabled) {\n console.log(\n `[atom-effect-jquery] Atom \"${name ?? 'anonymous'}\" changed:`,\n oldVal,\n '→',\n newVal\n );\n }\n },\n\n /**\n * Logs DOM updates and triggers visual highlight.\n */\n domUpdated<T>($el: JQuery | Element, type: string, value: T) {\n if (!debugEnabled) return;\n console.log(`[atom-effect-jquery] DOM updated: ${getSelector($el)}.${type} =`, value);\n highlightElement($el);\n },\n\n cleanup(selector: string) {\n if (debugEnabled) {\n console.log(`[atom-effect-jquery] Cleanup: ${selector}`);\n }\n },\n\n warn<T>(...args: T[]) {\n if (debugEnabled) {\n console.warn('[atom-effect-jquery]', ...args);\n }\n },\n};\n\n/**\n * Visual highlight - flashes a red border via CSS class toggle.\n */\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nlet styleInjected = false;\n\nfunction injectHighlightStyle(): void {\n if (styleInjected) return;\n styleInjected = true;\n const style = document.createElement('style');\n style.textContent = `.${HIGHLIGHT_CLASS}{outline:2px solid rgba(255,68,68,0.8);outline-offset:1px;transition:outline 0.5s ease-out}`;\n document.head.appendChild(style);\n}\n\nconst highlightTimers = new WeakMap<HTMLElement, ReturnType<typeof setTimeout>>();\n\nfunction highlightElement($el: JQuery | Element): void {\n const el = ('jquery' in $el ? $el[0] : $el) as HTMLElement | undefined;\n if (!el || !el.isConnected) return;\n\n injectHighlightStyle();\n\n // Clear existing timer if re-highlighted\n const existing = highlightTimers.get(el);\n if (existing) clearTimeout(existing);\n\n el.classList.add(HIGHLIGHT_CLASS);\n\n highlightTimers.set(\n el,\n setTimeout(() => {\n el.classList.remove(HIGHLIGHT_CLASS);\n highlightTimers.delete(el);\n }, 600)\n );\n}\n","import {\n batch,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { debug } from './debug';\nimport type { AtomOptions, WritableAtom } from './types';\nimport { isReactive } from './utils';\n\n/**\n * Creates an atom with optional metadata.\n */\nfunction atom<T>(initialValue: T, options: AtomOptions = {}): WritableAtom<T> {\n return createAtom(initialValue, options);\n}\n\n// Add debug property\nObject.defineProperty(atom, 'debug', {\n get() {\n return debug.enabled;\n },\n set(value: boolean) {\n debug.enabled = value;\n },\n});\n\n/**\n * Waits for the next macrotask (setTimeout 0).\n * Effects are processed in microtasks, so this runs AFTER all pending effects complete.\n */\nfunction nextTick(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/**\n * Extend jQuery static methods.\n */\n$.extend({\n atom,\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n});\n","/**\n * Constants for atom-effect-jquery\n */\n\nexport const AES_BOUND_CLASS = '_aes-bound';\n\nexport const LOG_PREFIXES = {\n ROUTE: '[$.route]',\n BIND: '[atomBind]',\n LIST: '[atomList]',\n} as const;\n\nexport const ROUTE_DEFAULTS = {\n MODE: 'hash' as const,\n ACTIVE_CLASS: 'active',\n BASE_PATH: '',\n AUTO_BIND_LINKS: false,\n} as const;\n\nexport const INPUT_DEFAULTS = {\n EVENT: 'input',\n DEBOUNCE: 0,\n} as const;\n\nexport const DANGEROUS_PROPS = ['innerHTML', 'outerHTML'] as const;\n\nexport const ERROR_MESSAGES = {\n ROUTE_NOT_FOUND: (name: string) => `Route \"${name}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (selector: string) => `Template \"${selector}\" not found`,\n TARGET_NOT_FOUND: (selector: string) => `Target element \"${selector}\" not found`,\n MALFORMED_URI: (raw: string) => `Malformed URI component: ${raw}`,\n UNSAFE_CONTENT: 'Unsafe content neutralized during sanitization.',\n BLOCKED_DANGEROUS_VALUE: (prop: string) => `Blocked dangerous value in \"${prop}\" property.`,\n BLOCKED_EVENT_HANDLER: (name: string) =>\n `Blocked setting dangerous event handler attribute \"${name}\".`,\n BLOCKED_PROTOCOL: (name: string) => `Blocked dangerous protocol in \"${name}\" attribute.`,\n BLOCKED_DANGEROUS_PROP: (name: string) =>\n `Blocked setting dangerous property \"${name}\". Use html binding for sanitized HTML.`,\n INVALID_INPUT_ELEMENT: (tagName: string) => `Val binding used on non-input element <${tagName}>.`,\n DUPLICATE_KEY: (key: string | number, index: number) =>\n `Duplicate key \"${key}\" at index ${index}.`,\n} as const;\n","import { AES_BOUND_CLASS } from './constants';\nimport { debug } from './debug';\nimport type { EffectObject } from './types';\nimport { getSelector } from './utils';\n\n/**\n * Marker class for bound elements to optimize selector engines.\n */\nconst AES_BOUND = AES_BOUND_CLASS;\n\ninterface BindingRecord {\n effects?: EffectObject[];\n cleanups?: Array<() => void>;\n}\n\n/**\n * Binding Registry\n *\n * Highly optimized for performance:\n * - Uses WeakMap for zero-leak DOM associations.\n * - Minimal allocations in the tracking path.\n * - Efficient tree traversal for cleanup.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n private boundElements = new WeakSet<Element>();\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>(); // Prevent redundant cleanup\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n private _getOrCreateRecord(el: Element): BindingRecord {\n let res = this.records.get(el);\n if (!res) {\n res = {};\n this.records.set(el, res);\n // Mark as bound and add class for faster querySelector lookup\n if (!this.boundElements.has(el)) {\n this.boundElements.add(el);\n el.classList.add(AES_BOUND);\n }\n }\n return res;\n }\n\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this._getOrCreateRecord(el);\n record.effects ??= [];\n record.effects.push(fx);\n }\n\n trackCleanup(el: Element, fn: () => void): void {\n const record = this._getOrCreateRecord(el);\n record.cleanups ??= [];\n record.cleanups.push(fn);\n }\n\n hasBind(el: Element): boolean {\n return this.boundElements.has(el);\n }\n\n cleanup(el: Element): void {\n // Atomic delete return value used as a high-performance guard\n if (!this.boundElements.delete(el)) return;\n\n const record = this.records.get(el);\n if (!record) return;\n\n // Fast cleanup of metadata\n this.records.delete(el);\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n el.classList.remove(AES_BOUND);\n\n // Hoist costly selector string generation to debug-only block\n if (debug.enabled) {\n debug.cleanup(getSelector(el));\n }\n\n // 1. Dispose Effects (Atom -> Subscription severed)\n const effects = record.effects;\n if (effects) {\n for (let i = 0, len = effects.length; i < len; i++) {\n try {\n effects[i]?.dispose();\n } catch (e) {\n debug.warn('Effect dispose error:', e);\n }\n }\n }\n\n // 2. Execute custom cleanups\n const cleanups = record.cleanups;\n if (cleanups) {\n for (let i = 0, len = cleanups.length; i < len; i++) {\n try {\n cleanups[i]?.();\n } catch (e) {\n debug.warn('Cleanup error:', e);\n }\n }\n }\n }\n\n cleanupDescendants(el: Element): void {\n const children = el.querySelectorAll(`.${AES_BOUND}`);\n for (let i = 0, len = children.length; i < len; i++) {\n const child = children[i] as Element;\n // Double check because querySelectorAll might return disconnected leftovers\n if (child && this.boundElements.has(child)) {\n this.cleanup(child);\n } else if (child) {\n child.classList.remove(AES_BOUND);\n }\n }\n }\n\n cleanupTree(el: Element): void {\n this.cleanupDescendants(el);\n this.cleanup(el);\n }\n}\n\nexport const registry = new BindingRegistry();\n\nlet observer: MutationObserver | null = null;\n\nexport function enableAutoCleanup(root: Element = document.body): void {\n if (observer) return;\n\n observer = new MutationObserver((mutations) => {\n for (let i = 0, len = mutations.length; i < len; i++) {\n const removedNodes = mutations[i]?.removedNodes;\n if (!removedNodes) continue;\n const rLen = removedNodes.length;\n if (rLen === 0) continue;\n\n for (let j = 0; j < rLen; j++) {\n const node = removedNodes[j]!;\n // Early exit: only elements can have AES_BOUND bindings\n if (node.nodeType !== 1) continue;\n\n // Skip if kept (detached for moves), explicitly ignored, or still connected\n if (node.isConnected || registry.isKept(node) || registry.isIgnored(node)) {\n continue;\n }\n\n registry.cleanupTree(node as Element);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n}\n\nexport function disableAutoCleanup(): void {\n observer?.disconnect();\n observer = null;\n}\n","import { effect } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ReactiveValue } from './types';\nimport { isReactive } from './utils';\n\n/**\n * Utility to register a reactive effect or apply a static update.\n * Centralizes the boilerplate for atomic bindings.\n *\n * @param el - The DOM element to associate with the effect.\n * @param source - The reactive or static value source.\n * @param updater - Function to apply the value to the DOM.\n * @param debugType - Type label for debug logging.\n */\nexport function registerReactiveEffect<T>(\n el: HTMLElement,\n source: ReactiveValue<T>,\n updater: (value: T) => void,\n debugType: string\n): void {\n if (isReactive(source)) {\n registry.trackEffect(\n el,\n effect(() => {\n const value = source.value;\n updater(value);\n debug.domUpdated($(el), debugType, value);\n })\n );\n } else {\n updater(source);\n if (debug.enabled) debug.domUpdated($(el), debugType, source);\n }\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n/**\n * Extended options for Atom creation.\n */\nexport interface AtomOptions extends BaseAtomOptions {\n /** Name for debugging purposes */\n name?: string;\n}\n\n/**\n * Represents a value that can be either dynamic (Atom/Computed) or static.\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | ComputedAtom<T>;\n\n/**\n * CSS value: either a direct reactive value or a tuple of [source, unit].\n * Named type provides clear bone structure for CSS binding configurations.\n */\nexport type CssValue =\n | ReactiveValue<string | number>\n | [source: ReactiveValue<string | number>, unit: string];\n\n/**\n * CSS bindings map property names to CSS values.\n */\nexport type CssBindings = Record<string, CssValue>;\n\n/**\n * Configuration options for `atomBind`.\n */\nexport interface BindingOptions<T> {\n text?: ReactiveValue<T>;\n html?: ReactiveValue<string>;\n class?: Record<string, ReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, ReactiveValue<string | boolean | null>>;\n prop?: Record<string, ReactiveValue<T>>;\n show?: ReactiveValue<boolean>;\n hide?: ReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\n/**\n * Configuration options for `atomList`.\n */\nexport interface ListOptions<T> {\n key: keyof T | ((item: T, index: number) => string | number);\n render: (item: T, index: number) => string | Element | DocumentFragment | JQuery;\n bind?: ($el: JQuery, item: T, index: number) => void;\n update?: ($el: JQuery, item: T, index: number) => void;\n onAdd?: ($el: JQuery) => void;\n onRemove?: ($el: JQuery) => Promise<void> | void;\n empty?: string | Element | DocumentFragment | JQuery;\n}\n\n/**\n * Configuration options for `atomVal`.\n */\nexport interface ValOptions<T> {\n debounce?: number;\n event?: string;\n parse?: (v: string) => T;\n format?: (v: T) => string;\n /** Custom equality check for comparing parsed values. Defaults to Object.is. */\n equal?: (a: T, b: T) => boolean;\n}\n\n/**\n * Configuration options for `atomFetch`.\n */\nexport interface FetchOptions<T> {\n /** Initial value before first fetch resolves. */\n defaultValue: T;\n /** HTTP method (default: 'GET'). */\n method?: string;\n /** Request headers. */\n headers?: Record<string, string>;\n /** Transform raw response before storing. */\n transform?: (raw: unknown) => T;\n /** Additional $.ajax settings passthrough. */\n ajaxOptions?: JQuery.AjaxSettings;\n}\n\n/**\n * State context for two-way input bindings.\n * Consolidates scattered state flags into a single, traceable object.\n * This is the \"bone structure\" for input binding lifecycle management.\n */\n/**\n * Bit flags for input binding state management.\n * Consolidates mutually exclusive phases and orthogonal states (focus) into a single integer.\n */\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n // Mask for any active processing phase (excluding simple focus)\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\n/**\n * State context for two-way input bindings.\n * Consolidates scattered state flags into a single, traceable object.\n * This is the \"bone structure\" for input binding lifecycle management.\n */\nexport interface InputBindingState {\n /** Timeout ID for debounced updates */\n timeoutId: number | null;\n /** Bitmask of current state flags */\n flags: number;\n}\n\n/**\n * Creates a fresh InputBindingState with default values.\n */\nexport function createInputBindingState(): InputBindingState {\n return { timeoutId: null, flags: BindingFlags.None };\n}\n\n/**\n * Functional Component type.\n */\nexport type ComponentFn<P = {}> = ($el: JQuery, props: P) => undefined | (() => void);\n\ndeclare global {\n interface JQueryStatic {\n atom: {\n <T>(initialValue: T, options?: AtomOptions): WritableAtom<T>;\n debug: boolean;\n };\n computed<T>(fn: () => T, options?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n options: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => undefined | (() => void)): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n isReactive(v: unknown): boolean;\n nextTick(): Promise<void>;\n route(config: RouteConfig): Router;\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T>;\n }\n\n interface JQuery {\n // Chainable methods\n atomText<T>(source: ReactiveValue<T>, formatter?: (v: T) => string): this;\n atomHtml(source: ReactiveValue<string>): this;\n atomClass(className: string, condition: ReactiveValue<boolean>): this;\n atomCss(prop: string, source: ReactiveValue<string | number>, unit?: string): this;\n atomAttr(name: string, source: ReactiveValue<string | boolean | null>): this;\n atomProp<T extends string | number | boolean | null | undefined>(\n name: string,\n source: ReactiveValue<T>\n ): this;\n atomShow(condition: ReactiveValue<boolean>): this;\n atomHide(condition: ReactiveValue<boolean>): this;\n atomVal<T>(atom: WritableAtom<T>, options?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n\n // Integrated binding\n atomBind<T extends string | number | boolean | null | undefined>(\n options: BindingOptions<T>\n ): this;\n\n // List rendering\n atomList<T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): this;\n\n // Component mounting\n atomMount<P>(component: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n\n // Cleanup\n atomUnbind(): this;\n }\n}\n\n/**\n * Context passed to binding handlers for cleanup and effect registration.\n */\nexport interface BindingContext {\n readonly $el: JQuery;\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: () => void) => void;\n}\n\n/**\n * Shared route lifecycle hooks.\n */\ninterface RouteLifecycle {\n /** Called when entering this route. Can return additional params. */\n onEnter?: (params: Record<string, string>) => Record<string, string> | undefined;\n /** Called when leaving this route. Return false to prevent navigation. */\n onLeave?: () => boolean | undefined;\n}\n\n/**\n * Route using a template selector.\n */\ninterface TemplateRoute extends RouteLifecycle {\n /** Template selector (e.g., '#tmpl-home') */\n template: string;\n render?: never;\n}\n\n/**\n * Route using a custom render function.\n */\ninterface RenderRoute extends RouteLifecycle {\n /** Custom render function */\n render: (container: HTMLElement, route: string, params: Record<string, string>) => void;\n template?: never;\n}\n\n/**\n * Route definition for a single route.\n * Either template OR render must be provided, but not both.\n */\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\n/**\n * Configuration for $.route()\n */\nexport interface RouteConfig {\n /** Target element selector for rendering route content */\n target: string;\n /** Default route name */\n default: string;\n /** Route definitions map */\n routes: Record<string, RouteDefinition>;\n /** Routing mode. 'hash' uses location.hash, 'history' uses pushState. Default: 'hash' */\n mode?: 'hash' | 'history';\n /** Base path for history mode (e.g., '/app'). Ignored in hash mode. Default: '' */\n basePath?: string;\n /** Route name to use for 404/not found */\n notFound?: string;\n /** Automatically bind links with data-route attribute */\n autoBindLinks?: boolean;\n /** CSS class to add to active links */\n activeClass?: string;\n /** Called before transitioning between routes */\n beforeTransition?: (from: string, to: string) => void;\n /** Called after transitioning between routes */\n afterTransition?: (from: string, to: string) => void;\n}\n\n/**\n * Router instance returned by $.route()\n */\nexport interface Router {\n /** Reactive atom containing current route name */\n currentRoute: WritableAtom<string>;\n /** Navigate to a different route */\n navigate: (route: string) => void;\n /** Cleanup and destroy the router */\n destroy: () => void;\n}\n\nexport type { WritableAtom, ReadonlyAtom, ComputedAtom, EffectObject, ComputedOptions };\n","import { INPUT_DEFAULTS } from './constants';\nimport { debug } from './debug';\nimport type { InputBindingState, ValOptions, WritableAtom } from './types';\nimport { BindingFlags, createInputBindingState } from './types';\n\n/**\n * Applies two-way data binding configuration to an input element.\n * Shared logic used by both implicit (atomBind) and explicit (atomVal) bindings.\n *\n * @param $el - The jQuery element to bind.\n * @param atom - The target atom for two-way binding.\n * @param options - Binding options (parse, format, debounce, events).\n * @returns Object containing the effect function (for Atom -> DOM) and cleanup function.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T> = {}\n): { effect: () => void; cleanup: () => void } {\n const {\n debounce: debounceMs,\n event = INPUT_DEFAULTS.EVENT,\n parse = (v: string) => v as unknown as T,\n format = (v: T) => String(v ?? ''),\n equal = Object.is,\n } = options;\n\n const state: InputBindingState = createInputBindingState();\n const el = $el[0] as HTMLInputElement | HTMLTextAreaElement;\n\n // Core sync: DOM → Atom\n const syncAtomFromDom = () => {\n if (state.flags & BindingFlags.Busy) return;\n\n state.flags |= BindingFlags.SyncingToAtom;\n try {\n const currentRaw = el.value;\n const parsed = parse(currentRaw);\n // Avoid redundant atom updates to prevent unnecessary propagation\n if (!equal(atom.value, parsed)) {\n atom.value = parsed;\n }\n } finally {\n state.flags &= ~BindingFlags.SyncingToAtom;\n }\n };\n\n const onBlur = () => {\n // Flush pending debounce\n if (state.timeoutId) {\n clearTimeout(state.timeoutId);\n state.timeoutId = null;\n syncAtomFromDom();\n }\n\n state.flags &= ~BindingFlags.Focused;\n\n // Force formatting on blur\n const formatted = format(atom.value);\n if (el.value !== formatted) {\n el.value = formatted;\n }\n };\n\n // Input handler with optional debounce\n const onInput = () => {\n if (state.flags & BindingFlags.Busy) return;\n\n if (debounceMs) {\n if (state.timeoutId) clearTimeout(state.timeoutId);\n state.timeoutId = setTimeout(syncAtomFromDom, debounceMs);\n } else {\n syncAtomFromDom();\n }\n };\n\n const handlers = {\n compositionstart: () => {\n state.flags |= BindingFlags.Composing;\n },\n compositionend: () => {\n state.flags &= ~BindingFlags.Composing;\n syncAtomFromDom();\n },\n focus: () => {\n state.flags |= BindingFlags.Focused;\n },\n blur: onBlur,\n [event]: onInput,\n change: onInput,\n };\n\n $el.on(handlers);\n\n const cleanup = () => {\n $el.off(handlers);\n if (state.timeoutId) clearTimeout(state.timeoutId);\n };\n\n // Core sync: Atom → DOM (Effect body)\n const effect = () => {\n const val = atom.value;\n const formatted = format(val);\n const currentVal = el.value;\n\n // 1. Skip if already synchronized\n if (currentVal === formatted) return;\n\n // 2. Skip if focused and current input parses to same value (don't interrupt user)\n if (state.flags & BindingFlags.Focused && equal(parse(currentVal), val)) {\n return;\n }\n\n state.flags |= BindingFlags.SyncingToDom;\n try {\n if (state.flags & BindingFlags.Focused) {\n // [Fix] Preserve cursor position when focused\n const { selectionStart: start, selectionEnd: end } = el;\n el.value = formatted;\n const len = formatted.length;\n el.setSelectionRange(Math.min(start ?? 0, len), Math.min(end ?? 0, len));\n } else {\n el.value = formatted;\n }\n\n debug.domUpdated($el, 'val', formatted);\n } finally {\n state.flags &= ~BindingFlags.SyncingToDom;\n }\n };\n\n return { effect, cleanup };\n}\n","import { batch, effect } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { registerReactiveEffect } from './effect-factory';\nimport { applyInputBinding } from './input-binding';\nimport { registry } from './registry';\nimport type {\n BindingContext,\n BindingOptions,\n CssValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from './types';\nimport { BindingFlags, createInputBindingState } from './types';\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml } from './utils';\n\n// Cache for CSS property camelization to avoid repeated regex and check overhead\nconst camelCache: Record<string, string> = Object.create(null);\nfunction getCamelCase(prop: string): string {\n let cached = camelCache[prop];\n if (cached) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache[prop] = cached;\n return cached;\n}\n\n// ============================================================================\n// Binding Context Factory\n// ============================================================================\n\nexport function createContext(el: HTMLElement): BindingContext {\n let _$el: JQuery | null = null;\n return {\n get $el() {\n if (!_$el) _$el = $(el);\n return _$el;\n },\n el,\n trackCleanup: (fn) => registry.trackCleanup(el, fn),\n };\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\nexport function bindText<T>(ctx: BindingContext, value: ReactiveValue<T>): void {\n const el = ctx.el;\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const newVal = typeof val === 'string' ? val : String(val ?? '');\n // Guard against redundant DOM writes\n if (el.textContent !== newVal) {\n el.textContent = newVal;\n }\n },\n 'text'\n );\n}\n\nexport function bindHtml(ctx: BindingContext, value: ReactiveValue<string>): void {\n const el = ctx.el;\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const newVal = String(val ?? '');\n const sanitized = sanitizeHtml(newVal);\n\n if (sanitized !== newVal) {\n console.warn(`${LOG_PREFIXES.BIND} ${ERROR_MESSAGES.UNSAFE_CONTENT}`);\n }\n\n // Guard against redundant DOM writes which destroy/recreate subtrees\n if (el.innerHTML !== sanitized) {\n el.innerHTML = sanitized;\n }\n },\n 'html'\n );\n}\n\nexport function bindClass(\n ctx: BindingContext,\n classMap: Record<string, ReactiveValue<boolean>>\n): void {\n for (const className in classMap) {\n registerReactiveEffect(\n ctx.el,\n classMap[className],\n (val) => {\n ctx.el.classList.toggle(className, !!val);\n },\n `class.${className}`\n );\n }\n}\n\nexport function bindCss(ctx: BindingContext, cssMap: Record<string, CssValue>): void {\n const el = ctx.el;\n const style = el.style as unknown as Record<string, string>;\n for (const prop in cssMap) {\n const val = cssMap[prop];\n if (val === undefined) continue;\n\n const camel = getCamelCase(prop);\n const isArr = Array.isArray(val);\n const source = isArr ? val[0] : val;\n const unit = isArr ? val[1] : '';\n\n registerReactiveEffect(\n el,\n source,\n (v) => {\n const strVal = unit ? `${v}${unit}` : String(v);\n if (isDangerousCssValue(strVal)) {\n console.warn(`${LOG_PREFIXES.BIND} ${ERROR_MESSAGES.BLOCKED_DANGEROUS_VALUE(prop)}`);\n return;\n }\n style[camel] = strVal;\n },\n `css.${prop}`\n );\n }\n}\n\nexport function bindAttr(\n ctx: BindingContext,\n attrMap: Record<string, ReactiveValue<string | boolean | null>>\n): void {\n const el = ctx.el;\n for (const name in attrMap) {\n // Block event handler attributes (on*)\n const c0 = name.charCodeAt(0);\n if ((c0 === 111 || c0 === 79) && (name.charCodeAt(1) === 110 || name.charCodeAt(1) === 78)) {\n console.warn(`${LOG_PREFIXES.BIND} ${ERROR_MESSAGES.BLOCKED_EVENT_HANDLER(name)}`);\n continue;\n }\n\n registerReactiveEffect(\n el,\n attrMap[name],\n (v) => {\n if (v === null || v === undefined || v === false) {\n el.removeAttribute(name);\n return;\n }\n const newVal = v === true ? name : String(v);\n if (isDangerousUrl(name, newVal)) {\n console.warn(`${LOG_PREFIXES.BIND} ${ERROR_MESSAGES.BLOCKED_PROTOCOL(name)}`);\n return;\n }\n // Attribute write guard\n if (el.getAttribute(name) !== newVal) {\n el.setAttribute(name, newVal);\n }\n },\n `attr.${name}`\n );\n }\n}\n\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, ReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n for (const name in propMap) {\n // Block dangerous DOM properties that can inject raw HTML\n if (DANGEROUS_PROPS.includes(name as (typeof DANGEROUS_PROPS)[number])) {\n console.warn(`${LOG_PREFIXES.BIND} ${ERROR_MESSAGES.BLOCKED_DANGEROUS_PROP(name)}`);\n continue;\n }\n\n registerReactiveEffect(\n ctx.el,\n propMap[name],\n (val) => {\n // Redundancy check for DOM properties (e.g. className, title)\n if (el[name] !== val) {\n el[name] = val;\n }\n },\n `prop.${name}`\n );\n }\n}\n\nexport function bindVisibility(\n ctx: BindingContext,\n condition: ReactiveValue<boolean>,\n invert: boolean,\n label: 'show' | 'hide'\n): void {\n const el = ctx.el;\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const visible = invert ? !val : !!val;\n el.style.display = visible ? '' : 'none';\n if (debug.enabled) debug.domUpdated(el, label, val);\n },\n label\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n * Supports parse/format options, debouncing, IME composition, and focus-aware updates.\n */\nexport function bindVal<T>(\n ctx: BindingContext,\n cfg: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>]\n): void {\n const tagName = ctx.el.tagName.toLowerCase();\n if (tagName !== 'input' && tagName !== 'select' && tagName !== 'textarea') {\n console.warn(`[atomBind] Val binding used on non-input element <${tagName}>.`);\n return;\n }\n const isArr = Array.isArray(cfg);\n const { effect: fxFn, cleanup } = applyInputBinding(\n ctx.$el,\n isArr ? cfg[0] : cfg,\n isArr ? cfg[1] : {}\n );\n\n registry.trackEffect(ctx.el, effect(fxFn));\n ctx.trackCleanup(cleanup);\n}\n\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = ctx.$el;\n const state = createInputBindingState();\n\n // DOM → Atom (jQuery events for .trigger() compatibility)\n const handler = () => {\n if (state.flags & BindingFlags.Busy) return;\n const current = el.checked;\n if (atom.value !== current) {\n atom.value = current;\n }\n };\n\n $el.on('change', handler);\n ctx.trackCleanup(() => $el.off('change', handler));\n\n // Atom → DOM\n const fx = effect(() => {\n state.flags |= BindingFlags.SyncingToDom;\n const val = !!atom.value;\n if (el.checked !== val) {\n el.checked = val;\n if (debug.enabled) debug.domUpdated($el, 'checked', val);\n }\n state.flags &= ~BindingFlags.SyncingToDom;\n });\n registry.trackEffect(el, fx);\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\n/** Event handler map type for atomBind({ on: ... }) using jQuery's event handler signature */\ntype EventBindingMap = {\n [K in keyof JQuery.TypeToTriggeredEventMap<HTMLElement, undefined, HTMLElement, HTMLElement>]?:\n | JQuery.TypeEventHandler<HTMLElement, undefined, HTMLElement, HTMLElement, K>\n | false;\n} & {\n [eventName: string]: JQuery.EventHandler<HTMLElement, undefined> | false | undefined;\n};\n\nexport function bindEvents(ctx: BindingContext, eventMap: EventBindingMap): void {\n for (const name in eventMap) {\n const handler = eventMap[name];\n if (typeof handler !== 'function') continue;\n const listener = (e: Event) => {\n batch(() =>\n (handler as JQuery.EventHandler<HTMLElement, undefined>).call(\n ctx.el,\n $.Event(e.type, { originalEvent: e }) as JQuery.TriggeredEvent<HTMLElement>\n )\n );\n };\n ctx.el.addEventListener(name, listener);\n ctx.trackCleanup(() => ctx.el.removeEventListener(name, listener));\n }\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Extends jQuery with atom-based data binding capabilities.\n *\n * This plugin synchronizes DOM element states (text, html, classes, styles, etc.)\n * with reactive atoms. Handlers are modular and focused for maintainability.\n */\n$.fn.atomBind = function <T extends string | number | boolean | null | undefined>(\n options: BindingOptions<T>\n): JQuery {\n return this.each(function () {\n const ctx = createContext(this);\n\n // Apply bindings through focused handlers\n if (options.text !== undefined) bindText(ctx, options.text);\n if (options.html !== undefined) bindHtml(ctx, options.html);\n if (options.class) bindClass(ctx, options.class);\n if (options.css) bindCss(ctx, options.css);\n if (options.attr) bindAttr(ctx, options.attr);\n if (options.prop) bindProp(ctx, options.prop);\n if (options.show !== undefined) bindVisibility(ctx, options.show, false, 'show');\n if (options.hide !== undefined) bindVisibility(ctx, options.hide, true, 'hide');\n if (options.val !== undefined) bindVal(ctx, options.val);\n if (options.checked !== undefined) bindChecked(ctx, options.checked);\n if (options.on) bindEvents(ctx, options.on);\n });\n};\n","import $ from 'jquery';\nimport { registerReactiveEffect } from './effect-factory';\nimport { registry } from './registry';\nimport type { ReactiveValue, ValOptions, WritableAtom } from './types';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindHtml,\n bindProp,\n bindVal,\n bindVisibility,\n createContext,\n} from './unified';\n\n/**\n * Updates element text content.\n * Kept separate from unified bindText because of the formatter parameter.\n */\n$.fn.atomText = function <T>(source: ReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return this.each(function () {\n const $el = $(this);\n const update = formatter\n ? (val: T) => $el.text(formatter(val))\n : (val: T) => $el.text(String(val ?? ''));\n\n registerReactiveEffect(this, source, update, 'text');\n });\n};\n\n/**\n * Updates element inner HTML.\n */\n$.fn.atomHtml = function (source: ReactiveValue<string>): JQuery {\n return this.each(function () {\n bindHtml(createContext(this), source);\n });\n};\n\n/**\n * Toggles a CSS class based on boolean value.\n */\n$.fn.atomClass = function (className: string, condition: ReactiveValue<boolean>): JQuery {\n return this.each(function () {\n bindClass(createContext(this), { [className]: condition });\n });\n};\n\n/**\n * Updates a CSS style property.\n */\n$.fn.atomCss = function (\n prop: string,\n source: ReactiveValue<string | number>,\n unit?: string\n): JQuery {\n return this.each(function () {\n bindCss(createContext(this), { [prop]: unit ? [source, unit] : source });\n });\n};\n\n/**\n * Updates an HTML attribute.\n */\n$.fn.atomAttr = function (name: string, source: ReactiveValue<string | boolean | null>): JQuery {\n return this.each(function () {\n bindAttr(createContext(this), { [name]: source });\n });\n};\n\n/**\n * Updates a DOM property (e.g., checked, selected, value).\n */\n$.fn.atomProp = function <T extends string | number | boolean | null | undefined>(\n name: string,\n source: ReactiveValue<T>\n): JQuery {\n return this.each(function () {\n bindProp(createContext(this), { [name]: source });\n });\n};\n\n/**\n * Shows element when condition is true.\n */\n$.fn.atomShow = function (condition: ReactiveValue<boolean>): JQuery {\n return this.each(function () {\n bindVisibility(createContext(this), condition, false, 'show');\n });\n};\n\n/**\n * Hides element when condition is true.\n */\n$.fn.atomHide = function (condition: ReactiveValue<boolean>): JQuery {\n return this.each(function () {\n bindVisibility(createContext(this), condition, true, 'hide');\n });\n};\n\n/**\n * Two-way binding for input values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return this.each(function () {\n bindVal(\n createContext(this),\n options && Object.keys(options).length > 0 ? [atom, options] : atom\n );\n });\n};\n\n/**\n * Two-way binding for checkbox/radio checked state.\n * Uses jQuery event system (not native) for compatibility with $.fn.trigger().\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return this.each(function () {\n bindChecked(createContext(this), atom);\n });\n};\n\n/**\n * Binds an event handler with automatic cleanup.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return this.each(function () {\n const $el = $(this);\n $el.on(event, handler);\n registry.trackCleanup(this, () => $el.off(event, handler));\n });\n};\n\n/**\n * Removes all atom bindings.\n */\n$.fn.atomUnbind = function (): JQuery {\n return this.each(function () {\n registry.cleanupTree(this);\n });\n};\n","import { effect } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ListOptions, ReadonlyAtom } from './types';\nimport { getLIS, getSelector, sanitizeHtml, shallowEqual } from './utils';\n\n/**\n * atomList with Smart Reconciliation\n * Optimized for performance and data locality.\n */\n$.fn.atomList = function <T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const { key, render, bind, update, onAdd, onRemove, empty } = options;\n\n // Resolve getKey once to avoid repeated typeof checks in the Hot Path\n const getKey =\n typeof key === 'function'\n ? key\n : (item: T, _index: number) => item[key as keyof T] as unknown as string | number;\n\n return this.each(function () {\n const $container = $(this);\n const containerSelector = getSelector(this);\n\n const itemMap = new Map<string | number, { $el: JQuery; item: T }>();\n const removingKeys = new Set<string | number>();\n let oldKeys: (string | number)[] = [];\n let $emptyEl: JQuery | null = null;\n\n const fx = effect(() => {\n const items = source.value;\n const itemCount = items.length;\n\n // 1. Handle Empty Template Logic\n if (itemCount === 0) {\n if (empty && !$emptyEl) {\n // Use type assertion to avoid overload ambiguity while maintaining JQuery return type\n const safeEmpty = typeof empty === 'string' ? sanitizeHtml(empty) : empty;\n $emptyEl = ($(safeEmpty as string) as JQuery).appendTo($container);\n }\n } else if ($emptyEl) {\n $emptyEl.remove();\n $emptyEl = null;\n }\n\n // Hot Path: If both new and old are empty, skip processing\n if (itemCount === 0 && itemMap.size === 0) {\n oldKeys = [];\n return;\n }\n\n debug.log('list', `${containerSelector} updating with ${itemCount} items`);\n\n // 2. Build Old Index Map (O(M))\n const oldIndexMap = new Map<string | number, number>();\n const oldLen = oldKeys.length;\n for (let i = 0; i < oldLen; i++) {\n oldIndexMap.set(oldKeys[i]!, i);\n }\n\n // 3. Prepare keys and LIS indices in a single pass (O(N))\n const newKeys: (string | number)[] = new Array(itemCount);\n const newKeySet = new Set<string | number>();\n const newIndices = new Int32Array(itemCount);\n\n for (let i = 0; i < itemCount; i++) {\n const item = items[i] as T;\n const k = getKey(item, i);\n\n if (newKeySet.has(k)) {\n console.warn(`${LOG_PREFIXES.LIST} ${ERROR_MESSAGES.DUPLICATE_KEY(k, i)}`);\n }\n\n newKeys[i] = k;\n newKeySet.add(k);\n newIndices[i] = oldIndexMap.get(k) ?? -1;\n }\n\n // 4. Remove vanished items (O(M))\n if (itemMap.size > 0) {\n for (const [k, entry] of itemMap) {\n if (newKeySet.has(k) || removingKeys.has(k)) continue;\n\n const cleanupItem = () => {\n entry.$el.remove();\n if (entry.$el[0]) registry.cleanup(entry.$el[0]);\n removingKeys.delete(k);\n debug.log('list', `${containerSelector} removed item:`, k);\n };\n\n itemMap.delete(k);\n removingKeys.add(k);\n\n if (onRemove) {\n const result = onRemove(entry.$el);\n if (result instanceof Promise) result.then(cleanupItem);\n else cleanupItem();\n } else {\n cleanupItem();\n }\n }\n }\n\n // After removals, check if we can skip the rest\n if (itemCount === 0) {\n oldKeys = [];\n return;\n }\n\n // 5. Get LIS (O(N log N))\n const lisArr = getLIS(newIndices);\n let lisIdx = lisArr.length - 1;\n\n // 6. Update and Reorder (Backwards iteration for insertBefore efficiency)\n let nextNode: Node | null = null;\n for (let i = itemCount - 1; i >= 0; i--) {\n const k = newKeys[i]!;\n const item = items[i]!;\n const entry = itemMap.get(k);\n\n if (entry) {\n // Existing Item Path\n const oldItem = entry.item;\n entry.item = item;\n const el = entry.$el[0];\n if (!el) continue;\n\n if (update) {\n update(entry.$el, item, i);\n debug.domUpdated(entry.$el, 'list.update', item);\n } else if (oldItem !== item && !shallowEqual(oldItem, item)) {\n {\n const rawRender = render(item, i);\n const safeRender =\n typeof rawRender === 'string' ? sanitizeHtml(rawRender) : rawRender;\n const $newEl = $(safeRender as string) as JQuery;\n const needsNextNodeUpdate = nextNode === el;\n entry.$el.replaceWith($newEl);\n entry.$el = $newEl;\n if (bind) bind($newEl, item, i);\n debug.domUpdated($newEl, 'list.render', item);\n if (needsNextNodeUpdate) nextNode = $newEl[0] || null;\n }\n }\n\n // Move if not in LIS\n if (lisIdx >= 0 && lisArr[lisIdx] === i) {\n lisIdx--;\n } else {\n const currentEl = entry.$el[0]!;\n if (nextNode?.isConnected) {\n if (nextNode !== currentEl) entry.$el.insertBefore(nextNode);\n } else {\n entry.$el.appendTo($container);\n }\n }\n nextNode = entry.$el[0] || null;\n } else {\n // New Item Path\n const rendered = render(item, i);\n const safeRendered = typeof rendered === 'string' ? sanitizeHtml(rendered) : rendered;\n const $el = $(safeRendered as string) as JQuery;\n itemMap.set(k, { $el, item });\n\n if (nextNode?.isConnected) $el.insertBefore(nextNode);\n else $el.appendTo($container);\n\n if (bind) bind($el, item, i);\n if (onAdd) onAdd($el);\n\n debug.domUpdated($el, 'list.add', item);\n nextNode = $el[0] || null;\n }\n }\n\n oldKeys = newKeys;\n });\n\n registry.trackEffect(this, fx);\n registry.trackCleanup(this, () => {\n itemMap.clear();\n removingKeys.clear();\n oldKeys = [];\n $emptyEl?.remove();\n });\n });\n};\n","import $ from 'jquery';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ComponentFn } from './types';\nimport { getSelector } from './utils';\n\nconst mountedComponents = new WeakMap<Element, () => void>();\n\n/**\n * Mounts a functional component to the element.\n * Automatically cleans up existing components on the same element.\n */\n$.fn.atomMount = function <P>(component: ComponentFn<P>, props: P = {} as P): JQuery {\n return this.each(function () {\n const selector = getSelector(this);\n\n // 1. Unmount existing component (Consolidated O(1) lookup)\n const existingUnmount = mountedComponents.get(this);\n if (existingUnmount) {\n debug.log('mount', `${selector} unmounting existing component`);\n existingUnmount();\n }\n\n debug.log('mount', `${selector} mounting component`);\n\n // 2. Mount\n let userCleanup: undefined | (() => void);\n try {\n userCleanup = component($(this), props);\n } catch (e) {\n console.error('[atom-effect-jquery] Mount error:', e);\n return;\n }\n\n // 3. Optimized cleanup\n const fullCleanup = () => {\n // Atomic delete() acts as a high-performance guard against double-cleanup\n if (!mountedComponents.delete(this)) return;\n\n debug.log('mount', `${selector} full cleanup`);\n\n if (typeof userCleanup === 'function') {\n try {\n userCleanup();\n } catch (e) {\n console.error('[atom-effect-jquery] Cleanup error:', e);\n }\n }\n registry.cleanupTree(this);\n };\n\n mountedComponents.set(this, fullCleanup);\n registry.trackCleanup(this, fullCleanup);\n });\n};\n\n/**\n * Manually unmounts a component from the element.\n */\n$.fn.atomUnmount = function (): JQuery {\n return this.each(function () {\n const unmount = mountedComponents.get(this);\n if (unmount) unmount();\n });\n};\n","import { atom as createAtom, effect } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { LOG_PREFIXES, ROUTE_DEFAULTS } from './constants';\nimport { registry } from './registry';\nimport type { RouteConfig, RouteDefinition, Router, WritableAtom } from './types';\n\n/**\n * Log prefix for router warnings and errors.\n */\nconst LOG_PREFIX = LOG_PREFIXES.ROUTE;\n\n/**\n * Creates an SPA router with reactive state management.\n * Supports both hash-based and pushState-based (history) routing.\n *\n * This removes boilerplate from manual route handling by:\n * - Automatically tracking URL changes and updating the UI\n * - Managing template rendering with lifecycle hooks\n * - Handling active link states reactively\n * - Providing navigation guard support (onLeave)\n *\n * @param config - Router configuration\n * @returns Router instance with navigate, destroy methods and currentRoute atom\n *\n * @example\n * ```ts\n * const router = $.route({\n * target: '#app',\n * default: 'home',\n * routes: {\n * home: { template: '#tmpl-home' },\n * about: { template: '#tmpl-about' }\n * }\n * });\n */\nexport function route(config: RouteConfig): Router {\n // Destructure configuration with defaults\n const {\n target,\n default: defaultRoute,\n routes,\n notFound,\n mode = ROUTE_DEFAULTS.MODE,\n basePath = ROUTE_DEFAULTS.BASE_PATH,\n autoBindLinks = ROUTE_DEFAULTS.AUTO_BIND_LINKS,\n activeClass = ROUTE_DEFAULTS.ACTIVE_CLASS,\n beforeTransition,\n afterTransition,\n } = config;\n\n const isHistoryMode = mode === 'history';\n\n let isDestroyed = false;\n let previousRoute: string | null = null;\n let previousUrl: string = isHistoryMode\n ? window.location.pathname + window.location.search\n : window.location.hash;\n const cleanups: Array<() => void> = [];\n const boundLinks = new Set<HTMLElement>(); // Track links for cleanup via registry\n\n // DOM references\n const $target = $(target);\n\n // --- Mode-abstracted internal functions ---\n\n /**\n * Extracts route name from current URL.\n * Hash mode: parses window.location.hash\n * History mode: extracts from pathname after basePath\n */\n const getRouteName = (): string => {\n if (isHistoryMode) {\n let pathname = window.location.pathname;\n // Remove basePath prefix\n if (basePath && pathname.startsWith(basePath)) {\n pathname = pathname.substring(basePath.length);\n }\n // Remove leading slash and extract route name (before any query)\n const routeName = pathname.replace(/^\\//, '');\n return routeName || defaultRoute;\n }\n // Hash mode\n const hash = window.location.hash;\n const qIndex = hash.indexOf('?');\n const routeName = qIndex === -1 ? hash.substring(1) : hash.substring(1, qIndex);\n return routeName || defaultRoute;\n };\n\n /**\n * Parses query parameters from the current URL.\n * Hash mode: parses from hash string (after ?)\n * History mode: parses from window.location.search\n */\n const getQueryParams = (): Record<string, string> => {\n let raw: string;\n\n if (isHistoryMode) {\n raw = window.location.search.substring(1); // Remove leading '?'\n if (!raw) return {};\n } else {\n const hash = window.location.hash;\n const qIndex = hash.indexOf('?');\n if (qIndex === -1) return {};\n raw = hash.substring(qIndex + 1);\n }\n\n const sp = new URLSearchParams(raw);\n const params: Record<string, string> = Object.fromEntries(sp);\n\n // Warn about malformed percent-encoded sequences (e.g. %FF%FE)\n if (raw.includes('%')) {\n try {\n decodeURIComponent(raw);\n } catch (_e) {\n console.warn(`${LOG_PREFIX} Malformed URI component: ${raw}`);\n }\n }\n\n return params;\n };\n\n /**\n * Updates the URL to reflect a new route.\n * Hash mode: sets window.location.hash\n * History mode: calls history.pushState\n */\n const setUrl = (routeName: string): void => {\n if (isHistoryMode) {\n // Remove trailing slash from basePath if present\n const url = `${basePath.replace(/\\/$/, '')}/${routeName}`;\n history.pushState(null, '', url);\n previousUrl = url;\n } else {\n const hash = `#${routeName}`;\n previousUrl = hash;\n window.location.hash = hash;\n }\n };\n\n /**\n * Restores the URL when a navigation guard blocks the transition.\n * Hash mode: reverts window.location.hash\n * History mode: calls history.replaceState\n */\n const restoreUrl = (): void => {\n if (isHistoryMode) {\n history.replaceState(null, '', previousUrl);\n } else {\n window.location.hash = previousUrl;\n }\n };\n\n /**\n * Returns the current full URL string for comparison purposes.\n */\n const getCurrentUrl = (): string => {\n if (isHistoryMode) {\n return window.location.pathname + window.location.search;\n }\n return window.location.hash;\n };\n\n // --- End mode-abstracted functions ---\n\n /**\n * Resolves route configuration, falling back to notFound route if needed.\n */\n const getRouteConfig = (routeName: string): RouteDefinition | null => {\n let routeConfig = routes[routeName];\n\n // Fallback to notFound route if route doesn't exist\n if (!routeConfig && notFound) {\n routeConfig = routes[notFound];\n }\n\n if (!routeConfig) {\n console.warn(`${LOG_PREFIX} Route \"${routeName}\" not found and no notFound route configured`);\n return null;\n }\n\n return routeConfig;\n };\n\n /**\n * Renders template content into target container.\n * @returns true if template was found and rendered, false otherwise\n */\n const renderTemplate = (templateSelector: string): boolean => {\n const template = document.querySelector(templateSelector) as HTMLTemplateElement;\n\n if (!template?.content) {\n console.warn(`${LOG_PREFIX} Template \"${templateSelector}\" not found`);\n return false;\n }\n\n const clonedContent = template.content.cloneNode(true) as DocumentFragment;\n $target.append(clonedContent);\n return true;\n };\n\n const currentRoute: WritableAtom<string> = createAtom(getRouteName());\n\n /**\n * Renders the specified route, including lifecycle hooks and content.\n * This is the main rendering function that orchestrates the entire render cycle.\n */\n const renderRoute = (routeName: string): void => {\n if (isDestroyed) return;\n\n // Validate target element exists\n const container = $target[0];\n if (!container) {\n console.warn(`${LOG_PREFIX} Target element \"${target}\" not found`);\n return;\n }\n\n // Resolve route configuration\n const routeConfig = getRouteConfig(routeName);\n if (!routeConfig) return;\n\n // Parse query parameters\n const params = getQueryParams();\n\n // Call beforeTransition hook\n if (beforeTransition) {\n beforeTransition(previousRoute || routeName, routeName);\n }\n\n // Clear current content\n $target.empty();\n\n // Call onEnter hook and merge params\n let routeParams = params;\n if (routeConfig.onEnter) {\n const result = routeConfig.onEnter(params);\n if (result !== undefined) {\n routeParams = { ...params, ...result };\n }\n }\n\n // Render content (custom render or template)\n if (routeConfig.render) {\n routeConfig.render(container, routeName, routeParams);\n } else if (routeConfig.template) {\n renderTemplate(routeConfig.template);\n }\n\n // Call afterTransition hook\n if (afterTransition) {\n afterTransition(previousRoute || routeName, routeName);\n }\n\n // Update previous route for next transition\n previousRoute = routeName;\n };\n\n /**\n * Navigates to the specified route programmatically.\n * Respects navigation guards (onLeave hooks).\n */\n const navigate = (routeName: string): void => {\n if (isDestroyed) return;\n\n // Check if leaving current route is allowed\n const currentRouteName = currentRoute.value;\n const currentRouteConfig = routes[currentRouteName];\n\n if (currentRouteConfig?.onLeave) {\n const canLeave = currentRouteConfig.onLeave();\n if (canLeave === false) return; // Navigation blocked\n }\n\n // Resolve empty route name to default route, matching getRouteName behavior\n const resolved = routeName || defaultRoute;\n setUrl(resolved);\n currentRoute.value = resolved;\n };\n\n /**\n * Handles browser URL change events (hashchange or popstate).\n */\n const handleUrlChange = (): void => {\n if (isDestroyed) return;\n\n const currentUrl = getCurrentUrl();\n if (currentUrl === previousUrl) return; // No actual change, or already handled by navigate()\n\n const newRoute = getRouteName();\n const oldRouteName = currentRoute.value;\n\n if (oldRouteName !== newRoute) {\n // Check onLeave guard for user-driven navigation\n const oldRouteConfig = routes[oldRouteName];\n if (oldRouteConfig?.onLeave) {\n if (oldRouteConfig.onLeave() === false) {\n // Navigation blocked, revert URL\n restoreUrl();\n return;\n }\n }\n currentRoute.value = newRoute;\n } else {\n // Same route but URL changed (e.g., query params), manually re-render\n renderRoute(newRoute);\n }\n\n previousUrl = currentUrl;\n };\n\n /**\n * Sets up automatic binding for navigation links with data-route attribute.\n * Uses event delegation for clicks handling dynamic elements.\n * Uses MutationObserver for active state management of dynamic elements.\n */\n const setupAutoBindLinks = (): void => {\n if (!autoBindLinks) return;\n\n // 1. Event Delegation for Navigation (Handles future elements automatically)\n const delegateHandler = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const routeAttr = (e.currentTarget as HTMLElement).dataset.route;\n if (routeAttr != null) navigate(routeAttr);\n };\n\n $(document).on('click', '[data-route]', delegateHandler);\n\n cleanups.push(() => {\n $(document).off('click', '[data-route]', delegateHandler);\n });\n\n // 2. Active State Management via MutationObserver\n // We need to attach effects to any [data-route] element that appears in the DOM.\n const bindActiveState = (el: HTMLElement) => {\n if (boundLinks.has(el)) return;\n\n const routeAttr = el.dataset.route!;\n\n boundLinks.add(el);\n\n // Bind reactive active state tracking\n const activeEffect = effect(() => {\n const isActive = currentRoute.value === routeAttr;\n el.classList.toggle(activeClass, isActive);\n\n // Update aria-current for accessibility\n if (isActive) {\n el.setAttribute('aria-current', 'page');\n } else {\n el.removeAttribute('aria-current');\n }\n });\n\n // Register effect with registry\n registry.trackEffect(el, activeEffect);\n\n // Cleanup tracking\n registry.trackCleanup(el, () => {\n boundLinks.delete(el);\n });\n };\n\n // Initial bind\n for (const el of document.querySelectorAll<HTMLElement>('[data-route]')) {\n bindActiveState(el);\n }\n\n // Watch for new elements\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'childList') {\n mutation.addedNodes.forEach((node) => {\n if (node.nodeType === 1) {\n // ELEMENT_NODE\n const el = node as HTMLElement;\n if (el.matches?.('[data-route]')) {\n bindActiveState(el);\n }\n // Check descendants\n if (el.querySelectorAll) {\n el.querySelectorAll('[data-route]').forEach((child) =>\n bindActiveState(child as HTMLElement)\n );\n }\n }\n });\n }\n }\n });\n\n observer.observe(document.body, { childList: true, subtree: true });\n cleanups.push(() => observer.disconnect());\n };\n\n /**\n * Cleans up all event listeners and effects.\n * Safe to call multiple times.\n */\n const destroy = (): void => {\n if (isDestroyed) return;\n isDestroyed = true;\n\n // Cleanup router-level effects (event listener, render effect)\n cleanups.forEach((cleanup) => cleanup());\n cleanups.length = 0;\n\n // Cleanup bound links via registry\n // This handles both click handlers and active state effects\n boundLinks.forEach((el) => registry.cleanup(el));\n boundLinks.clear();\n };\n\n // Set up URL change listener (hashchange for hash mode, popstate for history mode)\n const eventName = isHistoryMode ? 'popstate' : 'hashchange';\n window.addEventListener(eventName, handleUrlChange);\n cleanups.push(() => window.removeEventListener(eventName, handleUrlChange));\n\n // Initialize: Set up reactive rendering effect\n const renderEffect = effect(() => {\n renderRoute(currentRoute.value);\n });\n cleanups.push(() => renderEffect.dispose());\n\n // Auto-bind navigation links\n setupAutoBindLinks();\n\n // Auto-cleanup router if target element is removed\n if ($target[0]) {\n registry.trackCleanup($target[0], destroy);\n }\n\n return {\n currentRoute,\n navigate,\n destroy,\n };\n}\n\n/**\n * Register as jQuery static method.\n */\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchOptions } from './types';\n\n/**\n * Creates a reactive fetch atom that auto-refetches when reactive dependencies change.\n *\n * Wraps core's async `computed` with jQuery's `$.ajax`.\n * Returns a standard `ComputedAtom<T>` with `isPending`, `hasError`, `invalidate()`, etc.\n */\nfunction atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const { defaultValue, transform, method, headers, ajaxOptions } = options;\n const getUrl = typeof urlOrFn === 'function' ? urlOrFn : () => urlOrFn;\n\n return computed(\n async () => {\n const url = getUrl();\n const raw = await $.ajax({ ...ajaxOptions, url, method, headers });\n return transform ? transform(raw) : (raw as T);\n },\n { defaultValue, lazy: false }\n );\n}\n\n$.extend({ atomFetch });\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from './registry';\n\n/** Generic event handler type matching jQuery's internal handler signature */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * WeakMap to store strict association between original handlers and batched wrappers.\n * This ensures that .off() works correctly when passing the original handler.\n */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\nlet isjQueryOverridesEnabled = false;\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n let wrapped = handlerMap.get(fn);\n if (!wrapped) {\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\n/**\n * Patches jQuery methods to integrate with the reactive system.\n */\nexport function enablejQueryOverrides() {\n if (isjQueryOverridesEnabled) return;\n isjQueryOverridesEnabled = true;\n\n const originalOn = $.fn.on;\n const originalOff = $.fn.off;\n const originalRemove = $.fn.remove;\n const originalEmpty = $.fn.empty;\n const originalDetach = $.fn.detach;\n\n // ========== Lifecycle Overrides ==========\n\n // .remove() - Delete element + Unsubscribe\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) {\n registry.cleanupTree(el);\n registry.markIgnored(el);\n }\n }\n return originalRemove.call(this, selector);\n };\n\n // .empty() - Delete children + Recursive Unsubscribe\n $.fn.empty = function (this: JQuery) {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n if (el) registry.cleanupDescendants(el);\n }\n return originalEmpty.call(this);\n };\n\n // .detach() - Remove from DOM + Keep Subscription\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return originalDetach.call(this, selector);\n };\n\n // ========== Event Overrides ==========\n\n // Patch .on()\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n const map = types as Record<string, EventHandler>;\n const newMap: Record<string, EventHandler> = {};\n for (const key in map) {\n const handler = map[key];\n if (handler) {\n newMap[key] = getWrappedHandler(handler);\n }\n }\n args[0] = newMap;\n } else {\n for (let i = args.length - 1; i >= 0; i--) {\n if (typeof args[i] === 'function') {\n args[i] = getWrappedHandler(args[i] as EventHandler);\n break;\n }\n }\n }\n\n return originalOn.apply(this, args as Parameters<typeof originalOn>);\n };\n\n // Patch .off()\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n const map = types as Record<string, EventHandler>;\n const newMap: Record<string, EventHandler> = {};\n for (const key in map) {\n const handler = map[key];\n if (handler) {\n newMap[key] = handlerMap.get(handler) || handler;\n }\n }\n args[0] = newMap;\n } else {\n for (let i = args.length - 1; i >= 0; i--) {\n if (typeof args[i] === 'function') {\n args[i] = handlerMap.get(args[i] as EventHandler) || args[i];\n break;\n }\n }\n }\n\n return originalOff.apply(this, args as Parameters<typeof originalOff>);\n };\n}\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n */\n\nimport $ from 'jquery';\n\n// Register plugins\nimport './namespace';\nimport './chainable';\nimport './unified';\nimport './list';\nimport './mount';\nimport './route';\nimport './fetch';\n\nimport { enablejQueryOverrides } from './jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from './registry';\n\n// Auto-enable on DOM ready\n$(() => {\n enablejQueryOverrides();\n enableAutoCleanup(document.body);\n});\n\n// Explicit import support\nexport {\n atom,\n batch,\n computed,\n effect,\n untracked,\n} from '@but212/atom-effect';\n// Optional: Auto-batching for jQuery events\nexport { enablejQueryOverrides } from './jquery-patch';\n// Export types\nexport type {\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n ListOptions,\n ReadonlyAtom,\n RouteConfig,\n RouteDefinition,\n Router,\n WritableAtom,\n} from './types';\n\nexport { registry, enableAutoCleanup, disableAutoCleanup };\nexport default $;\n"],"names":["A","l","K","a","p","ot","X","B","J","ht","C","e","E","g","m","ct","ut","U","L","i","lt","_t","Z","n","r","o","h","M","G","I","v","c","D","tt","et","x","z","w","H","k","st","at","Q","Y","ft","Et","b","V","it","nt","_","Tt","j","dt","Ot","pt","u","f","bt","At","rt","q","$","N","S","R","d","O","y","T","P","It","St","gt","F","yt","W","Dt","Rt","kt","isReactive","value","isAtom","isComputed","getSelector","el","dom","id","tagName","classes","res","len","cls","sanitizeHtml","html","safe","dangerousTagPattern","prev","protocolRegex","dangerousDataUriRegex","URL_ATTRS","DANGEROUS_PROTOCOL_RE","isDangerousUrl","attrName","isDangerousCssValue","shallowEqual","keysA","keysB","objB","key","getLIS","arr","predecessors","result","resultLen","val","lastIdx","left","right","mid","midIdx","leftIdx","lis","curr","getInitialDebugState","flag","debugEnabled","debug","type","args","name","oldVal","newVal","$el","highlightElement","selector","HIGHLIGHT_CLASS","styleInjected","injectHighlightStyle","style","highlightTimers","existing","atom","initialValue","options","createAtom","nextTick","resolve","computed","effect","batch","untracked","AES_BOUND_CLASS","LOG_PREFIXES","ROUTE_DEFAULTS","INPUT_DEFAULTS","DANGEROUS_PROPS","ERROR_MESSAGES","raw","prop","index","AES_BOUND","BindingRegistry","node","fx","record","fn","effects","cleanups","children","child","registry","observer","enableAutoCleanup","root","mutations","removedNodes","rLen","disableAutoCleanup","registerReactiveEffect","source","updater","debugType","BindingFlags","createInputBindingState","applyInputBinding","debounceMs","event","parse","format","equal","state","syncAtomFromDom","currentRaw","parsed","onBlur","formatted","onInput","handlers","currentVal","start","end","camelCache","getCamelCase","cached","createContext","_$el","bindText","ctx","bindHtml","sanitized","bindClass","classMap","className","bindCss","cssMap","camel","isArr","unit","strVal","bindAttr","attrMap","c0","bindProp","propMap","bindVisibility","condition","invert","label","visible","bindVal","cfg","fxFn","cleanup","bindChecked","handler","current","bindEvents","eventMap","listener","formatter","render","bind","update","onAdd","onRemove","empty","getKey","item","_index","$container","containerSelector","itemMap","removingKeys","oldKeys","$emptyEl","items","itemCount","safeEmpty","oldIndexMap","oldLen","newKeys","newKeySet","newIndices","entry","cleanupItem","lisArr","lisIdx","nextNode","oldItem","rawRender","safeRender","$newEl","needsNextNodeUpdate","currentEl","rendered","safeRendered","mountedComponents","component","props","existingUnmount","userCleanup","fullCleanup","unmount","LOG_PREFIX","route","config","target","defaultRoute","routes","notFound","mode","basePath","autoBindLinks","activeClass","beforeTransition","afterTransition","isHistoryMode","isDestroyed","previousRoute","previousUrl","boundLinks","$target","getRouteName","pathname","hash","qIndex","getQueryParams","sp","params","setUrl","routeName","url","restoreUrl","getCurrentUrl","getRouteConfig","routeConfig","renderTemplate","templateSelector","template","clonedContent","currentRoute","renderRoute","container","routeParams","navigate","currentRouteName","currentRouteConfig","resolved","handleUrlChange","currentUrl","newRoute","oldRouteName","oldRouteConfig","setupAutoBindLinks","delegateHandler","routeAttr","bindActiveState","activeEffect","isActive","mutation","destroy","eventName","renderEffect","atomFetch","urlOrFn","defaultValue","transform","method","headers","ajaxOptions","getUrl","handlerMap","isjQueryOverridesEnabled","getWrappedHandler","wrapped","enablejQueryOverrides","originalOn","originalOff","originalRemove","originalEmpty","originalDetach","targets","types","map","newMap"],"mappings":"+QAAK,MAACA,GAAI,CACR,KAAM,OACN,QAAS,UACT,SAAU,WACV,SAAU,UACZ,EAAGC,EAAI,CACL,SAAU,EACV,UAAW,CACb,EAAGC,GAAI,CACL,SAAU,EAEV,YAAa,EACb,MAAO,EACP,KAAM,GACN,QAAS,GACT,SAAU,GACV,SAAU,IACV,YAAa,IACb,UAAW,GACb,EAAGC,EAAI,CACL,SAAU,EACV,KAAM,EACN,uBAAwB,EAC1B,EAIGC,EAAI,CAEL,0BAA2B,IAC3B,0BAA2B,IAE3B,yBAA0B,IAC1B,qBAAsB,IACtB,qBAAsB,GAEtB,6BAA8B,GAChC,EAAGC,GAAK,CACN,mBAAoB,EAEtB,EAAGC,GAAI,CACL,kBAAmB,EACnB,eAAgB,OAAO,iBAAmB,CAC5C,EAAGC,GAAI,WAAYC,GAAI,OAAO,QAAU,KAAO,QAAQ,KAAO,IAAM,GAAIC,GAAK,OAAO,OAAO,CAAA,CAAE,EAC7F,MAAMC,UAAU,KAAM,CACpB,YAAY,EAAGC,EAAI,KAAM,EAAI,GAAI,CAC/B,MAAM,CAAC,EAAG,KAAK,MAAQA,EAAG,KAAK,YAAc,EAAG,KAAK,KAAO,WAC9D,CACF,CACA,MAAMC,UAAUF,CAAE,CAChB,YAAY,EAAGC,EAAI,KAAM,CACvB,MAAM,EAAGA,EAAG,EAAE,EAAG,KAAK,KAAO,eAC/B,CACF,CACA,MAAME,WAAUH,CAAE,CAChB,YAAY,EAAGC,EAAI,KAAM,CACvB,MAAM,EAAGA,EAAG,EAAE,EAAG,KAAK,KAAO,aAC/B,CACF,CACA,MAAMG,WAAUJ,CAAE,CAChB,YAAY,EAAGC,EAAI,KAAM,CACvB,MAAM,EAAGA,EAAG,EAAE,EAAG,KAAK,KAAO,gBAC/B,CACF,CACA,MAAMI,GAAqB,OAAO,sBAAsB,EAAGC,GAAqB,OAAO,iBAAiB,EAAGC,GAAoB,OAAO,2BAA2B,EAAGC,GAAI,CAEtK,QAASV,GACT,iBAAkBH,GAAG,mBACrB,KAAKc,EAAG,EAAG,CACX,EACA,cAAcA,EAAG,EAAG,CAClB,GAAIA,IAAM,EACR,MAAM,IAAIP,EAAE,qCAAqC,CACrD,EACA,gBAAgBO,EAAG,EAAGR,EAAG,CACzB,EACA,aAAeQ,GAAMA,IAAIJ,EAAE,EAC3B,aAAeI,GAAMA,IAAIH,EAAE,CAC7B,EACA,IAAII,GAAK,EACT,MAAMC,GAAK,IAAMD,KACjB,SAASE,GAAEH,EAAG,EAAGR,EAAG,CAClB,GAAI,OAAO,GAAK,WAAY,CAC1B,MAAMY,EAAI,EACV,QAASC,EAAI,EAAGC,EAAId,EAAE,OAAQa,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAIf,EAAEa,CAAC,EACb,GAAIE,GAAKA,EAAE,KAAOH,EAAG,MACvB,CACAZ,EAAE,KAAK,IAAIgB,GAAEJ,EAAG,MAAM,CAAC,EACvB,MACF,CACA,GAAI,kBAAmB,EAAG,CACxB,EAAE,cAAcJ,CAAC,EACjB,MACF,CACA,MAAM,EAAI,EACV,QAASI,EAAI,EAAGC,EAAIb,EAAE,OAAQY,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAId,EAAEY,CAAC,EACb,GAAIE,GAAKA,EAAE,MAAQ,EAAG,MACxB,CACAd,EAAE,KAAK,IAAIgB,GAAE,OAAQ,CAAC,CAAC,CACzB,CACA,SAASC,GAAET,EAAG,EAAGR,EAAG,CAClB,MAAM,EAAoB,IAAI,IAC9B,QAASY,EAAI,EAAGC,EAAI,EAAE,OAAQD,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAI,EAAEF,CAAC,EACbE,GAAG,OAAS,EAAE,IAAIA,EAAE,KAAMA,EAAE,KAAK,CACnC,CACA,QAASF,EAAI,EAAGC,EAAIL,EAAE,OAAQI,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAIN,EAAEI,CAAC,EACb,GAAI,CAACE,EAAG,SACR,MAAMC,EAAID,EAAE,KAAMI,EAAI,EAAE,IAAIH,CAAC,EAC7BG,IAAM,QAAUJ,EAAE,MAAQI,EAAG,EAAE,OAAOH,CAAC,IAAMR,GAAE,cAAcQ,EAAGf,CAAC,EAAGc,EAAE,MAAQC,EAAE,UAAUf,CAAC,EAC7F,CACA,UAAWY,KAAK,EAAE,OAAM,EACtBA,EAAC,CACL,CACA,MAAMO,EAAE,CACN,YAAY,EAAGnB,EAAG,EAAI,OAAQ,CAC5B,KAAK,KAAO,EAAG,KAAK,QAAUA,EAAG,KAAK,MAAQ,CAChD,CACF,CACA,MAAMgB,EAAE,CACN,YAAY,EAAGhB,EAAG,CAChB,KAAK,GAAK,EAAG,KAAK,IAAMA,CAC1B,CACF,CACA,MAAMoB,EAAI,CAER,0BAA2B,qCAC3B,kCAAmC,kDACnC,4BAA6B,+BAC7B,kCAAmC,qCACnC,6BAA8B,+BAC9B,kBAAmB,wCAEnB,iCAAkC,qDAClC,kCAAmC,8BAEnC,wBAAyB,mCACzB,wBAAyB,0BACzB,sBAAuB,wBACvB,gBAAiB,mCAEjB,yBAA0B,CAACZ,EAAG,IAAM,6BAA6BA,CAAC,eAAe,CAAC,yCAElF,gCAAiC,2CAEjC,gCAAiC,2EACjC,oCAAqC,wCACrC,kCAAmC,4DACrC,EACA,SAASa,GAAEb,EAAG,EAAGR,EAAG,CAClB,GAAIQ,aAAaT,EACf,OAAOS,EACT,MAAM,EAAIA,aAAa,MAAOI,EAAI,EAAIJ,EAAE,QAAU,OAAOA,CAAC,EAAGK,EAAI,EAAIL,EAAI,OAAQO,EAAI,GAAG,EAAIP,EAAE,YAAY,KAAO,kBAAkB,KAAKR,CAAC,MAAMY,CAAC,GAChJ,OAAO,IAAI,EAAEG,EAAGF,CAAC,CACnB,CACA,MAAMS,EAAG,CACP,aAAc,CACZ,KAAK,MAAQ,EAAG,KAAK,QAAU,EAAG,KAAK,eAAiB,GAAI,KAAK,GAAKZ,GAAE,EAAKd,EAC/E,CACF,CACA,MAAM2B,WAAWD,EAAG,CAIlB,UAAU,EAAG,CACX,MAAMtB,EAAI,OAAO,GAAK,WACtB,GAAI,CAACA,IAAM,CAAC,GAAK,OAAO,EAAE,SAAW,YACnC,MAAMqB,GACJ,IAAI,UAAU,oBAAoB,EAClCtB,EACAqB,EAAE,gCACV,EACI,MAAM,EAAI,KAAK,aACf,QAASP,EAAI,EAAGC,EAAI,EAAE,OAAQD,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAI,EAAEF,CAAC,EACb,GAAIE,IAAMf,EAAIe,EAAE,KAAO,EAAIA,EAAE,MAAQ,GACnC,MAAO,IAAM,CACb,CACJ,CACA,MAAMH,EAAI,IAAII,GACZhB,EAAI,EAAI,OACRA,EAAI,OAAS,CACnB,EACI,OAAO,EAAE,KAAKY,CAAC,EAAG,IAAM,KAAK,aAAaA,CAAC,CAC7C,CACA,aAAa,EAAG,CACd,MAAMZ,EAAI,KAAK,aAAc,EAAIA,EAAE,QAAQ,CAAC,EAC5C,GAAI,IAAM,GAAI,OACd,MAAMY,EAAIZ,EAAE,IAAG,EACf,EAAIA,EAAE,QAAUY,IAAMZ,EAAE,CAAC,EAAIY,EAC/B,CACA,iBAAkB,CAChB,OAAO,KAAK,aAAa,MAC3B,CACA,mBAAmB,EAAGZ,EAAG,CACvB,GAAI,KAAK,aAAa,SAAW,EAAG,OACpC,MAAM,EAAI,KAAK,aAAa,MAAM,CAAC,EAAGY,EAAI,EAAE,OAC5C,QAASC,EAAI,EAAGA,EAAID,EAAGC,IAAK,CAC1B,MAAMC,EAAI,EAAED,CAAC,EACb,GAAIC,EACF,GAAI,CACFA,EAAE,GAAKA,EAAE,GAAG,EAAGd,CAAC,EAAIc,EAAE,KAAOA,EAAE,IAAI,QAAO,CAC5C,OAASC,EAAG,CACV,KAAK,mBAAmBA,CAAC,CAC3B,CACJ,CACF,CACA,mBAAmB,EAAG,CACpB,QAAQ,MAAMM,GAAE,EAAGtB,EAAGqB,EAAE,iCAAiC,CAAC,CAC5D,CACF,CACA,IAAII,GAAI,EACR,MAAMC,GAAI,KAAOD,GAAIA,GAAI,EAAI5B,IAAK,EAAG4B,IAAIE,GAAKlB,GAAMA,EAAI,EAAIZ,GAC5D,IAAI+B,GAAI,EAAGC,GAAI,GAAIC,GAAK,EACxB,MAAMC,GAAK,IAAMD,GACjB,SAASE,IAAI,CACX,OAAOH,GAAI,IAAMA,GAAI,GAAIC,GAAKJ,KAAKE,GAAI,EAAG,GAC5C,CACA,MAAMK,GAAI,IAAM,CACdJ,GAAI,EACN,EAAGK,GAAK,IAAML,GAAI,EAAED,GAAI,EACxB,MAAMO,EAAG,CACP,aAAc,CACZ,KAAK,aAAe,CAAC,CAAA,EAAI,CAAA,CAAE,EAAG,KAAK,aAAe,EAAG,KAAK,MAAQ,EAAG,KAAK,OAAS,EAAG,KAAK,cAAgB,GAAI,KAAK,YAAc,GAAI,KAAK,gBAAkB,GAAI,KAAK,YAAc,EAAG,KAAK,YAAc,CAAA,EAAI,KAAK,gBAAkB,EAAG,KAAK,oBAAsBzC,EAAE,qBAAsB,KAAK,WAAa,KAAM,KAAK,cAAgB,KAAK,SAAS,KAAK,IAAI,CACjW,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,eAAiB,KAAK,gBAAkB,EAAI,KAAK,YAAc,EAAI,CACjF,CACA,IAAI,WAAY,CACd,OAAO,KAAK,KACd,CACA,IAAI,YAAa,CACf,OAAO,KAAK,WACd,CAIA,SAAS,EAAG,CACV,GAAI,EAAE,aAAe,KAAK,OAAQ,CAChC,GAAI,EAAE,WAAa,KAAK,OAAQ,KAAK,aAAe,KAAK,gBAAiB,CACxE,KAAK,YAAY,KAAK,iBAAiB,EAAI,EAC3C,MACF,CACA,KAAK,aAAa,KAAK,YAAY,EAAE,KAAK,OAAO,EAAI,EAAG,KAAK,eAAiB,KAAK,OAAM,CAC3F,CACF,CAIA,QAAS,CACP,KAAK,eAAiB,KAAK,QAAU,IAAM,KAAK,cAAgB,GAAI,eAAe,KAAK,aAAa,EACvG,CAIA,UAAW,CACT,GAAI,CACF,GAAI,KAAK,QAAU,EAAG,OACtB,MAAM,EAAIsC,GAAC,EACX,KAAK,YAAW,EAAI,GAAKC,GAAC,CAC5B,QAAC,CACC,KAAK,cAAgB,GAAI,KAAK,MAAQ,GAAK,CAAC,KAAK,aAAe,KAAK,OAAM,CAC7E,CACF,CACA,YAAa,CACX,KAAK,gBAAkB,GACvB,MAAM,EAAID,GAAC,EACX,GAAI,CACF,KAAK,iBAAgB,EAAI,KAAK,YAAW,CAC3C,QAAC,CACC,KAAK,gBAAkB,GAAI,GAAKC,GAAC,CACnC,CACF,CACA,kBAAmB,CACjB,GAAI,KAAK,kBAAoB,EAAG,OAChC,MAAM,EAAI,EAAE,KAAK,OAAQhC,EAAI,KAAK,YAAa,EAAI,KAAK,aAAa,KAAK,YAAY,EACtF,IAAIY,EAAI,KAAK,MACb,QAASC,EAAI,EAAGA,EAAI,KAAK,gBAAiBA,IAAK,CAC7C,MAAMC,EAAId,EAAEa,CAAC,EACbC,EAAE,aAAe,IAAMA,EAAE,WAAa,EAAG,EAAEF,GAAG,EAAIE,EACpD,CACA,KAAK,MAAQF,EAAG,KAAK,gBAAkB,EAAGZ,EAAE,OAASP,EAAE,+BAAiCO,EAAE,OAAS,EACrG,CACA,aAAc,CACZ,IAAI,EAAI,EACR,KAAO,KAAK,MAAQ,GAAK,CACvB,GAAI,EAAE,EAAI,KAAK,oBAAqB,CAClC,KAAK,qBAAoB,EACzB,MACF,CACA,KAAK,cAAa,EAAI,KAAK,iBAAgB,CAC7C,CACF,CACA,eAAgB,CACd,MAAM,EAAI,KAAK,aAAcA,EAAI,KAAK,aAAa,CAAC,EAAG,EAAI,KAAK,MAChE,KAAK,aAAe,EAAI,EAAG,KAAK,MAAQ,EAAG,KAAK,SAChD,QAASY,EAAI,EAAGA,EAAI,EAAGA,IACrB,GAAI,CACFZ,EAAEY,CAAC,EAAC,CACN,OAASC,EAAG,CACV,QAAQ,MAAM,IAAIV,GAAE,4CAA6CU,CAAC,CAAC,CACrE,CACFb,EAAE,OAAS,CACb,CACA,sBAAuB,CACrB,MAAM,EAAI,KAAK,MAAQ,KAAK,gBAC5B,GAAI,QAAQ,MACV,IAAIG,GACFiB,EAAE,yBAAyB,KAAK,oBAAqB,CAAC,CAC9D,CACA,EAAO,KAAK,MAAQ,EAAG,KAAK,aAAa,KAAK,YAAY,EAAE,OAAS,EAAG,KAAK,gBAAkB,EAAG,KAAK,WACjG,GAAI,CACF,KAAK,WAAW,CAAC,CACnB,MAAQ,CACR,CACJ,CACA,YAAa,CACX,KAAK,cAAe,KAAK,YAAc,EACzC,CACA,UAAW,CACT,KAAK,cAAgB,GAAK,EAAE,KAAK,cAAgB,IAAM,KAAK,WAAU,EAAI,KAAK,YAAc,GAC/F,CACA,sBAAsB,EAAG,CACvB,GAAI,EAAI3B,EAAE,qBACR,MAAM,IAAIU,GACR,yCAAyCV,EAAE,oBAAoB,EACvE,EACI,KAAK,oBAAsB,CAC7B,CACF,CACA,MAAM0C,GAAI,IAAID,GAAME,GAAoB,OAAO,IAAI,kBAAkB,EAAGC,GAAqB,OAAO,IAAI,sBAAsB,EAAGC,GAAqB,OAAO,IAAI,oBAAoB,EAAGC,EAAI,CAE1L,QAAS,KAQT,IAAI/B,EAAG,EAAG,CACR,MAAMR,EAAI,KAAK,QACf,KAAK,QAAUQ,EACf,GAAI,CACF,OAAO,EAAC,CACV,QAAC,CACC,KAAK,QAAUR,CACjB,CACF,CACF,EACA,SAASwC,GAAGhC,EAAG,CACb,MAAM,EAAI+B,EAAE,QACZ,GAAI,IAAM,KAAM,OAAO/B,EAAC,EACxB+B,EAAE,QAAU,KACZ,GAAI,CACF,OAAO/B,EAAC,CACV,QAAC,CACC+B,EAAE,QAAU,CACd,CACF,CACA,IAAIE,GACJ,MAAMC,WAAWnB,EAAG,CAClB,YAAY,EAAGvB,EAAG,CAChB,MAAK,EAAI,KAAK,iBAAmB,OAAQ,KAAK,YAAc,IAAM,KAAK,oBAAmB,EAAI,KAAK,aAAe,CAAA,EAAI,KAAKyC,EAAC,EAAI,GAAI,KAAK,OAAS,EAAGzC,IAAM,KAAK,OAASR,EAAE,MAAOe,GAAE,gBAAgB,KAAM,OAAQ,KAAK,EAAE,CAC3N,CACA,IAAI,OAAQ,CACV,MAAM,EAAIgC,EAAE,QACZ,OAAO,GAAK5B,GAAE,KAAM,EAAG,KAAK,YAAY,EAAG,KAAK,MAClD,CACA,IAAI,MAAM,EAAG,CACX,MAAMX,EAAI,KAAK,OACf,GAAI,OAAO,GAAGA,EAAG,CAAC,EAAG,OACrB,KAAK,OAAS,EAAG,KAAK,QAAU0B,GAAE,KAAK,OAAO,EAC9C,MAAM,EAAI,KAAK,MACf,GAAI,EAAE,KAAK,aAAa,SAAW,GAAK,EAAIlC,EAAE,wBAAyB,CACrE,GAAI,KAAK,iBAAmBQ,EAAG,KAAK,MAAQ,EAAIR,EAAE,uBAAwB,EAAIA,EAAE,MAAQ,CAAC2C,GAAE,WAAY,CACrG,KAAK,oBAAmB,EACxB,MACF,CACAA,GAAE,SAAS,KAAK,WAAW,CAC7B,CACF,CAIA,qBAAsB,CACpB,MAAM,EAAI,KAAK,MACf,GAAI,EAAE,EAAI3C,EAAE,yBAA2B,EAAIA,EAAE,SAC3C,OACF,MAAMQ,EAAI,KAAK,iBACf,KAAK,iBAAmB,OAAQ,KAAK,OAAS,IAAK,KAAK,mBAAmB,KAAK,OAAQA,CAAC,CAC3F,CACA,MAAO,CACL,OAAO,KAAK,MACd,CACA,SAAU,CACR,KAAK,MAAQR,EAAE,WAAa,KAAK,aAAa,OAAS,EAAG,KAAK,OAASA,EAAE,SAAU,KAAK,OAAS,OAAQ,KAAK,iBAAmB,OACpI,CACA,EAAEiD,GAAIL,GAAG,OAAO,QAAO,GAAK,CAC1B,KAAK,QAAO,CACd,CACF,CACA,SAASO,GAAGnC,EAAG,EAAI,GAAI,CACrB,OAAO,IAAIkC,GAAGlC,EAAG,EAAE,MAAQ,EAAE,CAC/B,CACA,MAAMoC,EAAG,CAMP,YAAY,EAAI,GAAI5C,EAAI,IAAK,EAAI,GAAI,CACnC,KAAK,MAAQ,EAAG,KAAK,SAAWA,EAAG,KAAK,KAAO,CAAA,EAAI,KAAK,MAAQ,KAAM,KAAK,MAAQ,EAAI,CACrF,SAAU,EACV,SAAU,EACV,SAAU,CAAE,OAAQ,EAAG,SAAU,EAAG,SAAU,CAAC,CACrD,EAAQ,IACN,CAIA,SAAU,CACR,OAAO,KAAK,OAAS,KAAK,MAAM,WAAY,KAAK,KAAK,IAAG,GAAM,CAAA,CACjE,CAOA,QAAQ,EAAGA,EAAG,CACZ,GAAI,EAAEA,GAAK,IAAMA,GAAI,CACnB,GAAI,EAAE,OAAS,KAAK,SAAU,CAC5B,KAAK,OAAS,KAAK,MAAM,SAAS,WAClC,MACF,CACA,GAAI,KAAK,KAAK,QAAU,KAAK,MAAO,CAClC,KAAK,OAAS,KAAK,MAAM,SAAS,WAClC,MACF,CACA,GAAI,OAAO,SAAS,CAAC,EAAG,CACtB,KAAK,OAAS,KAAK,MAAM,SAAS,SAClC,MACF,CACA,EAAE,OAAS,EAAG,KAAK,KAAK,KAAK,CAAC,EAAG,KAAK,OAAS,KAAK,MAAM,UAC5D,CACF,CAIA,UAAW,CACT,GAAI,CAAC,KAAK,MAAO,OAAO,KACxB,KAAM,CAAE,SAAU,EAAG,SAAUA,EAAG,SAAU,CAAC,EAAK,KAAK,MAAOY,EAAI,EAAIZ,GAAK,EAAE,OAAS,EAAE,SAAW,EAAE,UACrG,MAAO,CACL,SAAU,EACV,SAAUA,EACV,SAAU,CAAE,GAAG,CAAC,EAChB,OAAQY,EACR,SAAU,KAAK,KAAK,MAC1B,CACE,CAIA,OAAQ,CACN,KAAK,KAAK,OAAS,EAAG,KAAK,QAAU,KAAK,MAAQ,CAChD,SAAU,EACV,SAAU,EACV,SAAU,CAAE,OAAQ,EAAG,SAAU,EAAG,SAAU,CAAC,CACrD,EACE,CACF,CACA,MAAMiC,EAAI,OAAO,OACf,CAAA,CACF,EAAGC,EAAI,IAAIF,GACX,SAASG,GAAGvC,EAAG,CACb,OAAOA,IAAM,MAAQ,OAAOA,GAAK,UAAY4B,MAAK5B,CACpD,CACA,SAASwC,GAAGxC,EAAG,CACb,OAAOA,IAAM,MAAQ,OAAOA,GAAK,UAAY6B,MAAM7B,CACrD,CAIA,SAASyC,GAAGzC,EAAG,CACb,OAAOA,IAAM,MAAQ,OAAOA,GAAK,UAAY,OAAOA,EAAE,MAAQ,UAChE,CACA,IAAI0C,GAAGC,GACP,KAAM,CAAE,KAAMC,GAAG,MAAOC,GAAG,QAASC,GAAG,SAAUC,EAAG,SAAUC,GAAG,UAAWC,GAAG,YAAaC,GAAG,SAAUC,GAAG,YAAaC,EAAE,EAAKrE,GAChI,SAASsE,GAAGrD,EAAG,CACb,OAAOA,EAAI+C,EAAIlE,GAAE,SAAWmB,EAAI8C,GAAIjE,GAAE,QAAUmB,EAAIgD,GAAInE,GAAE,SAAWA,GAAE,IACzE,CACA,MAAMyE,WAAWvC,EAAG,CAClB,YAAY,EAAGvB,EAAI,GAAI,CACrB,GAAI,OAAO,GAAK,WAAY,MAAM,IAAIC,EAAEmB,EAAE,yBAAyB,EACnE,MAAK,EAAI,KAAK+B,EAAC,EAAI,GAAI,KAAKD,EAAC,EAAI,GAAI,KAAK,OAAS,KAAM,KAAK,WAAa,EAAG,KAAK,aAAe,CAAA,EAAI,KAAK,OAASL,EAAG,KAAK,4BAA8B,EAAG,KAAK,iBAAmB,EAAG,KAAK,YAAc,GAAI,KAAK,YAAcA,EAAG,KAAK,YAAc,EAAG,KAAK,OAAS,OAAQ,KAAK,MAAQe,GAAKP,GAAID,GAAG,KAAK,OAASpD,EAAE,OAAS,OAAO,GAAI,KAAK,IAAM,EAAG,KAAK,cAAgB,iBAAkBA,EAAIA,EAAE,aAAeM,GAAG,KAAK,SAAWN,EAAE,SAAW,KACxb,MAAM,EAAIA,EAAE,gBACZ,GAAI,KAAK,iBAAmB,GAAK,MAAQ,GAAK,EAAI,EAAIL,GAAE,kBAAmBY,GAAE,gBAAgB,KAAM,WAAY,KAAK,EAAE,EAAGP,EAAE,OAAS,GAClI,GAAI,CACF,KAAK,WAAU,CACjB,MAAQ,CACR,CACJ,CACA,QAAS,CACP,MAAM,EAAIuC,EAAE,QACZ,GAAK5B,GAAE,KAAM,EAAG,KAAK,YAAY,CACnC,CACA,IAAI,OAAQ,CACV,KAAK,OAAM,EACX,MAAM,EAAI,KAAK,MACf,IAAK,GAAK4C,EAAIF,GAAID,OAAQG,EACxB,OAAO,KAAK,OACd,GAAI,EAAII,GACN,MAAM,IAAI1D,EAAEmB,EAAE,iBAAiB,EACjC,GAAI,EAAIsC,GAAG,CACT,GAAI,KAAK,gBAAkBpD,GAAG,OAAO,KAAK,cAC1C,MAAM,IAAIL,EAAEmB,EAAE,4BAA4B,CAC5C,CACA,GAAI,GAAKiC,GAAID,MAAO,KAAK,aAAc,KAAK,MAAQG,GAClD,OAAO,KAAK,OACd,MAAMvD,EAAI,KAAK,cAAe,EAAIA,IAAMM,GACxC,GAAI,KAAK,MAAQgD,GAAG,CAClB,GAAI,EAAG,OAAOtD,EACd,MAAM,IAAIC,EAAEmB,EAAE,iCAAiC,CACjD,CACA,GAAI,KAAK,MAAQoC,GAAG,CAClB,GAAI,EAAG,OAAOxD,EACd,MAAM,KAAK,MACb,CACA,OAAO,KAAK,MACd,CACA,MAAO,CACL,OAAO,KAAK,MACd,CACA,IAAI,OAAQ,CACV,OAAO,KAAK,OAAM,EAAI6D,GAAG,KAAK,KAAK,CACrC,CACA,IAAI,UAAW,CACb,GAAI,KAAK,OAAM,EAAI,KAAK,OAASL,GAAIC,IAAI,MAAO,GAChD,MAAM,EAAI,KAAK,OACf,QAASzD,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IAAK,CACxC,MAAMY,EAAI,EAAEZ,CAAC,GAAG,KAChB,GAAIY,GAAKA,EAAE,MAAQ6C,GAAG,MAAO,EAC/B,CACA,MAAO,EACT,CACA,IAAI,SAAU,CACZ,MAAO,CAAC,KAAK,QACf,CACA,IAAI,QAAS,CACX,GAAI,KAAK,OAAM,EAAI,CAAC,KAAK,SAAU,OAAO3D,GAC1C,MAAM,EAAI,CAAA,EACV,KAAK,QAAU,EAAE,KAAK,KAAK,MAAM,EACjC,MAAME,EAAI,KAAK,OACf,QAAS,EAAI,EAAGY,EAAIZ,EAAE,OAAQ,EAAIY,EAAG,IAAK,CACxC,MAAMC,EAAIb,EAAE,CAAC,EAAE,KACf,GAAIa,EAAE,MAAQ4C,GAAG,CACf,MAAM1C,EAAIF,EAAE,OACZ,GAAIE,EAAE,OAAS,EACb,QAASG,EAAI,EAAGA,EAAIH,EAAE,OAAQG,IAAK,CACjC,MAAM6C,EAAIhD,EAAEG,CAAC,EACb6C,GAAK,EAAE,QAAQA,CAAC,IAAM,IAAM,EAAE,KAAKA,CAAC,CACtC,CACJ,CACF,CACA,OAAO,OAAO,OAAO,CAAC,CACxB,CACA,IAAI,WAAY,CACd,OAAO,KAAK,SAAU,KAAK,MAC7B,CACA,IAAI,WAAY,CACd,OAAO,KAAK,OAAM,GAAK,KAAK,MAAQT,MAAO,CAC7C,CACA,IAAI,YAAa,CACf,OAAO,KAAK,OAAM,GAAK,KAAK,MAAQC,KAAO,CAC7C,CACA,YAAa,CACX,KAAK,WAAU,CACjB,CACA,SAAU,CACR,GAAI,KAAK,MAAQI,GAAG,OACpB,MAAM,EAAI,KAAK,OACf,GAAI,IAAMd,EAAG,CACX,QAAS7C,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IACnC,EAAEA,CAAC,EAAE,QAAK,EACZ8C,EAAE,QAAQ,CAAC,EAAG,KAAK,OAASD,CAC9B,CACA,KAAK,aAAa,OAAS,EAAG,KAAK,MAAQc,GAAIN,GAAID,GAAG,KAAK,OAAS,KAAM,KAAK,OAAS,MAC1F,CACA,EAAED,GAAIf,GAAGc,GAAIb,GAAI,OAAO,WAAY,CAClC,KAAK,QAAO,CACd,CACA,cAAc,EAAG,CACf,GAAI,EAAE,iBAAmB,KAAK,YAAa,CACzC,GAAI,EAAE,eAAiB,KAAK,YAAa,KAAK,YAAc,KAAK,YAAY,OAAQ,CACnF,MAAMrC,EAAI,KAAK,YAAY,KAAK,WAAW,EAC3CA,EAAE,KAAO,EAAGA,EAAE,QAAU,EAAE,OAC5B,MACE,KAAK,YAAY,KAAK,IAAImB,GAAE,EAAG,EAAE,OAAO,CAAC,EAC3C,KAAK,aACP,CACF,CACA,YAAa,CACX,GAAI,KAAK,MAAQuC,GAAG,OACpB,KAAK,OAASA,GACd,MAAM,EAAI,KAAK,OACf,KAAK,YAAcjC,GAAC,EAAI,KAAK,YAAcqB,EAAE,QAAO,EAAI,KAAK,YAAc,EAC3E,IAAI9C,EAAI,GACR,GAAI,CACF,MAAM,EAAIuC,EAAE,IAAI,KAAM,KAAK,GAAG,EAC9B,KAAK,YAAY,OAAS,KAAK,YAAatB,GAAE,KAAK,YAAa,EAAG,IAAI,EAAG,KAAK,OAAS,KAAK,YAAajB,EAAI,GAAIiD,GAAG,CAAC,EAAI,KAAK,wBAAwB,CAAC,EAAI,KAAK,oBAAoB,CAAC,CACxL,OAAS,EAAG,CACV,GAAI,CAACjD,EACH,GAAI,CACF,KAAK,YAAY,OAAS,KAAK,YAAaiB,GAAE,KAAK,YAAa,EAAG,IAAI,EAAG,KAAK,OAAS,KAAK,YAAajB,EAAI,EAChH,MAAQ,CACR,CACF,KAAK,aAAa,EAAGoB,EAAE,4BAA6B,EAAE,CACxD,QAAC,CACCpB,GAAK,IAAM6C,EAAIC,EAAE,QAAQ,CAAC,EAAI9C,GAAK8C,EAAE,QAAQ,KAAK,WAAW,EAAG,KAAK,YAAc,GAAI,KAAK,YAAcD,EAAG,KAAK,YAAc,EAAG,KAAK,OAAS,CAACa,EACpJ,CACF,CACA,wBAAwB,EAAG,CACzB,KAAK,OAAS,KAAK,MAAQJ,IAAK,KAAM,KAAK,mBAAmB,OAAQ,MAAM,EAAG,KAAK,4BAA8B,KAAK,wBAAuB,EAAI,KAAK,iBAAmB,EAAG,KAAK,YAAc,KAAK,WAAa,GAAK3D,GAAE,eACzN,MAAMK,EAAI,KAAK,WACf,EAAE,KACC,GAAM,CACL,GAAIA,IAAM,KAAK,WAAY,CACzB,GAAI,KAAK,4BAA8B,KAAK,4BAC1C,OAAO,KAAK,mBAAqB,KAAK,iBAAmB,KAAK,aAAe,KAAK,aAChF,IAAIC,EACF,wCAAwC,KAAK,gBAAgB,WAC7E,EACcmB,EAAE,iCAChB,EACU,KAAK,oBAAoB,CAAC,EAAG,KAAK,mBAAmB,EAAG,MAAM,CAChE,CACF,EACC,GAAMpB,IAAM,KAAK,YAAc,KAAK,aAAa,EAAGoB,EAAE,iCAAiC,CAC9F,CACE,CACA,yBAA0B,CACxB,IAAI,EAAI,EACR,MAAMpB,EAAI,KAAK,OACf,QAAS,EAAI,EAAGY,EAAIZ,EAAE,OAAQ,EAAIY,EAAG,IACnC,GAAK,GAAK,GAAK,EAAIZ,EAAE,CAAC,EAAE,KAAK,QAAU,EACzC,OAAO,CACT,CACA,aAAa,EAAGA,EAAG,EAAI,GAAI,CACzB,MAAMY,EAAIS,GAAE,EAAGpB,EAAGD,CAAC,EACnB,GAAI,CAAC,GAAK,EAAE,KAAK,MAAQwD,MAAO,KAAK,QAAU9B,GAAE,KAAK,OAAO,GAAI,KAAK,OAASd,EAAG,KAAK,MAAQ,KAAK,MAAQ,KAAO4C,GAAIC,GAAG,KAAK,SAC7H,GAAI,CACF,KAAK,SAAS7C,CAAC,CACjB,OAASC,EAAG,CACV,QAAQ,MAAMO,EAAE,gCAAiCP,CAAC,CACpD,CACF,GAAI,EAAG,MAAMD,EACb,KAAK,mBAAmB,OAAQ,MAAM,CACxC,CACA,oBAAoB,EAAG,EACpB,EAAE,KAAK,MAAQ2C,IAAM,CAAC,KAAK,OAAO,KAAK,OAAQ,CAAC,KAAO,KAAK,QAAU7B,GAAE,KAAK,OAAO,GAAI,KAAK,OAAS,EAAG,KAAK,OAAS,KAAM,KAAK,OAAS,KAAK,MAAQ6B,GAAK,IAChK,CACA,SAAU,CACR,KAAK,WAAU,CACjB,CAEA,YAAa,CACX,KAAK,OAASG,GAAIL,MAAO,KAAK,OAASA,GAAG,KAAK,mBAAmB,OAAQ,MAAM,EAClF,CACF,CACA,SAASW,GAAGxD,EAAG,EAAI,GAAI,CACrB,OAAO,IAAIsD,GAAGtD,EAAG,CAAC,CACpB,CACA,IAAIyD,GACJ,MAAMC,WAAW5C,EAAG,CAClB,YAAY,EAAGtB,EAAI,GAAI,CACrB,MAAK,EAAI,KAAKiE,EAAC,EAAI,GAAI,KAAK,SAAW,KAAM,KAAK,OAASpB,EAAG,KAAK,WAAa,KAAM,KAAK,WAAaA,EAAG,KAAK,cAAgB,GAAI,KAAK,gBAAkB,GAAI,KAAK,mBAAqB,EAAG,KAAK,gBAAkB,EAAG,KAAK,aAAe,EAAG,KAAK,aAAe,EAAG,KAAK,QAAU,EAAG,KAAK,IAAM,EAAG,KAAK,SAAW7C,EAAE,SAAW,KAAM,KAAK,MAAQA,EAAE,MAAQ,GAAI,KAAK,eAAiBA,EAAE,wBAA0BP,EAAE,0BAA2B,KAAK,uBAAyBO,EAAE,uBAAyBP,EAAE,0BAA2B,KAAK,OAAS,KAAK,aAAe,OAAQ,KAAK,gBAAkB,IAAM,KAAK,QAAO,IAAO,KAAK,aAAe,IAAM,KAAK,UAAW,KAAK,gBAAkB,IAAM0C,GAAE,SAAS,KAAK,YAAY,GAAI5B,GAAE,gBAAgB,KAAM,SAAU,KAAK,EAAE,CACnvB,CACA,KAAM,CACJ,GAAI,KAAK,MAAQjB,EAAE,SACjB,MAAM,IAAIY,GAAEkB,EAAE,eAAe,EAC/B,KAAK,QAAQ,EAAE,CACjB,CACA,SAAU,CACR,KAAK,MAAQ9B,EAAE,WAAa,KAAK,OAASA,EAAE,SAAU,KAAK,aAAY,EAAI,KAAK,YAAY,KAAK,MAAM,EAAG,KAAK,SAAWuD,GAAKC,EAAE,QAAQ,KAAK,MAAM,EAAG,KAAK,OAASD,EAAG,KAAK,WAAaA,EAC5L,CACA,EAAEoB,GAAI3B,GAAI,OAAO,QAAO,GAAK,CAC3B,KAAK,QAAO,CACd,CACA,cAAc,EAAG,CACf,GAAI,EAAE,KAAK,MAAQhD,EAAE,WAAY,OACjC,MAAMU,EAAI,KAAK,cACf,GAAI,EAAE,iBAAmBA,EAAG,OAC5B,EAAE,eAAiBA,EACnB,MAAM,EAAI,KAAK,WAAYY,EAAI,KAAK,WACpC,QAASC,EAAI,EAAGC,EAAIF,EAAE,OAAQC,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAIH,EAAEC,CAAC,EACb,GAAIE,GAAKA,EAAE,OAAS,GAAKA,EAAE,MAAO,CAChCA,EAAE,QAAU,EAAE,QAAS,EAAE,KAAKA,CAAC,EAAGH,EAAEC,CAAC,EAAI,KACzC,MACF,CACF,CACA,GAAI,CACF,MAAMA,EAAI,EAAE,UAAU,KAAK,eAAe,EAC1C,EAAE,KAAK,IAAIM,GAAE,EAAG,EAAE,QAASN,CAAC,CAAC,CAC/B,OAASA,EAAG,CACV,MAAMC,EAAIO,GAAER,EAAGX,GAAGkB,EAAE,uBAAuB,EAC3C,GAAI,QAAQ,MAAMN,CAAC,EAAG,KAAK,SACzB,GAAI,CACF,KAAK,SAASA,CAAC,CACjB,MAAQ,CACR,CACF,EAAE,KAAK,IAAIK,GAAE,EAAG,EAAE,QAAS,MAAM,CAAC,CACpC,CACF,CAIA,QAAQ,EAAI,GAAI,CACd,GAAI,KAAK,OAAS7B,EAAE,SAAWA,EAAE,YAAc,CAAC,GAAK,KAAK,OAAO,OAAS,GAAK,CAAC,KAAK,WAAY,OACjG,KAAK,oBAAmB,EAAI,KAAK,OAASA,EAAE,UAAW,KAAK,aAAY,EAAI,KAAK,WAAa,KAAK,OACnG,MAAMU,EAAI8C,EAAE,QAAO,EACnB,KAAK,WAAa9C,EAAG,KAAK,cAAgByB,GAAC,EAC3C,IAAI,EAAI,GACR,GAAI,CACF,MAAMb,EAAI2B,EAAE,IAAI,KAAM,KAAK,GAAG,EAC9B,KAAK,OAASvC,EAAG,EAAI,GAAIiD,GAAGrC,CAAC,EAAI,KAAK,mBAAmBA,CAAC,EAAI,KAAK,SAAW,OAAOA,GAAK,WAAaA,EAAI,IAC7G,OAASA,EAAG,CACV,KAAK,OAASZ,EAAG,EAAI,GAAI,KAAK,sBAAsBY,CAAC,EAAG,KAAK,SAAW,IAC1E,QAAC,CACC,KAAK,sBAAsB,EAAG,KAAK,WAAYZ,CAAC,EAAG,KAAK,OAAS,EACnE,CACF,CACA,mBAAmB,EAAG,CACpB,MAAMA,EAAI,EAAE,KAAK,QACjB,EAAE,KACC,GAAM,CACL,GAAIA,IAAM,KAAK,SAAW,KAAK,MAAQV,EAAE,SAAU,CACjD,GAAI,OAAO,GAAK,WACd,GAAI,CACF,EAAC,CACH,OAASsB,EAAG,CACV,KAAK,sBAAsBA,EAAGQ,EAAE,qBAAqB,CACvD,CACF,MACF,CACA,OAAO,GAAK,aAAe,KAAK,SAAW,EAC7C,EACC,GAAMpB,IAAM,KAAK,SAAW,KAAK,sBAAsB,CAAC,CAC/D,CACE,CACA,sBAAsB,EAAGA,EAAG,EAAG,CAC7B,GAAI,KAAK,WAAa,KAAM,KAAK,WAAa6C,EAAG,EAAG,CAClD,QAASjC,EAAI,EAAGC,EAAIb,EAAE,OAAQY,EAAIC,EAAGD,IAAK,CACxC,MAAME,EAAId,EAAEY,CAAC,EACbE,GAAKA,EAAE,QAAK,CACd,CACAd,IAAM6C,GAAKC,EAAE,QAAQ9C,CAAC,CACxB,MACE,KAAK,YAAY,CAAC,EAAG8C,EAAE,QAAQ,CAAC,CACpC,CACA,YAAY,EAAG,CACb,QAAS9C,EAAI,EAAG,EAAI,EAAE,OAAQA,EAAI,EAAGA,IACnC,EAAEA,CAAC,GAAG,QAAK,CACf,CACA,UAAW,CACT,MAAM,EAAI,KAAK,OAAQA,EAAIuC,EAAE,QAC7BA,EAAE,QAAU,KACZ,GAAI,CACF,QAAS,EAAI,EAAG3B,EAAI,EAAE,OAAQ,EAAIA,EAAG,IAAK,CACxC,MAAMC,EAAI,EAAE,CAAC,EAAGC,EAAID,EAAE,KACtB,GAAIC,EAAE,MAAQvB,GAAE,YACd,GAAI,CACFuB,EAAE,KACJ,MAAQ,CACN,MAAO,EACT,CACF,GAAIA,EAAE,UAAYD,EAAE,QAAS,MAAO,EACtC,CACA,MAAO,EACT,QAAC,CACC0B,EAAE,QAAUvC,CACd,CACF,CACA,cAAe,CACb,GAAI,KAAK,SAAU,CACjB,GAAI,CACF,KAAK,SAAQ,CACf,OAAS,EAAG,CACV,KAAK,sBAAsB,EAAGoB,EAAE,qBAAqB,CACvD,CACA,KAAK,SAAW,IAClB,CACF,CACA,qBAAsB,CACpB,MAAM,EAAIU,GAAE,EACZ,KAAK,kBAAoB,IAAM,KAAK,gBAAkB,EAAG,KAAK,mBAAqB,GAAI,EAAE,KAAK,mBAAqB,KAAK,wBAA0B,KAAK,wBAAwB,YAAY,EAAGG,GAAE,EAAKxC,EAAE,0BAA4B,KAAK,wBAAwB,QAAQ,EAAG,KAAK,iBAClR,CACA,IAAI,YAAa,CACf,OAAQ,KAAK,MAAQH,EAAE,YAAc,CACvC,CACA,IAAI,gBAAiB,CACnB,OAAO,KAAK,eACd,CACA,IAAI,aAAc,CAChB,OAAQ,KAAK,MAAQA,EAAE,aAAe,CACxC,CACA,wBAAwB,EAAG,CACzB,MAAMU,EAAI,IAAIE,GACZ,2BAA2B,CAAC,sBAAsB,KAAK,kBAAkB,uDAAuDyB,EAAC,EACvI,EACI,MAAM,KAAK,QAAO,EAAI,QAAQ,MAAM3B,CAAC,EAAGA,CAC1C,CACA,sBAAsB,EAAGA,EAAIoB,EAAE,wBAAyB,CACtD,MAAM,EAAIC,GAAE,EAAGnB,GAAGF,CAAC,EACnB,GAAI,QAAQ,MAAM,CAAC,EAAG,KAAK,SACzB,GAAI,CACF,KAAK,SAAS,CAAC,CACjB,OAASY,EAAG,CACV,QAAQ,MAAMS,GAAET,EAAGV,GAAGkB,EAAE,+BAA+B,CAAC,CAC1D,CACJ,CACF,CACA,SAAS+C,EAAG3D,EAAG,EAAI,GAAI,CACrB,GAAI,OAAOA,GAAK,WACd,MAAM,IAAIN,GAAEkB,EAAE,uBAAuB,EACvC,MAAMpB,EAAI,IAAIkE,GAAG1D,EAAG,CAAC,EACrB,OAAOR,EAAE,QAAO,EAAIA,CACtB,CACA,SAASoE,GAAG5D,EAAG,CACb,GAAI,OAAOA,GAAK,WACd,MAAM,IAAI,UAAU,mCAAmC,EACzD2B,GAAE,WAAU,EACZ,GAAI,CACF,OAAO3B,EAAC,CACV,QAAC,CACC2B,GAAE,SAAQ,CACZ,CACF,CCn0BO,SAASkC,GAAWC,EAAwE,CACjG,OAAOC,GAAOD,CAAK,GAAKE,GAAWF,CAAK,CAC1C,CAaO,SAASG,GAAYC,EAA8B,CACxD,GAAI,CAACA,EAAI,MAAO,UAChB,MAAMC,EAAM,WAAYD,EAAMA,EAAc,CAAC,EAAKA,EAClD,GAAI,CAACC,EAAK,MAAO,UAEjB,MAAMC,EAAKD,EAAI,GACf,GAAIC,GAAM,OAAOA,GAAO,SAAU,MAAO,IAAIA,CAAE,GAE/C,MAAMC,EAAUF,EAAI,QAAQ,YAAA,EACtBG,EAAUH,EAAI,UAEpB,GAAIG,GAAWA,EAAQ,OAAS,EAAG,CACjC,IAAIC,EAAMF,EACV,QAASrE,EAAI,EAAGwE,EAAMF,EAAQ,OAAQtE,EAAIwE,EAAKxE,IAAK,CAClD,MAAMyE,EAAMH,EAAQtE,CAAC,EACjByE,IAAKF,GAAO,IAAIE,CAAG,GACzB,CACA,OAAOF,CACT,CACA,OAAOF,CACT,CAOO,SAASK,GAAaC,EAAsB,CACjD,IAAIC,EAAO,OAAOD,GAAQ,EAAE,EAK5BC,EAAOA,EAAK,QAAQ,oCAAqC,EAAE,EAO3DA,EAAOA,EAAK,QAAQ,kBAAmB,EAAE,EAGzC,MAAMC,EACJ,0JACF,IAAIC,EACJ,GACEA,EAAOF,EACPA,EAAOA,EAAK,QAAQC,EAAqB,EAAE,QACpCD,IAASE,GAKlB,MAAMC,EACJ,8EACFH,EAAOA,EAAK,QAAQG,EAAe,uBAAuB,EAI1D,MAAMC,EACJ,yHACF,OAAAJ,EAAOA,EAAK,QAAQI,EAAuB,uBAAuB,EAIlEJ,EAAOA,EAAK,QAAQ,iBAAkB,mBAAmB,EAIzDA,EAAOA,EACJ,QAAQ,qBAAsB,kBAAkB,EAChD,QAAQ,kBAAmB,kBAAkB,EAEzCA,CACT,CAMA,MAAMK,OAAgB,IAAI,CACxB,OACA,MACA,SACA,aACA,aACA,OACA,SACA,SACA,aACA,OACA,WACA,UACA,SACA,UACA,UACF,CAAC,EAEKC,GAAwB,mCAEvB,SAASC,GAAeC,EAAkBtB,EAAwB,CACvE,OAAKmB,GAAU,IAAIG,EAAS,YAAA,CAAa,EAClCF,GAAsB,KAAKpB,CAAK,EADY,EAErD,CAMO,SAASuB,GAAoBvB,EAAwB,CAE1D,OAAKA,EAAM,YAAA,EAAc,SAAS,MAAM,EAId,uDACD,KAAKA,CAAK,EALe,EAMpD,CAMO,SAASwB,GAAatG,EAAY2C,EAAqB,CAC5D,GAAI3C,IAAM2C,EAAG,MAAO,GACpB,GAAI,OAAO3C,GAAM,UAAYA,IAAM,MAAQ,OAAO2C,GAAM,UAAYA,IAAM,KAAM,MAAO,GAEvF,MAAM4D,EAAQ,OAAO,KAAKvG,CAAC,EACrBwG,EAAQ,OAAO,KAAK7D,CAAC,EAC3B,GAAI4D,EAAM,SAAWC,EAAM,OAAQ,MAAO,GAE1C,MAAMC,EAAO9D,EACb,QAAS3B,EAAI,EAAGA,EAAIuF,EAAM,OAAQvF,IAAK,CACrC,MAAM0F,EAAMH,EAAMvF,CAAC,EACnB,GAAKhB,EAA8B0G,CAAG,IAAMD,EAAKC,CAAG,EAAG,MAAO,EAChE,CACA,MAAO,EACT,CAOO,SAASC,GAAOC,EAAwC,CAC7D,MAAMpB,EAAMoB,EAAI,OAChB,GAAIpB,IAAQ,EAAG,OAAO,IAAI,WAAW,CAAC,EAEtC,MAAMqB,EAAe,IAAI,WAAWrB,CAAG,EACjCsB,EAAS,IAAI,WAAWtB,CAAG,EACjC,IAAIuB,EAAY,EAEhB,QAAS/F,EAAI,EAAGA,EAAIwE,EAAKxE,IAAK,CAC5B,MAAMgG,EAAMJ,EAAI5F,CAAC,EACjB,GAAIgG,IAAQ,QAAaA,IAAQ,GAAI,SAErC,MAAMC,EAAUF,EAAY,EAAID,EAAOC,EAAY,CAAC,EAAI,OACxD,GAAIA,IAAc,GAAME,IAAY,SAAcL,EAAIK,CAAO,GAAK,IAAMD,EAAM,CAC5EH,EAAa7F,CAAC,EAAIiG,GAAW,GAC7BH,EAAOC,GAAW,EAAI/F,EACtB,QACF,CAGA,IAAIkG,EAAO,EACPC,EAAQJ,EAAY,EACxB,KAAOG,EAAOC,GAAO,CACnB,MAAMC,EAAOF,EAAOC,IAAW,EACzBE,EAASP,EAAOM,CAAG,EACrBC,IAAW,SAAcT,EAAIS,CAAM,GAAK,IAAML,EAChDE,EAAOE,EAAM,EAEbD,EAAQC,CAEZ,CAEA,MAAME,EAAUR,EAAOI,CAAI,EACvBI,IAAY,QAAaN,GAAOJ,EAAIU,CAAO,GAAK,OAAO,oBACrDJ,EAAO,IACTL,EAAa7F,CAAC,EAAI8F,EAAOI,EAAO,CAAC,GAAK,IAExCJ,EAAOI,CAAI,EAAIlG,EAEnB,CAEA,MAAMuG,EAAM,IAAI,WAAWR,CAAS,EACpC,GAAIA,EAAY,EAAG,CACjB,IAAIS,EAA2BV,EAAOC,EAAY,CAAC,EACnD,QAAS/F,EAAI+F,EAAY,EAAG/F,GAAK,GAAKwG,IAAS,QAAaA,IAAS,GAAIxG,IACvEuG,EAAIvG,CAAC,EAAIwG,EACTA,EAAOX,EAAaW,CAAI,CAE5B,CAEA,OAAOD,CACT,CCvMA,SAASE,IAAgC,CACvC,GAAI,OAAO,OAAW,IAAa,CACjC,MAAMC,EAAQ,OAAiD,eAC/D,GAAI,OAAOA,GAAS,UAAW,OAAOA,CACxC,CAIA,MAAO,EACT,CAEA,IAAIC,EAAeF,GAAA,EAEZ,MAAMG,EAAQ,CACnB,IAAI,SAAU,CACZ,OAAOD,CACT,EACA,IAAI,QAAQ7C,EAAgB,CAC1B6C,EAAe7C,CACjB,EAEA,IAAO+C,KAAiBC,EAAW,CAC7BH,GACF,QAAQ,IAAI,wBAAwBE,CAAI,IAAK,GAAGC,CAAI,CAExD,EAEA,YAAeC,EAA0BC,EAAWC,EAAW,CACzDN,GACF,QAAQ,IACN,8BAA8BI,GAAQ,WAAW,aACjDC,EACA,IACAC,CAAA,CAGN,EAKA,WAAcC,EAAuBL,EAAc/C,EAAU,CACtD6C,IACL,QAAQ,IAAI,qCAAqC1C,GAAYiD,CAAG,CAAC,IAAIL,CAAI,KAAM/C,CAAK,EACpFqD,GAAiBD,CAAG,EACtB,EAEA,QAAQE,EAAkB,CACpBT,GACF,QAAQ,IAAI,iCAAiCS,CAAQ,EAAE,CAE3D,EAEA,QAAWN,EAAW,CAChBH,GACF,QAAQ,KAAK,uBAAwB,GAAGG,CAAI,CAEhD,CACF,EAKMO,GAAkB,uBACxB,IAAIC,GAAgB,GAEpB,SAASC,IAA6B,CACpC,GAAID,GAAe,OACnBA,GAAgB,GAChB,MAAME,EAAQ,SAAS,cAAc,OAAO,EAC5CA,EAAM,YAAc,IAAIH,EAAe,8FACvC,SAAS,KAAK,YAAYG,CAAK,CACjC,CAEA,MAAMC,OAAsB,QAE5B,SAASN,GAAiBD,EAA6B,CACrD,MAAMhD,EAAM,WAAYgD,EAAMA,EAAI,CAAC,EAAIA,EACvC,GAAI,CAAChD,GAAM,CAACA,EAAG,YAAa,OAE5BqD,GAAA,EAGA,MAAMG,EAAWD,GAAgB,IAAIvD,CAAE,EACnCwD,gBAAuBA,CAAQ,EAEnCxD,EAAG,UAAU,IAAImD,EAAe,EAEhCI,GAAgB,IACdvD,EACA,WAAW,IAAM,CACfA,EAAG,UAAU,OAAOmD,EAAe,EACnCI,GAAgB,OAAOvD,CAAE,CAC3B,EAAG,GAAG,CAAA,CAEV,CChGA,SAASyD,GAAQC,EAAiBC,EAAuB,GAAqB,CAC5E,OAAOC,GAAWF,EAAcC,CAAO,CACzC,CAGA,OAAO,eAAeF,GAAM,QAAS,CACnC,KAAM,CACJ,OAAOf,EAAM,OACf,EACA,IAAI9C,EAAgB,CAClB8C,EAAM,QAAU9C,CAClB,CACF,CAAC,EAMD,SAASiE,IAA0B,CACjC,OAAO,IAAI,QAASC,GAAY,WAAWA,EAAS,CAAC,CAAC,CACxD,CAKArF,EAAE,OAAO,CACP,KAAAgF,GAAA,SACAM,GAAA,OACAC,EAAA,MACAC,GAAA,UACAC,GAAA,OACArE,GAAA,WACAC,GACA,WAAAH,GACA,SAAAkE,EACF,CAAC,EChDM,MAAMM,GAAkB,aAElBC,EAAe,CAC1B,MAAO,YACP,KAAM,aACN,KAAM,YACR,EAEaC,GAAiB,CAC5B,KAAM,OACN,aAAc,SACd,UAAW,GACX,gBAAiB,EACnB,EAEaC,GAAiB,CAC5B,MAAO,OAET,EAEaC,GAAkB,CAAC,YAAa,WAAW,EAE3CC,GAAiB,CAC5B,gBAAkB3B,GAAiB,UAAUA,CAAI,+CACjD,mBAAqBK,GAAqB,aAAaA,CAAQ,cAC/D,iBAAmBA,GAAqB,mBAAmBA,CAAQ,cACnE,cAAgBuB,GAAgB,4BAA4BA,CAAG,GAC/D,eAAgB,kDAChB,wBAA0BC,GAAiB,+BAA+BA,CAAI,cAC9E,sBAAwB7B,GACtB,sDAAsDA,CAAI,KAC5D,iBAAmBA,GAAiB,kCAAkCA,CAAI,eAC1E,uBAAyBA,GACvB,uCAAuCA,CAAI,0CAC7C,sBAAwB1C,GAAoB,0CAA0CA,CAAO,KAC7F,cAAe,CAACqB,EAAsBmD,IACpC,kBAAkBnD,CAAG,cAAcmD,CAAK,GAC5C,ECjCMC,GAAYT,GAelB,MAAMU,EAAgB,CAAtB,aAAA,CACE,KAAQ,YAAc,QACtB,KAAQ,kBAAoB,QAC5B,KAAQ,mBAAqB,QAC7B,KAAQ,iBAAmB,OAAc,CAEzC,KAAKC,EAAkB,CACrB,KAAK,eAAe,IAAIA,CAAI,CAC9B,CAEA,OAAOA,EAAqB,CAC1B,OAAO,KAAK,eAAe,IAAIA,CAAI,CACrC,CAEA,YAAYA,EAAkB,CAC5B,KAAK,aAAa,IAAIA,CAAI,CAC5B,CAEA,UAAUA,EAAqB,CAC7B,OAAO,KAAK,aAAa,IAAIA,CAAI,CACnC,CAEQ,mBAAmB9E,EAA4B,CACrD,IAAIK,EAAM,KAAK,QAAQ,IAAIL,CAAE,EAC7B,OAAKK,IACHA,EAAM,CAAA,EACN,KAAK,QAAQ,IAAIL,EAAIK,CAAG,EAEnB,KAAK,cAAc,IAAIL,CAAE,IAC5B,KAAK,cAAc,IAAIA,CAAE,EACzBA,EAAG,UAAU,IAAI4E,EAAS,IAGvBvE,CACT,CAEA,YAAYL,EAAa+E,EAAwB,CAC/C,MAAMC,EAAS,KAAK,mBAAmBhF,CAAE,EACzCgF,EAAO,UAAY,CAAA,EACnBA,EAAO,QAAQ,KAAKD,CAAE,CACxB,CAEA,aAAa/E,EAAaiF,EAAsB,CAC9C,MAAMD,EAAS,KAAK,mBAAmBhF,CAAE,EACzCgF,EAAO,WAAa,CAAA,EACpBA,EAAO,SAAS,KAAKC,CAAE,CACzB,CAEA,QAAQjF,EAAsB,CAC5B,OAAO,KAAK,cAAc,IAAIA,CAAE,CAClC,CAEA,QAAQA,EAAmB,CAEzB,GAAI,CAAC,KAAK,cAAc,OAAOA,CAAE,EAAG,OAEpC,MAAMgF,EAAS,KAAK,QAAQ,IAAIhF,CAAE,EAClC,GAAI,CAACgF,EAAQ,OAGb,KAAK,QAAQ,OAAOhF,CAAE,EACtB,KAAK,eAAe,OAAOA,CAAE,EAC7B,KAAK,aAAa,OAAOA,CAAE,EAC3BA,EAAG,UAAU,OAAO4E,EAAS,EAGzBlC,EAAM,SACRA,EAAM,QAAQ3C,GAAYC,CAAE,CAAC,EAI/B,MAAMkF,EAAUF,EAAO,QACvB,GAAIE,EACF,QAASpJ,EAAI,EAAGwE,EAAM4E,EAAQ,OAAQpJ,EAAIwE,EAAKxE,IAC7C,GAAI,CACFoJ,EAAQpJ,CAAC,GAAG,QAAA,CACd,OAASR,EAAG,CACVoH,EAAM,KAAK,wBAAyBpH,CAAC,CACvC,CAKJ,MAAM6J,EAAWH,EAAO,SACxB,GAAIG,EACF,QAASrJ,EAAI,EAAGwE,EAAM6E,EAAS,OAAQrJ,EAAIwE,EAAKxE,IAC9C,GAAI,CACFqJ,EAASrJ,CAAC,IAAA,CACZ,OAASR,EAAG,CACVoH,EAAM,KAAK,iBAAkBpH,CAAC,CAChC,CAGN,CAEA,mBAAmB0E,EAAmB,CACpC,MAAMoF,EAAWpF,EAAG,iBAAiB,IAAI4E,EAAS,EAAE,EACpD,QAAS9I,EAAI,EAAGwE,EAAM8E,EAAS,OAAQtJ,EAAIwE,EAAKxE,IAAK,CACnD,MAAMuJ,EAAQD,EAAStJ,CAAC,EAEpBuJ,GAAS,KAAK,cAAc,IAAIA,CAAK,EACvC,KAAK,QAAQA,CAAK,EACTA,GACTA,EAAM,UAAU,OAAOT,EAAS,CAEpC,CACF,CAEA,YAAY5E,EAAmB,CAC7B,KAAK,mBAAmBA,CAAE,EAC1B,KAAK,QAAQA,CAAE,CACjB,CACF,CAEO,MAAMsF,EAAW,IAAIT,GAE5B,IAAIU,GAAoC,KAEjC,SAASC,GAAkBC,EAAgB,SAAS,KAAY,CACjEF,KAEJA,GAAW,IAAI,iBAAkBG,GAAc,CAC7C,QAAS5J,EAAI,EAAGwE,EAAMoF,EAAU,OAAQ5J,EAAIwE,EAAKxE,IAAK,CACpD,MAAM6J,EAAeD,EAAU5J,CAAC,GAAG,aACnC,GAAI,CAAC6J,EAAc,SACnB,MAAMC,EAAOD,EAAa,OAC1B,GAAIC,IAAS,EAEb,QAAS7H,EAAI,EAAGA,EAAI6H,EAAM7H,IAAK,CAC7B,MAAM+G,EAAOa,EAAa5H,CAAC,EAEvB+G,EAAK,WAAa,IAGlBA,EAAK,aAAeQ,EAAS,OAAOR,CAAI,GAAKQ,EAAS,UAAUR,CAAI,GAIxEQ,EAAS,YAAYR,CAAe,EACtC,CACF,CACF,CAAC,EAEDS,GAAS,QAAQE,EAAM,CAAE,UAAW,GAAM,QAAS,GAAM,EAC3D,CAEO,SAASI,IAA2B,CACzCN,IAAU,WAAA,EACVA,GAAW,IACb,CC5JO,SAASO,EACd9F,EACA+F,EACAC,EACAC,EACM,CACFtG,GAAWoG,CAAM,EACnBT,EAAS,YACPtF,EACAgE,EAAO,IAAM,CACX,MAAMpE,EAAQmG,EAAO,MACrBC,EAAQpG,CAAK,EACb8C,EAAM,WAAWjE,EAAEuB,CAAE,EAAGiG,EAAWrG,CAAK,CAC1C,CAAC,CAAA,GAGHoG,EAAQD,CAAM,EACVrD,EAAM,SAASA,EAAM,WAAWjE,EAAEuB,CAAE,EAAGiG,EAAWF,CAAM,EAEhE,CCmEO,IAAKG,GAAAA,IACVA,EAAAA,EAAA,KAAO,CAAA,EAAP,OACAA,EAAAA,EAAA,QAAU,CAAA,EAAV,UACAA,EAAAA,EAAA,UAAY,CAAA,EAAZ,YACAA,EAAAA,EAAA,cAAgB,CAAA,EAAhB,gBACAA,EAAAA,EAAA,aAAe,CAAA,EAAf,eAEAA,EAAAA,EAAA,KAAO,EAAA,EAAP,OAPUA,IAAAA,GAAA,CAAA,CAAA,EAyBL,SAASC,IAA6C,CAC3D,MAAO,CAAE,UAAW,KAAM,MAAO,CAAA,CACnC,CCnHO,SAASC,GACdpD,EACAS,EACAE,EAAyB,CAAA,EACoB,CAC7C,KAAM,CACJ,SAAU0C,EACV,MAAAC,EAAQhC,GAAe,MACvB,MAAAiC,EAAS9J,GAAcA,EACvB,OAAA+J,EAAU/J,GAAS,OAAOA,GAAK,EAAE,EACjC,MAAAgK,EAAQ,OAAO,EAAA,EACb9C,EAEE+C,EAA2BP,GAAA,EAC3BnG,EAAKgD,EAAI,CAAC,EAGV2D,EAAkB,IAAM,CAC5B,GAAI,EAAAD,EAAM,MAAQR,EAAa,MAE/B,CAAAQ,EAAM,OAASR,EAAa,cAC5B,GAAI,CACF,MAAMU,EAAa5G,EAAG,MAChB6G,EAASN,EAAMK,CAAU,EAE1BH,EAAMhD,EAAK,MAAOoD,CAAM,IAC3BpD,EAAK,MAAQoD,EAEjB,QAAA,CACEH,EAAM,OAAS,CAACR,EAAa,aAC/B,EACF,EAEMY,EAAS,IAAM,CAEfJ,EAAM,YACR,aAAaA,EAAM,SAAS,EAC5BA,EAAM,UAAY,KAClBC,EAAA,GAGFD,EAAM,OAAS,CAACR,EAAa,QAG7B,MAAMa,EAAYP,EAAO/C,EAAK,KAAK,EAC/BzD,EAAG,QAAU+G,IACf/G,EAAG,MAAQ+G,EAEf,EAGMC,EAAU,IAAM,CAChBN,EAAM,MAAQR,EAAa,OAE3BG,GACEK,EAAM,WAAW,aAAaA,EAAM,SAAS,EACjDA,EAAM,UAAY,WAAWC,EAAiBN,CAAU,GAExDM,EAAA,EAEJ,EAEMM,EAAW,CACf,iBAAkB,IAAM,CACtBP,EAAM,OAASR,EAAa,SAC9B,EACA,eAAgB,IAAM,CACpBQ,EAAM,OAAS,CAACR,EAAa,UAC7BS,EAAA,CACF,EACA,MAAO,IAAM,CACXD,EAAM,OAASR,EAAa,OAC9B,EACA,KAAMY,EACN,CAACR,CAAK,EAAGU,EACT,OAAQA,CAAA,EAGV,OAAAhE,EAAI,GAAGiE,CAAQ,EAuCR,CAAE,OA/BM,IAAM,CACnB,MAAMnF,EAAM2B,EAAK,MACXsD,EAAYP,EAAO1E,CAAG,EACtBoF,EAAalH,EAAG,MAGtB,GAAIkH,IAAeH,GAGf,EAAAL,EAAM,MAAQR,EAAa,SAAWO,EAAMF,EAAMW,CAAU,EAAGpF,CAAG,GAItE,CAAA4E,EAAM,OAASR,EAAa,aAC5B,GAAI,CACF,GAAIQ,EAAM,MAAQR,EAAa,QAAS,CAEtC,KAAM,CAAE,eAAgBiB,GAAO,aAAcC,IAAQpH,EACrDA,EAAG,MAAQ+G,EACX,MAAMzG,EAAMyG,EAAU,OACtB/G,EAAG,kBAAkB,KAAK,IAAImH,IAAS,EAAG7G,CAAG,EAAG,KAAK,IAAI8G,IAAO,EAAG9G,CAAG,CAAC,CACzE,MACEN,EAAG,MAAQ+G,EAGbrE,EAAM,WAAWM,EAAK,MAAO+D,CAAS,CACxC,QAAA,CACEL,EAAM,OAAS,CAACR,EAAa,YAC/B,EACF,EAEiB,QArCD,IAAM,CACpBlD,EAAI,IAAIiE,CAAQ,EACZP,EAAM,WAAW,aAAaA,EAAM,SAAS,CACnD,CAkCiB,CACnB,CCjHA,MAAMW,GAAqC,OAAO,OAAO,IAAI,EAC7D,SAASC,GAAa5C,EAAsB,CAC1C,IAAI6C,EAASF,GAAW3C,CAAI,EAC5B,OAAI6C,IAEJA,EAAS7C,EAAK,SAAS,GAAG,EAAIA,EAAK,QAAQ,MAAQjJ,GAAMA,EAAE,CAAC,EAAG,YAAA,CAAa,EAAIiJ,EAChF2C,GAAW3C,CAAI,EAAI6C,EACZA,EACT,CAMO,SAASC,EAAcxH,EAAiC,CAC7D,IAAIyH,EAAsB,KAC1B,MAAO,CACL,IAAI,KAAM,CACR,OAAKA,IAAMA,EAAOhJ,EAAEuB,CAAE,GACfyH,CACT,EACA,GAAAzH,EACA,aAAeiF,GAAOK,EAAS,aAAatF,EAAIiF,CAAE,CAAA,CAEtD,CAMO,SAASyC,GAAYC,EAAqB/H,EAA+B,CAC9E,MAAMI,EAAK2H,EAAI,GACf7B,EACE9F,EACAJ,EACCkC,GAAQ,CACP,MAAMiB,EAAS,OAAOjB,GAAQ,SAAWA,EAAM,OAAOA,GAAO,EAAE,EAE3D9B,EAAG,cAAgB+C,IACrB/C,EAAG,YAAc+C,EAErB,EACA,MAAA,CAEJ,CAEO,SAAS6E,GAASD,EAAqB/H,EAAoC,CAChF,MAAMI,EAAK2H,EAAI,GACf7B,EACE9F,EACAJ,EACCkC,GAAQ,CACP,MAAMiB,EAAS,OAAOjB,GAAO,EAAE,EACzB+F,EAAYrH,GAAauC,CAAM,EAEjC8E,IAAc9E,GAChB,QAAQ,KAAK,GAAGqB,EAAa,IAAI,IAAII,GAAe,cAAc,EAAE,EAIlExE,EAAG,YAAc6H,IACnB7H,EAAG,UAAY6H,EAEnB,EACA,MAAA,CAEJ,CAEO,SAASC,GACdH,EACAI,EACM,CACN,UAAWC,KAAaD,EACtBjC,EACE6B,EAAI,GACJI,EAASC,CAAS,EACjBlG,GAAQ,CACP6F,EAAI,GAAG,UAAU,OAAOK,EAAW,CAAC,CAAClG,CAAG,CAC1C,EACA,SAASkG,CAAS,EAAA,CAGxB,CAEO,SAASC,GAAQN,EAAqBO,EAAwC,CACnF,MAAMlI,EAAK2H,EAAI,GACTrE,EAAQtD,EAAG,MACjB,UAAW0E,KAAQwD,EAAQ,CACzB,MAAMpG,EAAMoG,EAAOxD,CAAI,EACvB,GAAI5C,IAAQ,OAAW,SAEvB,MAAMqG,EAAQb,GAAa5C,CAAI,EACzB0D,EAAQ,MAAM,QAAQtG,CAAG,EACzBiE,EAASqC,EAAQtG,EAAI,CAAC,EAAIA,EAC1BuG,EAAOD,EAAQtG,EAAI,CAAC,EAAI,GAE9BgE,EACE9F,EACA+F,EACCtJ,GAAM,CACL,MAAM6L,EAASD,EAAO,GAAG5L,CAAC,GAAG4L,CAAI,GAAK,OAAO5L,CAAC,EAC9C,GAAI0E,GAAoBmH,CAAM,EAAG,CAC/B,QAAQ,KAAK,GAAGlE,EAAa,IAAI,IAAII,GAAe,wBAAwBE,CAAI,CAAC,EAAE,EACnF,MACF,CACApB,EAAM6E,CAAK,EAAIG,CACjB,EACA,OAAO5D,CAAI,EAAA,CAEf,CACF,CAEO,SAAS6D,GACdZ,EACAa,EACM,CACN,MAAMxI,EAAK2H,EAAI,GACf,UAAW9E,KAAQ2F,EAAS,CAE1B,MAAMC,EAAK5F,EAAK,WAAW,CAAC,EAC5B,IAAK4F,IAAO,KAAOA,IAAO,MAAQ5F,EAAK,WAAW,CAAC,IAAM,KAAOA,EAAK,WAAW,CAAC,IAAM,IAAK,CAC1F,QAAQ,KAAK,GAAGuB,EAAa,IAAI,IAAII,GAAe,sBAAsB3B,CAAI,CAAC,EAAE,EACjF,QACF,CAEAiD,EACE9F,EACAwI,EAAQ3F,CAAI,EACXpG,GAAM,CACL,GAAIA,GAAM,MAA2BA,IAAM,GAAO,CAChDuD,EAAG,gBAAgB6C,CAAI,EACvB,MACF,CACA,MAAME,EAAStG,IAAM,GAAOoG,EAAO,OAAOpG,CAAC,EAC3C,GAAIwE,GAAe4B,EAAME,CAAM,EAAG,CAChC,QAAQ,KAAK,GAAGqB,EAAa,IAAI,IAAII,GAAe,iBAAiB3B,CAAI,CAAC,EAAE,EAC5E,MACF,CAEI7C,EAAG,aAAa6C,CAAI,IAAME,GAC5B/C,EAAG,aAAa6C,EAAME,CAAM,CAEhC,EACA,QAAQF,CAAI,EAAA,CAEhB,CACF,CAEO,SAAS6F,GACdf,EACAgB,EACM,CACN,MAAM3I,EAAK2H,EAAI,GACf,UAAW9E,KAAQ8F,EAAS,CAE1B,GAAIpE,GAAgB,SAAS1B,CAAwC,EAAG,CACtE,QAAQ,KAAK,GAAGuB,EAAa,IAAI,IAAII,GAAe,uBAAuB3B,CAAI,CAAC,EAAE,EAClF,QACF,CAEAiD,EACE6B,EAAI,GACJgB,EAAQ9F,CAAI,EACXf,GAAQ,CAEH9B,EAAG6C,CAAI,IAAMf,IACf9B,EAAG6C,CAAI,EAAIf,EAEf,EACA,QAAQe,CAAI,EAAA,CAEhB,CACF,CAEO,SAAS+F,GACdjB,EACAkB,EACAC,EACAC,EACM,CACN,MAAM/I,EAAK2H,EAAI,GACf7B,EACE9F,EACA6I,EACC/G,GAAQ,CACP,MAAMkH,EAAUF,EAAS,CAAChH,EAAM,CAAC,CAACA,EAClC9B,EAAG,MAAM,QAAUgJ,EAAU,GAAK,OAC9BtG,EAAM,SAASA,EAAM,WAAW1C,EAAI+I,EAAOjH,CAAG,CACpD,EACAiH,CAAA,CAEJ,CAMO,SAASE,GACdtB,EACAuB,EACM,CACN,MAAM/I,EAAUwH,EAAI,GAAG,QAAQ,YAAA,EAC/B,GAAIxH,IAAY,SAAWA,IAAY,UAAYA,IAAY,WAAY,CACzE,QAAQ,KAAK,qDAAqDA,CAAO,IAAI,EAC7E,MACF,CACA,MAAMiI,EAAQ,MAAM,QAAQc,CAAG,EACzB,CAAE,OAAQC,EAAM,QAAAC,CAAA,EAAYhD,GAChCuB,EAAI,IACJS,EAAQc,EAAI,CAAC,EAAIA,EACjBd,EAAQc,EAAI,CAAC,EAAI,CAAA,CAAC,EAGpB5D,EAAS,YAAYqC,EAAI,GAAI3D,EAAOmF,CAAI,CAAC,EACzCxB,EAAI,aAAayB,CAAO,CAC1B,CAEO,SAASC,GAAY1B,EAAqBlE,EAAmC,CAClF,MAAMzD,EAAK2H,EAAI,GACT3E,EAAM2E,EAAI,IACVjB,EAAQP,GAAA,EAGRmD,EAAU,IAAM,CACpB,GAAI5C,EAAM,MAAQR,EAAa,KAAM,OACrC,MAAMqD,EAAUvJ,EAAG,QACfyD,EAAK,QAAU8F,IACjB9F,EAAK,MAAQ8F,EAEjB,EAEAvG,EAAI,GAAG,SAAUsG,CAAO,EACxB3B,EAAI,aAAa,IAAM3E,EAAI,IAAI,SAAUsG,CAAO,CAAC,EAGjD,MAAMvE,EAAKf,EAAO,IAAM,CACtB0C,EAAM,OAASR,EAAa,aAC5B,MAAMpE,EAAM,CAAC,CAAC2B,EAAK,MACfzD,EAAG,UAAY8B,IACjB9B,EAAG,QAAU8B,EACTY,EAAM,SAASA,EAAM,WAAWM,EAAK,UAAWlB,CAAG,GAEzD4E,EAAM,OAAS,CAACR,EAAa,YAC/B,CAAC,EACDZ,EAAS,YAAYtF,EAAI+E,CAAE,CAC7B,CAeO,SAASyE,GAAW7B,EAAqB8B,EAAiC,CAC/E,UAAW5G,KAAQ4G,EAAU,CAC3B,MAAMH,EAAUG,EAAS5G,CAAI,EAC7B,GAAI,OAAOyG,GAAY,WAAY,SACnC,MAAMI,EAAYpO,GAAa,CAC7B2I,GAAM,IACHqF,EAAwD,KACvD3B,EAAI,GACJlJ,EAAE,MAAMnD,EAAE,KAAM,CAAE,cAAeA,EAAG,CAAA,CACtC,CAEJ,EACAqM,EAAI,GAAG,iBAAiB9E,EAAM6G,CAAQ,EACtC/B,EAAI,aAAa,IAAMA,EAAI,GAAG,oBAAoB9E,EAAM6G,CAAQ,CAAC,CACnE,CACF,CAYAjL,EAAE,GAAG,SAAW,SACdkF,EACQ,CACR,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAMgE,EAAMH,EAAc,IAAI,EAG1B7D,EAAQ,OAAS,QAAW+D,GAASC,EAAKhE,EAAQ,IAAI,EACtDA,EAAQ,OAAS,QAAWiE,GAASD,EAAKhE,EAAQ,IAAI,EACtDA,EAAQ,OAAOmE,GAAUH,EAAKhE,EAAQ,KAAK,EAC3CA,EAAQ,KAAKsE,GAAQN,EAAKhE,EAAQ,GAAG,EACrCA,EAAQ,MAAM4E,GAASZ,EAAKhE,EAAQ,IAAI,EACxCA,EAAQ,MAAM+E,GAASf,EAAKhE,EAAQ,IAAI,EACxCA,EAAQ,OAAS,QAAWiF,GAAejB,EAAKhE,EAAQ,KAAM,GAAO,MAAM,EAC3EA,EAAQ,OAAS,QAAWiF,GAAejB,EAAKhE,EAAQ,KAAM,GAAM,MAAM,EAC1EA,EAAQ,MAAQ,QAAWsF,GAAQtB,EAAKhE,EAAQ,GAAG,EACnDA,EAAQ,UAAY,QAAW0F,GAAY1B,EAAKhE,EAAQ,OAAO,EAC/DA,EAAQ,IAAI6F,GAAW7B,EAAKhE,EAAQ,EAAE,CAC5C,CAAC,CACH,ECjTAlF,EAAE,GAAG,SAAW,SAAasH,EAA0B4D,EAAsC,CAC3F,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAM3G,EAAMvE,EAAE,IAAI,EAKlBqH,EAAuB,KAAMC,EAJd4D,EACV7H,GAAWkB,EAAI,KAAK2G,EAAU7H,CAAG,CAAC,EAClCA,GAAWkB,EAAI,KAAK,OAAOlB,GAAO,EAAE,CAAC,EAEG,MAAM,CACrD,CAAC,CACH,EAKArD,EAAE,GAAG,SAAW,SAAUsH,EAAuC,CAC/D,OAAO,KAAK,KAAK,UAAY,CAC3B6B,GAASJ,EAAc,IAAI,EAAGzB,CAAM,CACtC,CAAC,CACH,EAKAtH,EAAE,GAAG,UAAY,SAAUuJ,EAAmBa,EAA2C,CACvF,OAAO,KAAK,KAAK,UAAY,CAC3Bf,GAAUN,EAAc,IAAI,EAAG,CAAE,CAACQ,CAAS,EAAGa,EAAW,CAC3D,CAAC,CACH,EAKApK,EAAE,GAAG,QAAU,SACbiG,EACAqB,EACAsC,EACQ,CACR,OAAO,KAAK,KAAK,UAAY,CAC3BJ,GAAQT,EAAc,IAAI,EAAG,CAAE,CAAC9C,CAAI,EAAG2D,EAAO,CAACtC,EAAQsC,CAAI,EAAItC,EAAQ,CACzE,CAAC,CACH,EAKAtH,EAAE,GAAG,SAAW,SAAUoE,EAAckD,EAAwD,CAC9F,OAAO,KAAK,KAAK,UAAY,CAC3BwC,GAASf,EAAc,IAAI,EAAG,CAAE,CAAC3E,CAAI,EAAGkD,EAAQ,CAClD,CAAC,CACH,EAKAtH,EAAE,GAAG,SAAW,SACdoE,EACAkD,EACQ,CACR,OAAO,KAAK,KAAK,UAAY,CAC3B2C,GAASlB,EAAc,IAAI,EAAG,CAAE,CAAC3E,CAAI,EAAGkD,EAAQ,CAClD,CAAC,CACH,EAKAtH,EAAE,GAAG,SAAW,SAAUoK,EAA2C,CACnE,OAAO,KAAK,KAAK,UAAY,CAC3BD,GAAepB,EAAc,IAAI,EAAGqB,EAAW,GAAO,MAAM,CAC9D,CAAC,CACH,EAKApK,EAAE,GAAG,SAAW,SAAUoK,EAA2C,CACnE,OAAO,KAAK,KAAK,UAAY,CAC3BD,GAAepB,EAAc,IAAI,EAAGqB,EAAW,GAAM,MAAM,CAC7D,CAAC,CACH,EAKApK,EAAE,GAAG,QAAU,SAAagF,EAAuBE,EAAyB,CAAA,EAAY,CACtF,OAAO,KAAK,KAAK,UAAY,CAC3BsF,GACEzB,EAAc,IAAI,EAClB7D,GAAW,OAAO,KAAKA,CAAO,EAAE,OAAS,EAAI,CAACF,EAAME,CAAO,EAAIF,CAAA,CAEnE,CAAC,CACH,EAMAhF,EAAE,GAAG,YAAc,SAAUgF,EAAqC,CAChE,OAAO,KAAK,KAAK,UAAY,CAC3B4F,GAAY7B,EAAc,IAAI,EAAG/D,CAAI,CACvC,CAAC,CACH,EAKAhF,EAAE,GAAG,OAAS,SAAU6H,EAAegD,EAA4C,CACjF,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAMtG,EAAMvE,EAAE,IAAI,EAClBuE,EAAI,GAAGsD,EAAOgD,CAAO,EACrBhE,EAAS,aAAa,KAAM,IAAMtC,EAAI,IAAIsD,EAAOgD,CAAO,CAAC,CAC3D,CAAC,CACH,EAKA7K,EAAE,GAAG,WAAa,UAAoB,CACpC,OAAO,KAAK,KAAK,UAAY,CAC3B6G,EAAS,YAAY,IAAI,CAC3B,CAAC,CACH,ECjIA7G,EAAE,GAAG,SAAW,SAAasH,EAA2BpC,EAAiC,CACvF,KAAM,CAAE,IAAAnC,EAAK,OAAAoI,EAAQ,KAAAC,EAAM,OAAAC,EAAQ,MAAAC,EAAO,SAAAC,EAAU,MAAAC,GAAUtG,EAGxDuG,EACJ,OAAO1I,GAAQ,WACXA,EACA,CAAC2I,EAASC,IAAmBD,EAAK3I,CAAc,EAEtD,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAM6I,EAAa5L,EAAE,IAAI,EACnB6L,EAAoBvK,GAAY,IAAI,EAEpCwK,MAAc,IACdC,MAAmB,IACzB,IAAIC,EAA+B,CAAA,EAC/BC,EAA0B,KAE9B,MAAM3F,EAAKf,EAAO,IAAM,CACtB,MAAM2G,EAAQ5E,EAAO,MACf6E,EAAYD,EAAM,OAGxB,GAAIC,IAAc,GAChB,GAAIX,GAAS,CAACS,EAAU,CAEtB,MAAMG,EAAY,OAAOZ,GAAU,SAAWzJ,GAAayJ,CAAK,EAAIA,EACpES,EAAYjM,EAAEoM,CAAmB,EAAa,SAASR,CAAU,CACnE,OACSK,IACTA,EAAS,OAAA,EACTA,EAAW,MAIb,GAAIE,IAAc,GAAKL,EAAQ,OAAS,EAAG,CACzCE,EAAU,CAAA,EACV,MACF,CAEA/H,EAAM,IAAI,OAAQ,GAAG4H,CAAiB,kBAAkBM,CAAS,QAAQ,EAGzE,MAAME,OAAkB,IAClBC,GAASN,EAAQ,OACvB,QAAS3O,EAAI,EAAGA,EAAIiP,GAAQjP,IAC1BgP,GAAY,IAAIL,EAAQ3O,CAAC,EAAIA,CAAC,EAIhC,MAAMkP,EAA+B,IAAI,MAAMJ,CAAS,EAClDK,OAAgB,IAChBC,GAAa,IAAI,WAAWN,CAAS,EAE3C,QAAS9O,EAAI,EAAGA,EAAI8O,EAAW9O,IAAK,CAClC,MAAMqO,EAAOQ,EAAM7O,CAAC,EACdoB,EAAIgN,EAAOC,EAAMrO,CAAC,EAEpBmP,GAAU,IAAI/N,CAAC,GACjB,QAAQ,KAAK,GAAGkH,EAAa,IAAI,IAAII,GAAe,cAActH,EAAGpB,CAAC,CAAC,EAAE,EAG3EkP,EAAQlP,CAAC,EAAIoB,EACb+N,GAAU,IAAI/N,CAAC,EACfgO,GAAWpP,CAAC,EAAIgP,GAAY,IAAI5N,CAAC,GAAK,EACxC,CAGA,GAAIqN,EAAQ,KAAO,EACjB,SAAW,CAACrN,EAAGiO,CAAK,IAAKZ,EAAS,CAChC,GAAIU,GAAU,IAAI/N,CAAC,GAAKsN,EAAa,IAAItN,CAAC,EAAG,SAE7C,MAAMkO,EAAc,IAAM,CACxBD,EAAM,IAAI,OAAA,EACNA,EAAM,IAAI,CAAC,KAAY,QAAQA,EAAM,IAAI,CAAC,CAAC,EAC/CX,EAAa,OAAOtN,CAAC,EACrBwF,EAAM,IAAI,OAAQ,GAAG4H,CAAiB,iBAAkBpN,CAAC,CAC3D,EAKA,GAHAqN,EAAQ,OAAOrN,CAAC,EAChBsN,EAAa,IAAItN,CAAC,EAEd8M,EAAU,CACZ,MAAMpI,EAASoI,EAASmB,EAAM,GAAG,EAC7BvJ,aAAkB,QAASA,EAAO,KAAKwJ,CAAW,EACjDA,EAAA,CACP,MACEA,EAAA,CAEJ,CAIF,GAAIR,IAAc,EAAG,CACnBH,EAAU,CAAA,EACV,MACF,CAGA,MAAMY,GAAS5J,GAAOyJ,EAAU,EAChC,IAAII,EAASD,GAAO,OAAS,EAGzBE,EAAwB,KAC5B,QAASzP,EAAI8O,EAAY,EAAG9O,GAAK,EAAGA,IAAK,CACvC,MAAMoB,EAAI8N,EAAQlP,CAAC,EACbqO,EAAOQ,EAAM7O,CAAC,EACdqP,EAAQZ,EAAQ,IAAIrN,CAAC,EAE3B,GAAIiO,EAAO,CAET,MAAMK,EAAUL,EAAM,KACtBA,EAAM,KAAOhB,EACb,MAAMnK,GAAKmL,EAAM,IAAI,CAAC,EACtB,GAAI,CAACnL,GAAI,SAET,GAAI8J,EACFA,EAAOqB,EAAM,IAAKhB,EAAMrO,CAAC,EACzB4G,EAAM,WAAWyI,EAAM,IAAK,cAAehB,CAAI,UACtCqB,IAAYrB,GAAQ,CAAC/I,GAAaoK,EAASrB,CAAI,EACxD,CACE,MAAMsB,EAAY7B,EAAOO,EAAMrO,CAAC,EAC1B4P,EACJ,OAAOD,GAAc,SAAWjL,GAAaiL,CAAS,EAAIA,EACtDE,EAASlN,EAAEiN,CAAoB,EAC/BE,EAAsBL,IAAavL,GACzCmL,EAAM,IAAI,YAAYQ,CAAM,EAC5BR,EAAM,IAAMQ,EACR9B,GAAMA,EAAK8B,EAAQxB,EAAMrO,CAAC,EAC9B4G,EAAM,WAAWiJ,EAAQ,cAAexB,CAAI,EACxCyB,IAAqBL,EAAWI,EAAO,CAAC,GAAK,KACnD,CAIF,GAAIL,GAAU,GAAKD,GAAOC,CAAM,IAAMxP,EACpCwP,QACK,CACL,MAAMO,EAAYV,EAAM,IAAI,CAAC,EACzBI,GAAU,YACRA,IAAaM,GAAWV,EAAM,IAAI,aAAaI,CAAQ,EAE3DJ,EAAM,IAAI,SAASd,CAAU,CAEjC,CACAkB,EAAWJ,EAAM,IAAI,CAAC,GAAK,IAC7B,KAAO,CAEL,MAAMW,EAAWlC,EAAOO,EAAMrO,CAAC,EACzBiQ,GAAe,OAAOD,GAAa,SAAWtL,GAAasL,CAAQ,EAAIA,EACvE9I,EAAMvE,EAAEsN,EAAsB,EACpCxB,EAAQ,IAAIrN,EAAG,CAAE,IAAA8F,EAAK,KAAAmH,EAAM,EAExBoB,GAAU,YAAavI,EAAI,aAAauI,CAAQ,EAC/CvI,EAAI,SAASqH,CAAU,EAExBR,GAAMA,EAAK7G,EAAKmH,EAAMrO,CAAC,EACvBiO,KAAa/G,CAAG,EAEpBN,EAAM,WAAWM,EAAK,WAAYmH,CAAI,EACtCoB,EAAWvI,EAAI,CAAC,GAAK,IACvB,CACF,CAEAyH,EAAUO,CACZ,CAAC,EAED1F,EAAS,YAAY,KAAMP,CAAE,EAC7BO,EAAS,aAAa,KAAM,IAAM,CAChCiF,EAAQ,MAAA,EACRC,EAAa,MAAA,EACbC,EAAU,CAAA,EACVC,GAAU,OAAA,CACZ,CAAC,CACH,CAAC,CACH,ECrLA,MAAMsB,OAAwB,QAM9BvN,EAAE,GAAG,UAAY,SAAawN,EAA2BC,EAAW,CAAA,EAAiB,CACnF,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAMhJ,EAAWnD,GAAY,IAAI,EAG3BoM,EAAkBH,GAAkB,IAAI,IAAI,EAC9CG,IACFzJ,EAAM,IAAI,QAAS,GAAGQ,CAAQ,gCAAgC,EAC9DiJ,EAAA,GAGFzJ,EAAM,IAAI,QAAS,GAAGQ,CAAQ,qBAAqB,EAGnD,IAAIkJ,EACJ,GAAI,CACFA,EAAcH,EAAUxN,EAAE,IAAI,EAAGyN,CAAK,CACxC,OAAS5Q,EAAG,CACV,QAAQ,MAAM,oCAAqCA,CAAC,EACpD,MACF,CAGA,MAAM+Q,EAAc,IAAM,CAExB,GAAKL,GAAkB,OAAO,IAAI,EAIlC,IAFAtJ,EAAM,IAAI,QAAS,GAAGQ,CAAQ,eAAe,EAEzC,OAAOkJ,GAAgB,WACzB,GAAI,CACFA,EAAA,CACF,OAAS9Q,EAAG,CACV,QAAQ,MAAM,sCAAuCA,CAAC,CACxD,CAEFgK,EAAS,YAAY,IAAI,EAC3B,EAEA0G,GAAkB,IAAI,KAAMK,CAAW,EACvC/G,EAAS,aAAa,KAAM+G,CAAW,CACzC,CAAC,CACH,EAKA5N,EAAE,GAAG,YAAc,UAAoB,CACrC,OAAO,KAAK,KAAK,UAAY,CAC3B,MAAM6N,EAAUN,GAAkB,IAAI,IAAI,EACtCM,GAASA,EAAA,CACf,CAAC,CACH,ECvDA,MAAMC,GAAanI,EAAa,MA0BzB,SAASoI,GAAMC,EAA6B,CAEjD,KAAM,CACJ,OAAAC,EACA,QAASC,EACT,OAAAC,EACA,SAAAC,EACA,KAAAC,EAAOzI,GAAe,KACtB,SAAA0I,EAAW1I,GAAe,UAC1B,cAAA2I,EAAgB3I,GAAe,gBAC/B,YAAA4I,EAAc5I,GAAe,aAC7B,iBAAA6I,EACA,gBAAAC,CAAA,EACEV,EAEEW,EAAgBN,IAAS,UAE/B,IAAIO,EAAc,GACdC,EAA+B,KAC/BC,EAAsBH,EACtB,OAAO,SAAS,SAAW,OAAO,SAAS,OAC3C,OAAO,SAAS,KACpB,MAAMjI,EAA8B,CAAA,EAC9BqI,MAAiB,IAGjBC,EAAUhP,EAAEiO,CAAM,EASlBgB,EAAe,IAAc,CACjC,GAAIN,EAAe,CACjB,IAAIO,EAAW,OAAO,SAAS,SAE/B,OAAIZ,GAAYY,EAAS,WAAWZ,CAAQ,IAC1CY,EAAWA,EAAS,UAAUZ,EAAS,MAAM,GAG7BY,EAAS,QAAQ,MAAO,EAAE,GACxBhB,CACtB,CAEA,MAAMiB,EAAO,OAAO,SAAS,KACvBC,EAASD,EAAK,QAAQ,GAAG,EAE/B,OADkBC,IAAW,GAAKD,EAAK,UAAU,CAAC,EAAIA,EAAK,UAAU,EAAGC,CAAM,IAC1DlB,CACtB,EAOMmB,GAAiB,IAA8B,CACnD,IAAIrJ,EAEJ,GAAI2I,GAEF,GADA3I,EAAM,OAAO,SAAS,OAAO,UAAU,CAAC,EACpC,CAACA,EAAK,MAAO,CAAA,MACZ,CACL,MAAMmJ,EAAO,OAAO,SAAS,KACvBC,EAASD,EAAK,QAAQ,GAAG,EAC/B,GAAIC,IAAW,GAAI,MAAO,CAAA,EAC1BpJ,EAAMmJ,EAAK,UAAUC,EAAS,CAAC,CACjC,CAEA,MAAME,EAAK,IAAI,gBAAgBtJ,CAAG,EAC5BuJ,EAAiC,OAAO,YAAYD,CAAE,EAG5D,GAAItJ,EAAI,SAAS,GAAG,EAClB,GAAI,CACF,mBAAmBA,CAAG,CACxB,MAAa,CACX,QAAQ,KAAK,GAAG8H,EAAU,6BAA6B9H,CAAG,EAAE,CAC9D,CAGF,OAAOuJ,CACT,EAOMC,GAAUC,GAA4B,CAC1C,GAAId,EAAe,CAEjB,MAAMe,EAAM,GAAGpB,EAAS,QAAQ,MAAO,EAAE,CAAC,IAAImB,CAAS,GACvD,QAAQ,UAAU,KAAM,GAAIC,CAAG,EAC/BZ,EAAcY,CAChB,KAAO,CACL,MAAMP,EAAO,IAAIM,CAAS,GAC1BX,EAAcK,EACd,OAAO,SAAS,KAAOA,CACzB,CACF,EAOMQ,EAAa,IAAY,CACzBhB,EACF,QAAQ,aAAa,KAAM,GAAIG,CAAW,EAE1C,OAAO,SAAS,KAAOA,CAE3B,EAKMc,GAAgB,IAChBjB,EACK,OAAO,SAAS,SAAW,OAAO,SAAS,OAE7C,OAAO,SAAS,KAQnBkB,GAAkBJ,GAA8C,CACpE,IAAIK,EAAc3B,EAAOsB,CAAS,EAOlC,MAJI,CAACK,GAAe1B,IAClB0B,EAAc3B,EAAOC,CAAQ,GAG1B0B,IACH,QAAQ,KAAK,GAAGhC,EAAU,WAAW2B,CAAS,8CAA8C,EACrF,KAIX,EAMMM,GAAkBC,GAAsC,CAC5D,MAAMC,EAAW,SAAS,cAAcD,CAAgB,EAExD,GAAI,CAACC,GAAU,QACb,eAAQ,KAAK,GAAGnC,EAAU,cAAckC,CAAgB,aAAa,EAC9D,GAGT,MAAME,EAAgBD,EAAS,QAAQ,UAAU,EAAI,EACrD,OAAAjB,EAAQ,OAAOkB,CAAa,EACrB,EACT,EAEMC,EAAqChL,GAAW8J,GAAc,EAM9DmB,EAAeX,GAA4B,CAC/C,GAAIb,EAAa,OAGjB,MAAMyB,EAAYrB,EAAQ,CAAC,EAC3B,GAAI,CAACqB,EAAW,CACd,QAAQ,KAAK,GAAGvC,EAAU,oBAAoBG,CAAM,aAAa,EACjE,MACF,CAGA,MAAM6B,EAAcD,GAAeJ,CAAS,EAC5C,GAAI,CAACK,EAAa,OAGlB,MAAMP,EAASF,GAAA,EAGXZ,GACFA,EAAiBI,GAAiBY,EAAWA,CAAS,EAIxDT,EAAQ,MAAA,EAGR,IAAIsB,EAAcf,EAClB,GAAIO,EAAY,QAAS,CACvB,MAAM3M,EAAS2M,EAAY,QAAQP,CAAM,EACrCpM,IAAW,SACbmN,EAAc,CAAE,GAAGf,EAAQ,GAAGpM,CAAA,EAElC,CAGI2M,EAAY,OACdA,EAAY,OAAOO,EAAWZ,EAAWa,CAAW,EAC3CR,EAAY,UACrBC,GAAeD,EAAY,QAAQ,EAIjCpB,GACFA,EAAgBG,GAAiBY,EAAWA,CAAS,EAIvDZ,EAAgBY,CAClB,EAMMc,EAAYd,GAA4B,CAC5C,GAAIb,EAAa,OAGjB,MAAM4B,EAAmBL,EAAa,MAChCM,EAAqBtC,EAAOqC,CAAgB,EAElD,GAAIC,GAAoB,SACLA,EAAmB,QAAA,IACnB,GAAO,OAI1B,MAAMC,EAAWjB,GAAavB,EAC9BsB,GAAOkB,CAAQ,EACfP,EAAa,MAAQO,CACvB,EAKMC,EAAkB,IAAY,CAClC,GAAI/B,EAAa,OAEjB,MAAMgC,EAAahB,GAAA,EACnB,GAAIgB,IAAe9B,EAAa,OAEhC,MAAM+B,EAAW5B,EAAA,EACX6B,EAAeX,EAAa,MAElC,GAAIW,IAAiBD,EAAU,CAE7B,MAAME,EAAiB5C,EAAO2C,CAAY,EAC1C,GAAIC,GAAgB,SACdA,EAAe,QAAA,IAAc,GAAO,CAEtCpB,EAAA,EACA,MACF,CAEFQ,EAAa,MAAQU,CACvB,MAEET,EAAYS,CAAQ,EAGtB/B,EAAc8B,CAChB,EAOMI,EAAqB,IAAY,CACrC,GAAI,CAACzC,EAAe,OAGpB,MAAM0C,EAAmBpU,GAA6B,CACpDA,EAAE,eAAA,EACF,MAAMqU,EAAarU,EAAE,cAA8B,QAAQ,MACvDqU,GAAa,MAAMX,EAASW,CAAS,CAC3C,EAEAlR,EAAE,QAAQ,EAAE,GAAG,QAAS,eAAgBiR,CAAe,EAEvDvK,EAAS,KAAK,IAAM,CAClB1G,EAAE,QAAQ,EAAE,IAAI,QAAS,eAAgBiR,CAAe,CAC1D,CAAC,EAID,MAAME,EAAmB5P,GAAoB,CAC3C,GAAIwN,EAAW,IAAIxN,CAAE,EAAG,OAExB,MAAM2P,EAAY3P,EAAG,QAAQ,MAE7BwN,EAAW,IAAIxN,CAAE,EAGjB,MAAM6P,EAAe7L,EAAO,IAAM,CAChC,MAAM8L,EAAWlB,EAAa,QAAUe,EACxC3P,EAAG,UAAU,OAAOiN,EAAa6C,CAAQ,EAGrCA,EACF9P,EAAG,aAAa,eAAgB,MAAM,EAEtCA,EAAG,gBAAgB,cAAc,CAErC,CAAC,EAGDsF,EAAS,YAAYtF,EAAI6P,CAAY,EAGrCvK,EAAS,aAAatF,EAAI,IAAM,CAC9BwN,EAAW,OAAOxN,CAAE,CACtB,CAAC,CACH,EAGA,UAAWA,KAAM,SAAS,iBAA8B,cAAc,EACpE4P,EAAgB5P,CAAE,EAIpB,MAAMuF,EAAW,IAAI,iBAAkBG,GAAc,CACnD,UAAWqK,KAAYrK,EACjBqK,EAAS,OAAS,aACpBA,EAAS,WAAW,QAASjL,GAAS,CACpC,GAAIA,EAAK,WAAa,EAAG,CAEvB,MAAM9E,EAAK8E,EACP9E,EAAG,UAAU,cAAc,GAC7B4P,EAAgB5P,CAAE,EAGhBA,EAAG,kBACLA,EAAG,iBAAiB,cAAc,EAAE,QAASqF,IAC3CuK,EAAgBvK,EAAoB,CAAA,CAG1C,CACF,CAAC,CAGP,CAAC,EAEDE,EAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,EAClEJ,EAAS,KAAK,IAAMI,EAAS,WAAA,CAAY,CAC3C,EAMMyK,EAAU,IAAY,CACtB3C,IACJA,EAAc,GAGdlI,EAAS,QAASiE,GAAYA,EAAA,CAAS,EACvCjE,EAAS,OAAS,EAIlBqI,EAAW,QAASxN,GAAOsF,EAAS,QAAQtF,CAAE,CAAC,EAC/CwN,EAAW,MAAA,EACb,EAGMyC,EAAY7C,EAAgB,WAAa,aAC/C,OAAO,iBAAiB6C,EAAWb,CAAe,EAClDjK,EAAS,KAAK,IAAM,OAAO,oBAAoB8K,EAAWb,CAAe,CAAC,EAG1E,MAAMc,GAAelM,EAAO,IAAM,CAChC6K,EAAYD,EAAa,KAAK,CAChC,CAAC,EACD,OAAAzJ,EAAS,KAAK,IAAM+K,GAAa,QAAA,CAAS,EAG1CT,EAAA,EAGIhC,EAAQ,CAAC,GACXnI,EAAS,aAAamI,EAAQ,CAAC,EAAGuC,CAAO,EAGpC,CACL,aAAApB,EACA,SAAAI,EACA,QAAAgB,CAAA,CAEJ,CAKAvR,EAAE,OAAO,CACP,MAAA+N,EACF,CAAC,EChbD,SAAS2D,GAAaC,EAAkCzM,EAA2C,CACjG,KAAM,CAAE,aAAA0M,EAAc,UAAAC,EAAW,OAAAC,EAAQ,QAAAC,EAAS,YAAAC,GAAgB9M,EAC5D+M,EAAS,OAAON,GAAY,WAAaA,EAAU,IAAMA,EAE/D,OAAOrM,GACL,SAAY,CACV,MAAMoK,EAAMuC,EAAA,EACNjM,EAAM,MAAMhG,EAAE,KAAK,CAAE,GAAGgS,EAAa,IAAAtC,EAAK,OAAAoC,EAAQ,QAAAC,EAAS,EACjE,OAAOF,EAAYA,EAAU7L,CAAG,EAAKA,CACvC,EACA,CAAE,aAAA4L,EAAc,KAAM,EAAA,CAAM,CAEhC,CAEA5R,EAAE,OAAO,CAAE,UAAA0R,GAAW,ECbtB,MAAMQ,OAAiB,QAEvB,IAAIC,GAA2B,GAE/B,MAAMC,GAAqB5L,GAAmC,CAC5D,IAAI6L,EAAUH,GAAW,IAAI1L,CAAE,EAC/B,OAAK6L,IACHA,EAAU,YAA4BlO,EAAiB,CACrD,OAAOqB,GAAM,IAAMgB,EAAG,MAAM,KAAMrC,CAAgC,CAAC,CACrE,EACA+N,GAAW,IAAI1L,EAAI6L,CAAO,GAErBA,CACT,EAKO,SAASC,IAAwB,CACtC,GAAIH,GAA0B,OAC9BA,GAA2B,GAE3B,MAAMI,EAAavS,EAAE,GAAG,GAClBwS,EAAcxS,EAAE,GAAG,IACnByS,EAAiBzS,EAAE,GAAG,OACtB0S,EAAgB1S,EAAE,GAAG,MACrB2S,EAAiB3S,EAAE,GAAG,OAK5BA,EAAE,GAAG,OAAS,SAAwByE,EAAmB,CACvD,MAAMmO,EAAUnO,EAAW,KAAK,OAAOA,CAAQ,EAAI,KACnD,QAASpH,EAAI,EAAGwE,EAAM+Q,EAAQ,OAAQvV,EAAIwE,EAAKxE,IAAK,CAClD,MAAMkE,EAAKqR,EAAQvV,CAAC,EAChBkE,IACFsF,EAAS,YAAYtF,CAAE,EACvBsF,EAAS,YAAYtF,CAAE,EAE3B,CACA,OAAOkR,EAAe,KAAK,KAAMhO,CAAQ,CAC3C,EAGAzE,EAAE,GAAG,MAAQ,UAAwB,CACnC,QAAS3C,EAAI,EAAGwE,EAAM,KAAK,OAAQxE,EAAIwE,EAAKxE,IAAK,CAC/C,MAAMkE,EAAK,KAAKlE,CAAC,EACbkE,GAAIsF,EAAS,mBAAmBtF,CAAE,CACxC,CACA,OAAOmR,EAAc,KAAK,IAAI,CAChC,EAGA1S,EAAE,GAAG,OAAS,SAAwByE,EAAmB,CACvD,MAAMmO,EAAUnO,EAAW,KAAK,OAAOA,CAAQ,EAAI,KACnD,QAASpH,EAAI,EAAGwE,EAAM+Q,EAAQ,OAAQvV,EAAIwE,EAAKxE,IAAK,CAClD,MAAMkE,EAAKqR,EAAQvV,CAAC,EAChBkE,GAAIsF,EAAS,KAAKtF,CAAE,CAC1B,CACA,OAAOoR,EAAe,KAAK,KAAMlO,CAAQ,CAC3C,EAKAzE,EAAE,GAAG,GAAK,YAA2BmE,EAAiB,CACpD,MAAM0O,EAAQ1O,EAAK,CAAC,EAEpB,GAAI0O,GAAS,OAAOA,GAAU,SAAU,CACtC,MAAMC,EAAMD,EACNE,EAAuC,CAAA,EAC7C,UAAWhQ,KAAO+P,EAAK,CACrB,MAAMjI,EAAUiI,EAAI/P,CAAG,EACnB8H,IACFkI,EAAOhQ,CAAG,EAAIqP,GAAkBvH,CAAO,EAE3C,CACA1G,EAAK,CAAC,EAAI4O,CACZ,KACE,SAAS1V,EAAI8G,EAAK,OAAS,EAAG9G,GAAK,EAAGA,IACpC,GAAI,OAAO8G,EAAK9G,CAAC,GAAM,WAAY,CACjC8G,EAAK9G,CAAC,EAAI+U,GAAkBjO,EAAK9G,CAAC,CAAiB,EACnD,KACF,CAIJ,OAAOkV,EAAW,MAAM,KAAMpO,CAAqC,CACrE,EAGAnE,EAAE,GAAG,IAAM,YAA2BmE,EAAiB,CACrD,MAAM0O,EAAQ1O,EAAK,CAAC,EAEpB,GAAI0O,GAAS,OAAOA,GAAU,SAAU,CACtC,MAAMC,EAAMD,EACNE,EAAuC,CAAA,EAC7C,UAAWhQ,KAAO+P,EAAK,CACrB,MAAMjI,EAAUiI,EAAI/P,CAAG,EACnB8H,IACFkI,EAAOhQ,CAAG,EAAImP,GAAW,IAAIrH,CAAO,GAAKA,EAE7C,CACA1G,EAAK,CAAC,EAAI4O,CACZ,KACE,SAAS1V,EAAI8G,EAAK,OAAS,EAAG9G,GAAK,EAAGA,IACpC,GAAI,OAAO8G,EAAK9G,CAAC,GAAM,WAAY,CACjC8G,EAAK9G,CAAC,EAAI6U,GAAW,IAAI/N,EAAK9G,CAAC,CAAiB,GAAK8G,EAAK9G,CAAC,EAC3D,KACF,CAIJ,OAAOmV,EAAY,MAAM,KAAMrO,CAAsC,CACvE,CACF,CCpGAnE,EAAE,IAAM,CACNsS,GAAA,EACAvL,GAAkB,SAAS,IAAI,CACjC,CAAC"}
|
|
1
|
+
{"version":3,"file":"atom-effect-jquery.min.js","sources":["../../core/dist/index.mjs","../src/constants.ts","../src/utils.ts","../src/debug.ts","../src/namespace.ts","../src/registry.ts","../src/effect-factory.ts","../src/jquery-patch.ts","../src/types.ts","../src/input-binding.ts","../src/unified.ts","../src/chainable.ts","../src/list.ts","../src/mount.ts","../src/route.ts","../src/fetch.ts","../src/index.ts"],"sourcesContent":["const b = {\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}, u = {\n DISPOSED: 1,\n EXECUTING: 8\n}, $ = {\n DISPOSED: 1,\n /** Marker bit: identifies this node as a computed. */\n IS_COMPUTED: 2,\n DIRTY: 8,\n IDLE: 16,\n PENDING: 32,\n RESOLVED: 64,\n REJECTED: 128,\n RECOMPUTING: 256,\n HAS_ERROR: 512\n}, a = {\n DISPOSED: 1,\n SYNC: 8,\n NOTIFICATION_SCHEDULED: 16\n}, Dt = {\n MAX_SIZE: 1e3,\n WARMUP_SIZE: 100,\n ENABLE_STATS: !1\n}, d = {\n // Infinite loop protection\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n // Batch processing limits to prevent blocking the main thread for too long\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n // Memory management\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}, nt = {\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3\n}, H = {\n MAX_ASYNC_RETRIES: 3,\n MAX_PROMISE_ID: Number.MAX_SAFE_INTEGER - 1\n}, R = 1073741823, W = typeof process < \"u\" && process.env && !1 || !1, rt = Object.freeze([]);\nclass D extends Error {\n constructor(t, e = null, s = !0) {\n super(t), this.cause = e, this.recoverable = s, this.name = \"AtomError\";\n }\n}\nclass f extends D {\n constructor(t, e = null) {\n super(t, e, !0), this.name = \"ComputedError\";\n }\n}\nclass I extends D {\n constructor(t, e = null) {\n super(t, e, !1), this.name = \"EffectError\";\n }\n}\nclass m extends D {\n constructor(t, e = null) {\n super(t, e, !1), this.name = \"SchedulerError\";\n }\n}\nconst ot = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), ht = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), x = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), F = {\n // Dev mode flag\n enabled: W,\n warnInfiniteLoop: nt.WARN_INFINITE_LOOP,\n warn(i, t) {\n },\n checkCircular(i, t) {\n if (i === t)\n throw new f(\"Direct circular dependency detected\");\n },\n attachDebugInfo(i, t, e) {\n },\n getDebugName: (i) => i?.[ot],\n getDebugType: (i) => i?.[ht]\n};\nlet ct = 1;\nconst ut = () => ct++;\nfunction K(i, t, e) {\n if (typeof t == \"function\") {\n const n = t;\n if (e.some((r) => r && r.fn === n)) return;\n e.push(new P(n, void 0));\n return;\n }\n if (\"addDependency\" in t) {\n t.addDependency(i);\n return;\n }\n const s = t;\n e.some((n) => n && n.sub === s) || e.push(new P(void 0, s));\n}\nfunction V(i, t, e) {\n const s = /* @__PURE__ */ new Map();\n t.forEach((n) => {\n n?.unsub && s.set(n.node, n.unsub);\n }), i.forEach((n) => {\n if (!n) return;\n const r = n.node, o = s.get(r);\n o !== void 0 ? (n.unsub = o, s.delete(r)) : (F.checkCircular(r, e), n.unsub = r.subscribe(e));\n }), s.forEach((n) => n());\n}\nclass v {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}\nclass P {\n constructor(t, e) {\n this.fn = t, this.sub = e;\n }\n}\nconst h = {\n // Computed Errors\n COMPUTED_MUST_BE_FUNCTION: \"Computed target must be a function\",\n COMPUTED_ASYNC_PENDING_NO_DEFAULT: \"Async computation pending with no default value\",\n COMPUTED_COMPUTATION_FAILED: \"Computation execution failed\",\n COMPUTED_ASYNC_COMPUTATION_FAILED: \"Async computation execution failed\",\n COMPUTED_CIRCULAR_DEPENDENCY: \"Circular dependency detected\",\n COMPUTED_DISPOSED: \"Attempted to access disposed computed\",\n // Atom Errors\n ATOM_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\n // Effect Errors\n EFFECT_MUST_BE_FUNCTION: \"Effect target must be a function\",\n EFFECT_EXECUTION_FAILED: \"Effect execution failed\",\n EFFECT_CLEANUP_FAILED: \"Effect cleanup failed\",\n EFFECT_DISPOSED: \"Attempted to run disposed effect\",\n // Scheduler Errors\n SCHEDULER_FLUSH_OVERFLOW: (i, t) => `Maximum flush iterations (${i}) exceeded. ${t} jobs dropped. Possible infinite loop.`,\n // System / Debug\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\n // Effect frequency\n EFFECT_FREQUENCY_LIMIT_EXCEEDED: \"Effect executed too frequently within 1 second. Suspected infinite loop.\",\n SCHEDULER_CALLBACK_MUST_BE_FUNCTION: \"Scheduler callback must be a function\",\n SCHEDULER_END_BATCH_WITHOUT_START: \"endBatch() called without matching startBatch(). Ignoring.\"\n};\nfunction S(i, t, e) {\n if (i instanceof D)\n return i;\n const s = i instanceof Error, n = s ? i.message : String(i), r = s ? i : void 0, O = `${s ? i.constructor.name : \"Unexpected error\"} (${e}): ${n}`;\n return new t(O, r);\n}\nclass J {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = -1, this.id = ut() & R;\n }\n}\nclass Z extends J {\n /**\n * Adds subscriber.\n */\n subscribe(t) {\n const e = typeof t == \"function\";\n if (!e && (!t || typeof t.execute != \"function\"))\n throw S(\n new TypeError(\"Invalid subscriber\"),\n D,\n h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION\n );\n if (this._subscribers.some((r) => r ? e ? r.fn === t : r.sub === t : !1))\n return () => {\n };\n const s = new P(\n e ? t : void 0,\n e ? void 0 : t\n );\n return this._subscribers.push(s), () => this._unsubscribe(s);\n }\n _unsubscribe(t) {\n const e = this._subscribers, s = e.indexOf(t);\n if (s === -1) return;\n const n = e.pop();\n s < e.length && n && (e[s] = n);\n }\n subscriberCount() {\n return this._subscribers.length;\n }\n _notifySubscribers(t, e) {\n if (this._subscribers.length === 0) return;\n this._subscribers.slice(0).forEach((n) => {\n if (n)\n try {\n n.fn ? n.fn(t, e) : n.sub && n.sub.execute();\n } catch (r) {\n this._handleNotifyError(r);\n }\n });\n }\n _handleNotifyError(t) {\n console.error(S(t, D, h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n}\nlet k = 0;\nconst w = () => (k = k + 1 & R || 1, k), M = (i) => i + 1 & R;\nlet B = 0, L = !1, tt = 0;\nconst _t = () => tt;\nfunction X() {\n return L ? !1 : (L = !0, tt = w(), B = 0, !0);\n}\nconst G = () => {\n L = !1;\n}, at = () => L ? ++B : 0;\nclass lt {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isBatching = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = d.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get phase() {\n return this._isProcessing || this._isFlushingSync ? 2 : this._isBatching ? 1 : 0;\n }\n get queueSize() {\n return this._size;\n }\n get isBatching() {\n return this._isBatching;\n }\n /**\n * Schedules job.\n */\n schedule(t) {\n if (t._nextEpoch !== this._epoch) {\n if (t._nextEpoch = this._epoch, this._isBatching || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n this._queueBuffer[this._bufferIndex][this._size++] = t, this._isProcessing || this._flush();\n }\n }\n /**\n * Triggers flush.\n */\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n /**\n * Scheduler loop.\n */\n _runLoop() {\n try {\n if (this._size === 0) return;\n const t = X();\n this._drainQueue(), t && G();\n } finally {\n this._isProcessing = !1, this._size > 0 && !this._isBatching && this._flush();\n }\n }\n _flushSync() {\n this._isFlushingSync = !0;\n const t = X();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = !1, t && G();\n }\n }\n _mergeBatchQueue() {\n if (this._batchQueueSize === 0) return;\n const t = ++this._epoch, e = this._batchQueue, s = this._queueBuffer[this._bufferIndex];\n let n = this._size;\n e.slice(0, this._batchQueueSize).forEach((r) => {\n r._nextEpoch !== t && (r._nextEpoch = t, s[n++] = r);\n }), this._size = n, this._batchQueueSize = 0, e.length > d.BATCH_QUEUE_SHRINK_THRESHOLD && (e.length = 0);\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._processQueue(), this._mergeBatchQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, e = this._queueBuffer[t], s = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch++;\n for (let n = 0; n < s; n++)\n try {\n e[n]();\n } catch (r) {\n console.error(new m(\"Error occurred during scheduler execution\", r));\n }\n e.length = 0;\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n if (console.error(\n new m(\n h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t)\n )\n ), this._size = 0, this._queueBuffer[this._bufferIndex].length = 0, this._batchQueueSize = 0, this.onOverflow)\n try {\n this.onOverflow(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++, this._isBatching = !0;\n }\n endBatch() {\n this._batchDepth !== 0 && --this._batchDepth === 0 && (this._flushSync(), this._isBatching = !1);\n }\n setMaxFlushIterations(t) {\n if (t < d.MIN_FLUSH_ITERATIONS)\n throw new m(\n `Max flush iterations must be at least ${d.MIN_FLUSH_ITERATIONS}`\n );\n this._maxFlushIterations = t;\n }\n}\nconst T = new lt(), z = /* @__PURE__ */ Symbol.for(\"atom-effect/atom\"), et = /* @__PURE__ */ Symbol.for(\"atom-effect/computed\"), st = /* @__PURE__ */ Symbol.for(\"atom-effect/effect\"), _ = {\n /** Active listener. */\n current: null,\n /**\n * Executes in context.\n *\n * @param listener - The subscriber.\n * @param fn - The logic to execute.\n * @returns The result of `fn`.\n */\n run(i, t) {\n const e = this.current;\n this.current = i;\n try {\n return t();\n } finally {\n this.current = e;\n }\n }\n};\nfunction Ct(i) {\n const t = _.current;\n if (t === null) return i();\n _.current = null;\n try {\n return i();\n } finally {\n _.current = t;\n }\n}\nvar Q;\nclass ft extends Z {\n constructor(t, e) {\n super(), this._pendingOldValue = void 0, this._notifyTask = () => this._flushNotifications(), this._subscribers = [], this[Q] = !0, this._value = t, e && (this.flags |= a.SYNC), F.attachDebugInfo(this, \"atom\", this.id);\n }\n get value() {\n const t = _.current;\n return t && K(this, t, this._subscribers), this._value;\n }\n set value(t) {\n const e = this._value;\n if (Object.is(e, t)) return;\n this._value = t, this.version = M(this.version);\n const s = this.flags;\n if (!(this._subscribers.length === 0 || s & a.NOTIFICATION_SCHEDULED)) {\n if (this._pendingOldValue = e, this.flags = s | a.NOTIFICATION_SCHEDULED, s & a.SYNC && !T.isBatching) {\n this._flushNotifications();\n return;\n }\n T.schedule(this._notifyTask);\n }\n }\n /**\n * Triggers subscribers.\n */\n _flushNotifications() {\n const t = this.flags;\n if (!(t & a.NOTIFICATION_SCHEDULED) || t & a.DISPOSED)\n return;\n const e = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags &= -17, this._notifySubscribers(this._value, e);\n }\n peek() {\n return this._value;\n }\n dispose() {\n this.flags & a.DISPOSED || (this._subscribers.length = 0, this.flags |= a.DISPOSED, this._value = void 0, this._pendingOldValue = void 0);\n }\n [(Q = z, Symbol.dispose)]() {\n this.dispose();\n }\n}\nfunction gt(i, t = {}) {\n return new ft(i, t.sync ?? !1);\n}\nclass Et {\n /**\n * @param limit - Max unique arrays to hold (default: 50). Prevents the pool itself from consuming too much memory.\n * @param capacity - Max length of an array to accept (default: 256).\n * @param enableStats - Force-enable stats even in production (default: false).\n */\n constructor(t = 50, e = 256, s = !1) {\n this.limit = t, this.capacity = e, this.pool = [], this.stats = null, this.stats = s ? {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 }\n } : null;\n }\n /**\n * Acquires array.\n */\n acquire() {\n return this.stats && this.stats.acquired++, this.pool.pop() ?? [];\n }\n /**\n * Releases array.\n *\n * @param arr - Array to release.\n * @param emptyConst - Optional empty constant.\n */\n release(t, e) {\n if (!(e && t === e)) {\n if (t.length > this.capacity) {\n this.stats && this.stats.rejected.tooLarge++;\n return;\n }\n if (this.pool.length >= this.limit) {\n this.stats && this.stats.rejected.poolFull++;\n return;\n }\n if (Object.isFrozen(t)) {\n this.stats && this.stats.rejected.frozen++;\n return;\n }\n t.length = 0, this.pool.push(t), this.stats && this.stats.released++;\n }\n }\n /**\n * Pool stats.\n */\n getStats() {\n if (!this.stats) return null;\n const { acquired: t, released: e, rejected: s } = this.stats, n = t - e - (s.frozen + s.tooLarge + s.poolFull);\n return {\n acquired: t,\n released: e,\n rejected: { ...s },\n leaked: n,\n poolSize: this.pool.length\n };\n }\n /**\n * Resets pool.\n */\n reset() {\n this.pool.length = 0, this.stats && (this.stats = {\n acquired: 0,\n released: 0,\n rejected: { frozen: 0, tooLarge: 0, poolFull: 0 }\n });\n }\n}\nconst c = Object.freeze(\n []\n), l = new Et();\nfunction Tt(i) {\n return i !== null && typeof i == \"object\" && z in i;\n}\nfunction Ot(i) {\n return i !== null && typeof i == \"object\" && et in i;\n}\nfunction bt(i) {\n return i !== null && typeof i == \"object\" && st in i;\n}\nfunction it(i) {\n return i !== null && typeof i == \"object\" && typeof i.then == \"function\";\n}\nvar Y, q;\nconst { IDLE: A, DIRTY: p, PENDING: y, RESOLVED: E, REJECTED: g, HAS_ERROR: N, RECOMPUTING: C, DISPOSED: U, IS_COMPUTED: dt } = $;\nfunction pt(i) {\n return i & E ? b.RESOLVED : i & y ? b.PENDING : i & g ? b.REJECTED : b.IDLE;\n}\nclass It extends Z {\n constructor(t, e = {}) {\n if (typeof t != \"function\") throw new f(h.COMPUTED_MUST_BE_FUNCTION);\n super(), this[q] = !0, this[Y] = !0, this._error = null, this._promiseId = 0, this._subscribers = [], this._links = c, this._asyncStartAggregateVersion = 0, this._asyncRetryCount = 0, this._trackEpoch = -1, this._trackLinks = c, this._trackCount = 0, this._value = void 0, this.flags = dt | p | A, this._equal = e.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in e ? e.defaultValue : x, this._onError = e.onError ?? null;\n const s = e.maxAsyncRetries;\n if (this._maxAsyncRetries = (s ?? H.MAX_ASYNC_RETRIES) & R, F.attachDebugInfo(this, \"computed\", this.id), e.lazy === !1)\n try {\n this._recompute();\n } catch {\n }\n }\n _track() {\n const t = _.current;\n t && K(this, t, this._subscribers);\n }\n get value() {\n this._track();\n const t = this.flags;\n if ((t & (E | p | A)) === E)\n return this._value;\n if (t & U)\n throw new f(h.COMPUTED_DISPOSED);\n if (t & C) {\n if (this._defaultValue !== x) return this._defaultValue;\n throw new f(h.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if (t & (p | A) && (this._recompute(), this.flags & E))\n return this._value;\n const e = this._defaultValue, s = e !== x;\n if (this.flags & y) {\n if (s) return e;\n throw new f(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if (this.flags & g) {\n if (s) return e;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n return this._track(), pt(this.flags);\n }\n get hasError() {\n return this._track(), this.flags & (g | N) ? !0 : this._links.some((t) => t?.node?.flags & N);\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n if (this._track(), !this.hasError) return rt;\n const t = [];\n return this._error && t.push(this._error), this._links.forEach((s) => {\n const n = s.node;\n n.flags & N && n.errors.forEach((o) => {\n o && !t.includes(o) && t.push(o);\n });\n }), Object.freeze(t);\n }\n get lastError() {\n return this._track(), this._error;\n }\n get isPending() {\n return this._track(), (this.flags & y) !== 0;\n }\n get isResolved() {\n return this._track(), (this.flags & E) !== 0;\n }\n invalidate() {\n this._markDirty();\n }\n dispose() {\n if (this.flags & U) return;\n const t = this._links;\n t !== c && (t.forEach((e) => e.unsub?.()), l.release(t), this._links = c), this._subscribers.length = 0, this.flags = U | p | A, this._error = null, this._value = void 0;\n }\n [(q = z, Y = et, Symbol.dispose)]() {\n this.dispose();\n }\n addDependency(t) {\n if (t._lastSeenEpoch !== this._trackEpoch) {\n if (t._lastSeenEpoch = this._trackEpoch, this._trackCount < this._trackLinks.length) {\n const e = this._trackLinks[this._trackCount];\n e.node = t, e.version = t.version;\n } else\n this._trackLinks.push(new v(t, t.version));\n this._trackCount++;\n }\n }\n _recompute() {\n if (this.flags & C) return;\n this.flags |= C;\n const t = this._links;\n this._trackEpoch = w(), this._trackLinks = l.acquire(), this._trackCount = 0;\n let e = !1;\n try {\n const s = _.run(this, this._fn);\n this._trackLinks.length = this._trackCount, V(this._trackLinks, t, this), this._links = this._trackLinks, e = !0, it(s) ? this._handleAsyncComputation(s) : this._finalizeResolution(s);\n } catch (s) {\n if (!e)\n try {\n this._trackLinks.length = this._trackCount, V(this._trackLinks, t, this), this._links = this._trackLinks, e = !0;\n } catch {\n }\n this._handleError(s, h.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n e && t !== c ? l.release(t) : e || l.release(this._trackLinks), this._trackEpoch = -1, this._trackLinks = c, this._trackCount = 0, this.flags &= ~C;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | y) & -217, this._notifySubscribers(void 0, void 0), this._asyncStartAggregateVersion = this._captureVersionSnapshot(), this._asyncRetryCount = 0, this._promiseId = (this._promiseId + 1) % H.MAX_PROMISE_ID;\n const e = this._promiseId;\n t.then(\n (s) => {\n if (e === this._promiseId) {\n if (this._captureVersionSnapshot() !== this._asyncStartAggregateVersion)\n return this._asyncRetryCount++ < this._maxAsyncRetries ? this._markDirty() : this._handleError(\n new f(\n `Async drift threshold exceeded after ${this._maxAsyncRetries} retries.`\n ),\n h.COMPUTED_ASYNC_COMPUTATION_FAILED\n );\n this._finalizeResolution(s), this._notifySubscribers(s, void 0);\n }\n },\n (s) => e === this._promiseId && this._handleError(s, h.COMPUTED_ASYNC_COMPUTATION_FAILED)\n );\n }\n _captureVersionSnapshot() {\n let t = 0;\n const e = this._links;\n for (let s = 0, n = e.length; s < n; s++)\n t = (t << 5) - t + e[s].node.version | 0;\n return t;\n }\n _handleError(t, e, s = !1) {\n const n = S(t, f, e);\n if (!s && !(this.flags & g) && (this.version = M(this.version)), this._error = n, this.flags = this.flags & -121 | g | N, this._onError)\n try {\n this._onError(n);\n } catch (r) {\n console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER, r);\n }\n if (s) throw n;\n this._notifySubscribers(void 0, void 0);\n }\n _finalizeResolution(t) {\n (!(this.flags & E) || !this._equal(this._value, t)) && (this.version = M(this.version)), this._value = t, this._error = null, this.flags = (this.flags | E) & -697;\n }\n execute() {\n this._markDirty();\n }\n /** @internal */\n _markDirty() {\n this.flags & (C | p) || (this.flags |= p, this._notifySubscribers(void 0, void 0));\n }\n}\nfunction At(i, t = {}) {\n return new It(i, t);\n}\nvar j;\nclass St extends J {\n constructor(t, e = {}) {\n super(), this[j] = !0, this._cleanup = null, this._links = c, this._nextLinks = null, this._prevLinks = c, this._currentEpoch = -1, this._lastFlushEpoch = -1, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._fn = t, this._onError = e.onError ?? null, this._sync = e.sync ?? !1, this._maxExecutions = e.maxExecutionsPerSecond ?? d.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = e.maxExecutionsPerFlush ?? d.MAX_EXECUTIONS_PER_EFFECT, this._sync ? (this._executeTask = void 0, this._notifyCallback = () => this.execute()) : (this._executeTask = () => this.execute(), this._notifyCallback = () => T.schedule(this._executeTask)), F.attachDebugInfo(this, \"effect\", this.id);\n }\n run() {\n if (this.flags & u.DISPOSED)\n throw new I(h.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.flags & u.DISPOSED || (this.flags |= u.DISPOSED, this._execCleanup(), this._unsubLinks(this._links), this._links !== c && l.release(this._links), this._links = c, this._prevLinks = c);\n }\n [(j = st, Symbol.dispose)]() {\n this.dispose();\n }\n addDependency(t) {\n if (!(this.flags & u.EXECUTING)) return;\n const e = this._currentEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._nextLinks, n = this._prevLinks, r = n.findIndex((o) => o && o.node === t && o.unsub);\n if (r !== -1) {\n const o = n[r];\n o.version = t.version, s.push(o), n[r] = null;\n return;\n }\n try {\n const o = t.subscribe(this._notifyCallback);\n s.push(new v(t, t.version, o));\n } catch (o) {\n const O = S(o, I, h.EFFECT_EXECUTION_FAILED);\n if (console.error(O), this._onError)\n try {\n this._onError(O);\n } catch {\n }\n s.push(new v(t, t.version, void 0));\n }\n }\n /**\n * Executes effect with tracking.\n */\n execute(t = !1) {\n if (this.flags & (u.DISPOSED | u.EXECUTING) || !t && this._links.length > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), this.flags |= u.EXECUTING, this._execCleanup(), this._prevLinks = this._links;\n const e = l.acquire();\n this._nextLinks = e, this._currentEpoch = w();\n let s = !1;\n try {\n const n = _.run(this, this._fn);\n this._links = e, s = !0, it(n) ? this._handleAsyncResult(n) : this._cleanup = typeof n == \"function\" ? n : null;\n } catch (n) {\n this._links = e, s = !0, this._handleExecutionError(n), this._cleanup = null;\n } finally {\n this._finalizeDependencies(s, this._prevLinks, e), this.flags &= -9;\n }\n }\n _handleAsyncResult(t) {\n const e = ++this._execId;\n t.then(\n (s) => {\n if (e !== this._execId || this.flags & u.DISPOSED) {\n if (typeof s == \"function\")\n try {\n s();\n } catch (n) {\n this._handleExecutionError(n, h.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof s == \"function\" && (this._cleanup = s);\n },\n (s) => e === this._execId && this._handleExecutionError(s)\n );\n }\n _finalizeDependencies(t, e, s) {\n this._nextLinks = null, this._prevLinks = c, t ? (e.forEach((n) => n?.unsub?.()), e !== c && l.release(e)) : (this._unsubLinks(s), l.release(s));\n }\n _unsubLinks(t) {\n t.forEach((e) => e?.unsub?.());\n }\n _isDirty() {\n const t = this._links, e = _.current;\n _.current = null;\n try {\n return t.some((s) => {\n const n = s.node;\n if (n.flags & $.IS_COMPUTED)\n try {\n n.value;\n } catch {\n return !0;\n }\n return n.version !== s.version;\n });\n } finally {\n _.current = e;\n }\n }\n _execCleanup() {\n if (this._cleanup) {\n try {\n this._cleanup();\n } catch (t) {\n this._handleExecutionError(t, h.EFFECT_CLEANUP_FAILED);\n }\n this._cleanup = null;\n }\n }\n _checkInfiniteLoops() {\n const t = _t();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), at() > d.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++;\n }\n get isDisposed() {\n return (this.flags & u.DISPOSED) !== 0;\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & u.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const e = new I(\n `Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${B}`\n );\n throw this.dispose(), console.error(e), e;\n }\n _handleExecutionError(t, e = h.EFFECT_EXECUTION_FAILED) {\n const s = S(t, I, e);\n if (console.error(s), this._onError)\n try {\n this._onError(s);\n } catch (n) {\n console.error(S(n, I, h.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n}\nfunction Nt(i, t = {}) {\n if (typeof i != \"function\")\n throw new I(h.EFFECT_MUST_BE_FUNCTION);\n const e = new St(i, t);\n return e.execute(), e;\n}\nfunction yt(i) {\n if (typeof i != \"function\")\n throw new TypeError(\"Batch callback must be a function\");\n T.startBatch();\n try {\n return i();\n } finally {\n T.endBatch();\n }\n}\nexport {\n z as ATOM_BRAND,\n b as AsyncState,\n D as AtomError,\n et as COMPUTED_BRAND,\n f as ComputedError,\n nt as DEBUG_CONFIG,\n F as DEBUG_RUNTIME,\n st as EFFECT_BRAND,\n I as EffectError,\n Dt as POOL_CONFIG,\n d as SCHEDULER_CONFIG,\n m as SchedulerError,\n gt as atom,\n yt as batch,\n At as computed,\n Nt as effect,\n Tt as isAtom,\n Ot as isComputed,\n bt as isEffect,\n T as scheduler,\n Ct as untracked\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * Constants for atom-effect-jquery\n */\n\nimport type { RouteConfig } from './types';\n\n// ============================================================================\n// Log Prefixes\n// ============================================================================\n\n/**\n * Log prefixes keyed by subsystem.\n * Each prefix names the specific subsystem that emitted the message so that\n * console output is unambiguous regardless of which binding triggered it.\n */\nexport const LOG_PREFIXES = {\n /** Used by the SPA router ($.route). */\n ROUTE: '[atom-route]',\n /** Used by all reactive binding helpers (bindText, bindCss, bindAttr, …). */\n BINDING: '[atom-binding]',\n /** Used by atomList reactive list rendering. */\n LIST: '[atom-list]',\n /** Used by mount/unmount lifecycle helpers. */\n MOUNT: '[atom-mount]',\n} as const;\n\n// ============================================================================\n// Route Defaults\n// ============================================================================\n\n/**\n * Subset of RouteConfig fields that have default values.\n * Extracted as a named type so the annotation on ROUTE_DEFAULTS stays concise.\n * Any change to the relevant RouteConfig fields will surface here at compile time.\n */\ntype RouteDefaults = Readonly<\n Required<Pick<RouteConfig, 'mode' | 'basePath' | 'autoBindLinks' | 'activeClass'>>\n>;\n\n/**\n * Default values for RouteConfig optional fields.\n * `Object.freeze` provides runtime immutability; the `RouteDefaults` annotation\n * ensures structural compatibility with RouteConfig is verified at compile time.\n */\nexport const ROUTE_DEFAULTS: RouteDefaults = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n});\n\n// ============================================================================\n// Input Defaults\n// ============================================================================\n\n/**\n * Default values for input binding options.\n * DEBOUNCE is intentionally omitted: 0 is self-documenting at the call site\n * (`options.debounce ?? 0`) and extracting it as a named constant adds\n * indirection without clarity.\n * Additional defaults may be added here as the input binding API grows.\n */\nexport const INPUT_DEFAULTS = {\n EVENT: 'input',\n} as const;\n\n// ============================================================================\n// Dangerous DOM Properties\n// ============================================================================\n\n/**\n * Input element tag names accepted by `bindVal`.\n * Stored as a Set for O(1) lookup — consistent with the DANGEROUS_PROPS pattern.\n */\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\n/**\n * DOM properties blocked by `bindProp` to prevent HTML injection and\n * prototype pollution attacks.\n *\n * Stored as a `ReadonlySet` for O(1) lookup and runtime immutability.\n * `as const` alone does not freeze objects at runtime.\n *\n * Blocked categories:\n * - Raw HTML sinks : innerHTML, outerHTML, srcdoc\n * - Prototype access: __proto__, constructor, prototype\n *\n * Note: `src` is intentionally NOT blocked here. `bindProp` targets DOM\n * properties on arbitrary elements; blocking `src` would prevent legitimate\n * use on `<img>`, `<audio>`, `<video>`, etc. URL-bearing *attributes* (including\n * `src` on `<script>`/`<iframe>`) are guarded separately by `bindAttr` via\n * `isDangerousUrl()` in utils.ts.\n */\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n// ============================================================================\n// Error Messages\n// ============================================================================\n\n/**\n * Canonical error and warning messages for all subsystems.\n *\n * Every entry is a zero-or-one-argument function so consumers call them\n * uniformly — `ERROR_MESSAGES.X(arg)` — with no special-casing for\n * parameter-free messages. The `as const` here makes the function references\n * themselves readonly (non-reassignable); it does not narrow the string\n * return types.\n */\nexport const ERROR_MESSAGES = {\n ROUTE_NOT_FOUND: (name: string) => `Route \"${name}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (selector: string) => `Template \"${selector}\" not found`,\n TARGET_NOT_FOUND: (selector: string) => `Target element \"${selector}\" not found`,\n MALFORMED_URI: (raw: string) => `Malformed URI component: ${raw}`,\n /** Emitted when sanitizeHtml modifies the input. Prefixed at call site with LOG_PREFIXES.BINDING or LIST to identify the originating subsystem. */\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n /** Emitted by bindCss when a CSS style property value contains a dangerous protocol. */\n BLOCKED_DANGEROUS_CSS_VALUE: (prop: string) =>\n `Blocked dangerous value in CSS style property \"${prop}\".`,\n BLOCKED_EVENT_HANDLER: (name: string) =>\n `Blocked setting dangerous event handler attribute \"${name}\".`,\n BLOCKED_PROTOCOL: (name: string) => `Blocked dangerous protocol in \"${name}\" attribute.`,\n BLOCKED_DANGEROUS_PROP: (name: string) =>\n `Blocked setting dangerous property \"${name}\". Use html binding for sanitized HTML.`,\n INVALID_INPUT_ELEMENT: (tagName: string) => `Val binding used on non-input element <${tagName}>.`,\n MISSING_SOURCE: (method: string) => `[${method}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (method: string) =>\n `[${method}] condition is required when className is a string.`,\n DUPLICATE_KEY: (key: string | number, index: number) =>\n `Duplicate key \"${key}\" at index ${index}.`,\n UPDATER_ERROR: (debugType: string) => `Updater threw in binding \"${debugType}\"`,\n EFFECT_DISPOSE_ERROR: () => 'Effect dispose error',\n BINDING_CLEANUP_ERROR: () => 'Binding cleanup error',\n PARSE_ERROR: () => 'parse() threw during DOM→Atom sync',\n MOUNT_ERROR: () => 'Mount error',\n MOUNT_CLEANUP_ERROR: () => 'Cleanup error',\n} as const;\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { ReactiveValue, RenderRoute, RouteDefinition, TemplateRoute } from './types';\n\n/**\n * Checks if a given value is a reactive node (Atom or Computed).\n *\n * `isAtom` returns `true` for both plain atoms and computed atoms because\n * `ComputedAtomImpl` carries `ATOM_BRAND` in addition to `COMPUTED_BRAND`.\n * A separate `isComputed` check would therefore be redundant.\n */\nexport function isReactive(value: unknown): value is ReadonlyAtom<unknown> {\n return isAtom(value);\n}\n\n/**\n * Extracts the underlying raw value from a ReactiveValue.\n */\nexport function getValue<T>(source: ReactiveValue<T>): T {\n return isReactive(source) ? (source as ReadonlyAtom<T>).value : (source as T);\n}\n\n// ============================================================================\n// DOM helpers\n// ============================================================================\n\n/**\n * Generates a CSS selector string for a DOM element, suitable for debug output.\n * Returns `tagName#id` when an id is present, otherwise `tagName.class1.class2…`.\n */\nexport function getSelector(el: Element): string {\n const tagName = el.tagName.toLowerCase();\n if (el.id) return `${tagName}#${el.id}`;\n\n const list = el.classList;\n const len = list.length;\n if (len === 0) return tagName;\n\n let selector = tagName;\n for (let i = 0; i < len; i++) {\n selector += `.${list[i]!}`;\n }\n return selector;\n}\n\n// ============================================================================\n// HTML sanitization\n// ============================================================================\n\nconst URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'srcset',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n]);\n\n/** cached hasOwnProperty for safe checks */\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nconst DANGEROUS_PROTOCOL_RE = /^\\s*(?:javascript|vbscript)\\s*:/i;\n\nconst DANGEROUS_CSS_RE =\n // biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\n /(?:expression\\s*\\(|behavior\\s*:|(?:\\\\[0-9a-f]{1,6}\\s*|[\\s\\x00-\\x20/'\"])*(?:j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|d\\s*a\\s*t\\s*a)\\s*:(?!image\\/))/i;\n\n/** Module-level constant — avoids recreating the RegExp on every call. */\nconst DANGEROUS_CSS_URL_RE = /url\\s*\\(\\s*(?:[\"']?\\s*)?(?:javascript|vbscript)\\s*:/i;\n\n// Pre-compiled regexes for sanitizeHtml to avoid reallocation\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters\nconst STRIP_CTRL_RE = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\nconst STRIP_XML_RE = /<\\?[\\s\\S]*?\\?>/g;\nconst DANGEROUS_TAG_RE =\n /(<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*>([\\s\\S]*?)<\\/\\2>|<(script|iframe|object|embed|base|meta|applet|noscript|form|style|link)\\b[^>]*\\/?>)/gi;\nconst DANGEROUS_PROTOCOL_GLOBAL_RE =\n /(j\\s*a\\s*v\\s*a\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t|v\\s*b\\s*s\\s*c\\s*r\\s*i\\s*p\\s*t)\\s*:/gi;\nconst DANGEROUS_DATA_URI_RE =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\nconst UNSAFE_ATTR_RE = /\\bon\\w+\\s*=/gim;\nconst DANGEROUS_CSS_GLOBAL_RE = new RegExp(DANGEROUS_CSS_RE.source, 'gim');\n\n// --- Helpers ---\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n *\n * Faster than DOMParser but relies on pattern matching.\n * Neutralizes dangerous attributes (on*, protocols) instead of removing them entirely.\n *\n * **Note:** This is a best-effort defense layer, not a full-featured sanitizer.\n * For user-controlled rich text, prefer a dedicated library such as DOMPurify.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n let safe = String(html ?? '');\n\n // 0. Pre-process: Remove null bytes and control characters (bypass vectors)\n // These are often used to bypass regex filters while browsers ignore them\n safe = safe.replace(STRIP_CTRL_RE, '');\n\n // 1. Remove dangerous tags entirely (content included or tag stripped)\n // Lightweight first pass — DOMPurify handles the full sanitization.\n // Note: svg/math are NOT removed — they have legitimate uses (icons, equations).\n // Their event handlers (on*) are already neutralized in step 3.\n // Also remove processing instructions <? ... ?> which can be abused in some contexts\n safe = safe.replace(STRIP_XML_RE, '');\n\n // Loop tag removal to prevent nested reassembly bypass (e.g. \"<scr<script>ipt>\")\n let prev: string;\n do {\n prev = safe;\n safe = safe.replace(DANGEROUS_TAG_RE, '');\n } while (safe !== prev);\n\n // 2. Neutralize dangerous protocols (javascript:, vbscript:)\n // Simple whitespace-tolerant regex. Entity-based obfuscation is left to DOMPurify.\n safe = safe.replace(DANGEROUS_PROTOCOL_GLOBAL_RE, 'data-unsafe-protocol:');\n\n // Separately handle dangerous data URIs (e.g. text/html, base64 encoded scripts)\n // Allows common inline images (data:image/...) BUT blocks SVG (can contain scripts) and XML.\n safe = safe.replace(DANGEROUS_DATA_URI_RE, 'data-unsafe-protocol:');\n\n // 3. Neutralize event handlers (on* attributes)\n // Replaces \"onclick=\" with \"data-unsafe-attr=\"\n safe = safe.replace(UNSAFE_ATTR_RE, 'data-unsafe-attr=');\n\n // 4. Neutralize CSS expressions (IE legacy but dangerous) and behavior\n safe = safe.replace(DANGEROUS_CSS_GLOBAL_RE, 'data-unsafe-css:');\n\n return safe;\n}\n\n// ============================================================================\n// Security guards (used by binding layer)\n// ============================================================================\n\n/**\n * Returns `true` when `attrName` is a URL-bearing attribute and `value`\n * contains a `javascript:` or `vbscript:` protocol.\n * Used by `bindAttr` to guard URL-bearing attributes.\n */\nexport function isDangerousUrl(attrName: string, value: string): boolean {\n if (!URL_ATTRS.has(attrName.toLowerCase())) return false;\n return DANGEROUS_PROTOCOL_RE.test(value);\n}\n\n/**\n * Returns `true` when a CSS property value contains a dangerous protocol\n * inside a `url()` function (e.g. `background-image: url(\"javascript:…\")`).\n */\nexport function isDangerousCssValue(value: string): boolean {\n // Fast pre-check before running the full regex\n if (!value.toLowerCase().includes('url(')) return false;\n return DANGEROUS_CSS_URL_RE.test(value);\n}\n\n// ============================================================================\n// Route type guards\n// ============================================================================\n\n/** Narrows a `RouteDefinition` to `TemplateRoute`. */\nexport function isTemplateRoute(r: RouteDefinition): r is TemplateRoute {\n return typeof (r as TemplateRoute).template === 'string';\n}\n\n/** Narrows a `RouteDefinition` to `RenderRoute`. */\nexport function isRenderRoute(r: RouteDefinition): r is RenderRoute {\n return typeof (r as RenderRoute).render === 'function';\n}\n\n// ============================================================================\n// General utilities\n// ============================================================================\n\n/**\n * Shallow equality check for plain objects.\n * Returns `true` if both objects have the same own keys with identical (`===`) values.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null || typeof a !== 'object' || typeof b !== 'object') return false;\n\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i]!;\n if (!hasOwn.call(objB, key) || objA[key] !== objB[key]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Computes the Longest Increasing Subsequence (LIS) of old-position indices.\n *\n * Used by `atomList` to minimise DOM moves during reconciliation: items whose\n * old-position index appears in the LIS are already in the correct relative\n * order and do not need to be moved.\n *\n * Sentinel value: `-1` means \"not present in the old list\" and is skipped.\n *\n * Time complexity: O(N log N). Space complexity: O(N).\n */\nexport function getLIS(arr: Int32Array | number[]): Int32Array {\n const len = arr.length;\n if (len === 0) return new Int32Array(0);\n\n // predecessors[i] records the index in `arr` that preceded i in the LIS,\n // or -1 if i was the first element. Initialised to -1 so unvisited slots\n // are distinguishable from a valid predecessor at index 0.\n const predecessors = new Int32Array(len).fill(-1);\n const result = new Int32Array(len);\n let resultLen = 0;\n\n for (let i = 0; i < len; i++) {\n const val = arr[i];\n // `undefined` can only occur for a plain `number[]` under noUncheckedIndexedAccess;\n // Int32Array always returns a number. Both cases are treated as absent.\n if (val === undefined || val === -1) continue;\n\n const lastIdx = resultLen > 0 ? result[resultLen - 1] : undefined;\n if (resultLen === 0 || (lastIdx !== undefined && (arr[lastIdx] ?? -1) < val)) {\n predecessors[i] = lastIdx ?? -1;\n result[resultLen++] = i;\n continue;\n }\n\n // Binary search for the leftmost result position whose value >= val\n let left = 0;\n let right = resultLen - 1;\n while (left < right) {\n const mid = (left + right) >>> 1;\n const midIdx = result[mid];\n if (midIdx !== undefined && (arr[midIdx] ?? -1) < val) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n\n const leftIdx = result[left];\n if (leftIdx !== undefined && val < (arr[leftIdx] ?? Number.MAX_SAFE_INTEGER)) {\n if (left > 0) {\n predecessors[i] = result[left - 1] ?? -1;\n }\n result[left] = i;\n }\n }\n\n // Back-track through predecessors to reconstruct the LIS indices.\n const lis = new Int32Array(resultLen);\n if (resultLen > 0) {\n let curr: number | undefined = result[resultLen - 1];\n for (let i = resultLen - 1; i >= 0 && curr !== undefined && curr !== -1; i--) {\n lis[i] = curr;\n curr = predecessors[curr];\n }\n }\n\n return lis;\n}\n","/**\n * Debug Mode\n *\n * When $.atom.debug = true is enabled:\n * 1. Logs state changes to the console.\n * 2. Visually highlights DOM updates (red border flash).\n *\n * Debug mode can be enabled in two ways:\n * 1. Build-time: VITE_ATOM_DEBUG=true (opt-in via env var)\n * 2. Runtime: $.atom.debug = true or window.__ATOM_DEBUG__ = true\n *\n * NOTE: debug mode is NOT enabled automatically in DEV builds to avoid\n * polluting the console without explicit opt-in.\n */\n\nimport { LOG_PREFIXES } from './constants';\nimport { getSelector } from './utils';\n\n// ============================================================================\n// Timing constants — HIGHLIGHT_TRANSITION is derived from HIGHLIGHT_DURATION_MS\n// so the two values stay in sync automatically.\n// ============================================================================\n\n/** Duration (ms) of the highlight flash animation. */\nconst HIGHLIGHT_DURATION_MS = 600;\n\n/** CSS transition duration derived from HIGHLIGHT_DURATION_MS. */\nconst HIGHLIGHT_TRANSITION = `${HIGHLIGHT_DURATION_MS / 1000}s`;\n\n// ============================================================================\n// Initial state\n// ============================================================================\n\n/**\n * Determines the initial debug state.\n * Priority: window.__ATOM_DEBUG__ > explicit VITE_ATOM_DEBUG env var.\n * DEV mode alone does NOT enable debug to avoid silent console pollution.\n */\nfunction getInitialDebugState(): boolean {\n if (typeof window !== 'undefined') {\n const flag = (window as Window & { __ATOM_DEBUG__?: boolean }).__ATOM_DEBUG__;\n if (typeof flag === 'boolean') return flag;\n }\n\n // Vite inlines import.meta.env at build time; guard for non-Vite environments\n // (e.g. Jest/Node) where import.meta.env may be undefined.\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') {\n return true;\n }\n\n return false;\n}\n\nlet debugEnabled = getInitialDebugState();\n\n// ============================================================================\n// Debug object\n// ============================================================================\n\nexport const debug = {\n get enabled() {\n return debugEnabled;\n },\n set enabled(value: boolean) {\n debugEnabled = value;\n },\n\n /**\n * Logs a message only when debug mode is active.\n */\n log(type: string, ...args: unknown[]) {\n if (debugEnabled) {\n console.log(`${LOG_PREFIXES.MOUNT} ${type}:`, ...args);\n }\n },\n\n /**\n * Logs an atom value change only when debug mode is active.\n */\n atomChanged(name: string | undefined, oldVal: unknown, newVal: unknown) {\n if (debugEnabled) {\n console.log(\n `${LOG_PREFIXES.MOUNT} Atom \"${name ?? 'anonymous'}\" changed:`,\n oldVal,\n '→',\n newVal\n );\n }\n },\n\n /**\n * Logs a DOM update and triggers a visual highlight flash.\n * Only active when debug mode is enabled.\n *\n * @param target - The element or jQuery wrapper that was updated.\n * @param type - The binding type (e.g. 'text', 'checked', 'attr.href').\n * @param value - The new value that was applied.\n */\n domUpdated(target: Element | JQuery, type: string, value: unknown) {\n if (!debugEnabled) return;\n\n const el: Element | undefined =\n target instanceof Element ? target : (target[0] as Element | undefined);\n if (!(el instanceof HTMLElement)) return;\n\n console.log(`${LOG_PREFIXES.MOUNT} DOM updated: ${getSelector(el)}.${type} =`, value);\n highlightElement(el);\n },\n\n /**\n * Logs a cleanup event only when debug mode is active.\n */\n cleanup(selector: string) {\n if (debugEnabled) {\n console.log(`${LOG_PREFIXES.MOUNT} Cleanup: ${selector}`);\n }\n },\n\n /**\n * Unconditional warning for runtime errors and unexpected states.\n * Not gated by debugEnabled — these are always surfaced regardless of\n * debug mode because they indicate real problems (e.g. dispose failures,\n * missing route targets, pushState security errors).\n *\n * `prefix` is the subsystem tag (e.g. `LOG_PREFIXES.ROUTE`) so that the\n * originating subsystem appears in the log rather than the generic MOUNT tag.\n * Pass an empty string to emit a prefix-free message.\n */\n warn(prefix: string, message: string, ...rest: unknown[]) {\n console.warn(`${prefix} ${message}`, ...rest);\n },\n\n /**\n * Unconditional error for binding failures.\n * Not gated by debugEnabled — binding errors are always surfaced because\n * they indicate a broken updater that silently stopped applying values.\n */\n error(prefix: string, message: string, cause: unknown) {\n console.error(`${prefix} ${message}`, cause);\n },\n};\n\n// ============================================================================\n// Visual highlight\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nconst HIGHLIGHT_STYLE_ATTR = 'data-atom-debug';\n\n/**\n * Injects the highlight CSS once per document lifetime.\n * Uses a WeakRef so that JSDOM test resets naturally invalidate the cache:\n * when the old document is GC'd the WeakRef deref returns undefined and\n * the style is re-injected into the fresh document — no module-level boolean\n * flag needed.\n */\nlet _highlightStyleRef: WeakRef<HTMLStyleElement> | undefined;\nfunction injectHighlightStyle(): void {\n if (_highlightStyleRef?.deref()?.isConnected) return;\n const style = document.createElement('style');\n style.setAttribute(HIGHLIGHT_STYLE_ATTR, '');\n style.textContent =\n `.${HIGHLIGHT_CLASS}{` +\n `outline:2px solid rgba(255,68,68,0.8);` +\n `outline-offset:1px;` +\n `transition:outline ${HIGHLIGHT_TRANSITION} ease-out` +\n `}`;\n document.head.appendChild(style);\n _highlightStyleRef = new WeakRef(style);\n}\n\n// Tracks the pending setTimeout handle per element.\n// Stored outside rAF so that rapid successive calls can cancel a previously\n// scheduled timer even before the rAF callback has fired.\nconst highlightTimers = new WeakMap<HTMLElement, ReturnType<typeof setTimeout>>();\n\n// Tracks pending rAF IDs so that a second call before the first rAF fires\n// can cancel it, preventing duplicate classList.add calls.\nconst highlightRafs = new WeakMap<HTMLElement, ReturnType<typeof requestAnimationFrame>>();\n\n/**\n * Flashes a red outline on an element to indicate a reactive DOM update.\n * Accepts only HTMLElement — callers are responsible for unwrapping JQuery.\n *\n * Handles rapid successive calls correctly:\n * - Cancels any pending rAF before scheduling a new one.\n * - Cancels any pending timeout before scheduling a new one.\n */\nfunction highlightElement(el: HTMLElement): void {\n if (!el.isConnected) return;\n\n injectHighlightStyle();\n\n // Cancel pending rAF to avoid duplicate classList.add.\n // .set() below overwrites the entry, so .delete() here is not needed.\n const existingRaf = highlightRafs.get(el);\n if (existingRaf !== undefined) {\n cancelAnimationFrame(existingRaf);\n }\n\n // Cancel pending timeout so the class is not prematurely removed.\n // .set() in the rAF callback overwrites the entry, so .delete() here is not needed.\n const existingTimer = highlightTimers.get(el);\n if (existingTimer !== undefined) {\n clearTimeout(existingTimer);\n }\n\n const rafId = requestAnimationFrame(() => {\n highlightRafs.delete(el);\n el.classList.add(HIGHLIGHT_CLASS);\n\n highlightTimers.set(\n el,\n setTimeout(() => {\n el.classList.remove(HIGHLIGHT_CLASS);\n highlightTimers.delete(el);\n }, HIGHLIGHT_DURATION_MS)\n );\n });\n\n highlightRafs.set(el, rafId);\n}\n","import {\n batch,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { debug } from './debug';\nimport type { AtomOptions, WritableAtom } from './types';\n// isReactive is defined in utils.ts because core's isAtom already covers computed\n// atoms (ComputedAtom carries ATOM_BRAND), making a separate isComputed check redundant.\nimport { isReactive } from './utils';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Wraps core's `atom` factory to attach the `$.atom.debug` property.\n *\n * A locally-owned function object is required so that `Object.defineProperty`\n * can add a getter/setter accessor — imported function references cannot be\n * mutated this way. The `debug` accessor is attached below via\n * `Object.defineProperty`; `staticExtensions` then registers both on `$`.\n *\n * `options` is not defaulted here — core's `atom` defaults `options` to `{}`\n * internally, so passing `undefined` is safe and avoids an extra allocation\n * per call.\n */\nfunction atom<T>(initialValue: T, options?: AtomOptions): WritableAtom<T> {\n return createAtom(initialValue, options);\n}\n\n// `atom as unknown as JQueryStatic['atom']` in staticExtensions is required\n// because TypeScript cannot see the runtime-added `debug` accessor through the\n// function's declared type. The `NamespaceExtensions` annotation on\n// `staticExtensions` still verifies that every other field is correctly typed.\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n // configurable: true allows tests and advanced consumers to redefine or\n // delete the accessor if needed. The default (false) would permanently lock\n // the property on the function object.\n configurable: true,\n get(): boolean {\n return debug.enabled;\n },\n set(value: boolean) {\n debug.enabled = value;\n },\n});\n\n// ============================================================================\n// nextTick\n// ============================================================================\n\n/**\n * Resolves after all pending microtask-scheduled reactive effects have flushed.\n *\n * Implementation uses `setTimeout(0)` (a macrotask) which always runs after\n * the current microtask queue is drained. This is intentional: core's\n * scheduler enqueues effects as microtasks, so by the time the macrotask\n * fires, all pending reactive propagation for the current turn is complete.\n *\n * Note: browsers may enforce a minimum 4 ms delay for nested `setTimeout`\n * calls. For unit tests this is typically not an issue. If sub-millisecond\n * resolution is needed, use `Promise.resolve()` directly to wait for a single\n * microtask tick instead.\n *\n * **Caveats**: A single `await nextTick()` covers one reactive propagation\n * wave. Chains of computed → effect → atom → effect may require multiple\n * awaits — one per propagation step.\n */\nexport function nextTick(): Promise<void> {\n return new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n\n// ============================================================================\n// Static extension registration\n// ============================================================================\n\n/**\n * The subset of `JQueryStatic` that this module registers.\n *\n * Typed as `Pick<JQueryStatic, ...>` so that the compiler verifies:\n * 1. Every key listed here actually exists on `JQueryStatic`.\n * 2. Every value's type is assignable to the declared `JQueryStatic` member.\n *\n * Adding or removing a key in either `JQueryStatic` or this object without\n * updating the other produces a compile-time error.\n *\n * Exception: `nextTick` originates in this file (not imported from core), so\n * its source of truth is the `export function nextTick` declaration above —\n * `JQueryStatic['nextTick']` is verified against that signature, not the other\n * way around.\n *\n * Note: `$.extend(staticExtensions)` merges the fields into `$` at runtime.\n * TypeScript does not model this mutation on the `$` type — the augmented\n * types are declared separately via global interface merging in `types.ts`.\n */\ntype NamespaceExtensions = Pick<\n JQueryStatic,\n | 'atom'\n | 'computed'\n | 'effect'\n | 'batch'\n | 'untracked'\n | 'isAtom'\n | 'isComputed'\n | 'isReactive'\n | 'nextTick'\n>;\n\nconst staticExtensions: NamespaceExtensions = {\n // `atom` carries a runtime `debug` accessor added via Object.defineProperty.\n // TypeScript cannot see it through the declared function type, so the double\n // cast is unavoidable. The NamespaceExtensions annotation still verifies all\n // other fields; only `atom`'s shape escapes static checking here.\n atom: atom as unknown as JQueryStatic['atom'],\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n isReactive,\n nextTick,\n};\n\n// $.extend(obj) merges into JQueryStatic (i.e. the $ function itself).\n// Use $.fn.extend(obj) instead to add instance methods on jQuery collections.\n$.extend(staticExtensions);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport type { EffectObject } from './types';\nimport { getSelector } from './utils';\n\n/**\n * CSS class added to every element that has at least one active binding.\n * Used by `querySelectorAll` in `cleanupDescendants` for efficient subtree traversal.\n * Internal use only.\n */\nconst AES_BOUND = '_aes-bound';\n\n/**\n * Per-element record of all reactive resources that must be released on cleanup.\n * Fields are optional to avoid allocating arrays for the common case where only\n * one resource type is used.\n */\ninterface BindingRecord {\n effects?: EffectObject[] | undefined;\n cleanups?: Array<() => void> | undefined;\n componentCleanup?: (() => void) | undefined;\n}\n\n// ============================================================================\n// BindingRegistry\n// ============================================================================\n\n/**\n * Central registry mapping DOM elements to their reactive binding records.\n *\n * Design goals:\n * - Zero memory leaks: all collections use WeakMap/WeakSet keyed by Element.\n * - Minimal allocations in the hot tracking path.\n * - O(bound-descendants) cleanup via a single querySelectorAll pass.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n\n // boundElements removed: records is now the Single Source of Truth.\n // WeakMap.has() provides the existence check.\n\n private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n // --------------------------------------------------------------------------\n // Lifecycle flags\n // --------------------------------------------------------------------------\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n // --------------------------------------------------------------------------\n // Tracking\n // --------------------------------------------------------------------------\n\n private getOrCreateRecord(el: Element): BindingRecord {\n let res = this.records.get(el);\n if (!res) {\n res = {};\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n record.effects ??= [];\n record.effects.push(fx);\n }\n\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n record.cleanups ??= [];\n record.cleanups.push(fn);\n }\n\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n const record = this.getOrCreateRecord(el);\n record.componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n // --------------------------------------------------------------------------\n // Cleanup\n // --------------------------------------------------------------------------\n\n cleanup(el: Element): void {\n // Optimization: Single lookup + delete.\n const record = this.records.get(el);\n if (!record) {\n // Already cleaned up or never bound.\n // Ensure specific class is removed just in case of stale DOM state.\n if (el.isConnected) el.classList.remove(AES_BOUND);\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n return;\n }\n\n // Atomic deletion doubles as a re-entry guard.\n this.records.delete(el);\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n // Avoid a classList write for elements that are already leaving the DOM —\n // the browser will discard the class along with the node.\n if (el.isConnected) {\n el.classList.remove(AES_BOUND);\n }\n\n if (debug.enabled) {\n debug.cleanup(getSelector(el));\n }\n\n // Step 0 — Component cleanup runs first so the component can unmount\n // gracefully before its reactive effects are severed.\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT_CLEANUP_ERROR(), e);\n }\n }\n\n // Step 1 — Sever atom → effect subscriptions.\n record.effects?.forEach((fx) => {\n try {\n fx.dispose();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.EFFECT_DISPOSE_ERROR(), e);\n }\n });\n\n // Step 2 — Run general-purpose cleanup callbacks.\n record.cleanups?.forEach((fn) => {\n try {\n fn();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING_CLEANUP_ERROR(), e);\n }\n });\n }\n\n cleanupDescendants(el: Element): void {\n // querySelectorAll returns a static NodeList, which is safe to iterate\n // even though cleanup() triggers DOM changes.\n // Iterating with for...of avoids index-access type checking issues.\n const descendants = el.querySelectorAll(`.${AES_BOUND}`);\n for (const child of descendants) {\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n // The AES_BOUND class is present but the registry has no record.\n // Remove the stale class and warn so it surfaces in debug mode.\n child.classList.remove(AES_BOUND);\n debug.warn(\n LOG_PREFIXES.BINDING,\n `${AES_BOUND} class found on unregistered element:`,\n child\n );\n }\n }\n }\n\n cleanupTree(el: Element): void {\n this.cleanupDescendants(el);\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nlet observer: MutationObserver | null = null;\nlet observedRoot: Element | null = null;\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * The `root` parameter is required (no default) to make the caller explicit\n * about which subtree is being observed — `document.body` can be null if the\n * script runs before the body is parsed.\n *\n * Idempotent: calling more than once with the same root before\n * `disableAutoCleanup` has no effect. Calling with a different root while\n * already active emits a warning and returns without re-observing.\n */\nexport function enableAutoCleanup(root: Element): void {\n if (observer !== null) {\n if (observedRoot !== root) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n 'enableAutoCleanup() called with a different root while already active. Observation was NOT switched — call disableAutoCleanup() first.',\n { current: observedRoot, requested: root }\n );\n }\n return;\n }\n\n observedRoot = root;\n observer = new MutationObserver((mutations) => {\n // Optimization: use for...of for iteration speed.\n for (const mutation of mutations) {\n // removedNodes is a NodeList, which is iterable in modern environments.\n // If legacy browser support is needed, a C-style loop over .length might be required.\n // Assuming ES6+ target (based on WeekMap usage).\n for (const node of mutation.removedNodes) {\n // Only Element nodes can carry AES_BOUND bindings.\n // 1 === Node.ELEMENT_NODE\n if (node.nodeType !== 1) continue;\n\n // isConnected handles the move case.\n // isKept handles explicit .detach().\n // isIgnored handles .remove().\n if (node.isConnected || registry.isKept(node) || registry.isIgnored(node)) {\n continue;\n }\n\n registry.cleanupTree(node as Element);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n}\n\n/**\n * Stops the MutationObserver started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observer?.disconnect();\n observer = null;\n observedRoot = null;\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ReactiveValue } from './types';\nimport { isReactive } from './utils';\n\n// ============================================================================\n// Debug type\n// ============================================================================\n\n/**\n * Structured label identifying which binding produced a debug log entry.\n * Fixed bindings use a plain literal; per-key bindings use a `prefix.key` form\n * where the key portion must be non-empty.\n */\nexport type BindingDebugType =\n | 'text'\n | 'html'\n | 'show'\n | 'hide'\n | 'checked'\n | `class.${string & {}}`\n | `css.${string & {}}`\n | `attr.${string & {}}`\n | `prop.${string & {}}`\n | (string & {});\n\n// ============================================================================\n// Core factory\n// ============================================================================\n\n/**\n * Registers a reactive effect that calls `updater` whenever `source` changes,\n * or calls `updater` once immediately if `source` is a static value.\n *\n * Responsibilities:\n * - Reactive path: wraps `updater` in an `effect`, tracks it on the registry.\n * - Static path: applies the value once; no effect is registered.\n * - Debug path: logs both the static initial bind and reactive updates via\n * `debug.domUpdated` so that all DOM writes appear in a uniform format.\n * - Error path: catches `updater` exceptions and surfaces them via `console.error`\n * so that a broken binding does not silently kill the effect loop.\n * Both the reactive and static paths are guarded consistently.\n *\n * @param el DOM element to associate the effect with.\n * @param source Reactive or static value source.\n * @param updater Function that writes the value to the DOM.\n * @param debugType Structured label used in debug log output.\n */\nexport function registerReactiveEffect<T>(\n el: HTMLElement,\n source: ReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n if (isReactive(source)) {\n const reactiveSource = source as ReadonlyAtom<T>;\n registry.trackEffect(\n el,\n effect(() => {\n // Read the source value inside the tracking context — this is the\n // ONLY dependency this effect should subscribe to.\n const value = reactiveSource.value;\n\n // Run the updater untracked so that any atom reads inside updater\n // (user formatters, guards, computed lookups) cannot accidentally\n // add extra subscriptions to this effect.\n untracked(() => {\n try {\n updater(value);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, `${ERROR_MESSAGES.UPDATER_ERROR(debugType)}:`, e);\n return;\n }\n // debug.domUpdated already guards on debug.enabled internally, but\n // skipping the call entirely avoids a function-call overhead on every\n // atom update in production (debug disabled).\n if (debug.enabled) debug.domUpdated(el, debugType, value);\n });\n })\n );\n } else {\n // Static value: apply once with the same error surface as the reactive path.\n try {\n updater(source);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, `${ERROR_MESSAGES.UPDATER_ERROR(debugType)} (static):`, e);\n return;\n }\n if (debug.enabled) debug.domUpdated(el, debugType, source);\n }\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from './registry';\n\n/** Generic event handler type matching jQuery's internal handler signature. */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/**\n * Symbol marker attached to handlers registered by this library's internals.\n * Handlers carrying this marker are NOT wrapped in batch() — they already\n * manage atom writes directly and do not need an extra reactive flush.\n */\nexport const INTERNAL_HANDLER = Symbol('atom-effect-internal');\n\n/**\n * WeakMap from original handler function → batch-wrapped handler function.\n * Keys are functions (held alive by jQuery's internal event store for as long\n * as the handler is registered), so entries are naturally released when the\n * handler is removed via .off() and jQuery drops its reference.\n */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n * Stored as a typed object so the override closures can reference the fields\n * directly without `!` non-null assertions.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n off: typeof $.fn.off;\n remove: typeof $.fn.remove;\n empty: typeof $.fn.empty;\n detach: typeof $.fn.detach;\n};\n\nlet originals: OriginalMethods | null = null;\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n // Skip wrapping for library-internal handlers.\n if ((fn as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER]) return fn;\n\n let wrapped = handlerMap.get(fn);\n if (!wrapped) {\n // `function` (not arrow) to preserve the jQuery-provided `this` context.\n // Double cast via `unknown` is required because the rest-args signature\n // `(...args: unknown[])` is not directly assignable to `EventHandler`.\n wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as EventHandler;\n // Mark the wrapper itself as internal so it isn't double-wrapped if passed again.\n (wrapped as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\n/**\n * Wraps the handlers in an event-map object with `getWrappedHandler`.\n * Uses Object.keys to iterate own properties only, avoiding inherited keys.\n */\nfunction wrapEventMap(map: Record<string, EventHandler>): Record<string, EventHandler> {\n const newMap: Record<string, EventHandler> = {};\n Object.keys(map).forEach((key) => {\n const handler = map[key];\n if (handler) newMap[key] = getWrappedHandler(handler);\n });\n return newMap;\n}\n\n/**\n * Resolves the wrapped counterpart for each handler in an off event-map.\n * Preserves `undefined` values — `.off({ click: undefined })` is a valid\n * jQuery call that removes ALL listeners for that event.\n * Uses Object.keys to iterate own properties only, avoiding inherited keys.\n */\nfunction resolveOffEventMap(\n map: Record<string, EventHandler | undefined>\n): Record<string, EventHandler | undefined> {\n const newMap: Record<string, EventHandler | undefined> = {};\n Object.keys(map).forEach((key) => {\n const handler = map[key];\n newMap[key] = handler ? (handlerMap.get(handler) ?? handler) : undefined;\n });\n return newMap;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * Patches jQuery's `.on()`, `.off()`, `.remove()`, `.empty()`, and `.detach()`\n * to integrate with the reactive system:\n * - Event handlers are wrapped in `batch()` for efficient atom flushing.\n * - DOM removal triggers reactive binding cleanup.\n * - `.detach()` preserves bindings for re-attachment.\n *\n * Idempotent — calling more than once has no effect.\n * Call `disablejQueryOverrides()` to restore original methods.\n */\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n\n const orig = originals;\n\n // --- Lifecycle overrides ---\n\n // .remove() — clean up bindings on the matching elements, then delegate.\n // Only elements matched by `selector` (or all elements when selector is\n // omitted) are cleaned up — other elements in `this` are not affected,\n // mirroring jQuery's own selector-scoped remove behaviour.\n // markIgnored is called BEFORE cleanupTree so that a MutationObserver\n // callback firing synchronously sees the ignored flag and skips redundant cleanup.\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) {\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n return orig.remove.call(this, selector);\n };\n\n // .empty() — recursively clean up descendants, then delegate.\n $.fn.empty = function (this: JQuery) {\n for (let i = 0, len = this.length; i < len; i++) {\n const el = this[i];\n if (el) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this);\n };\n\n // .detach() — mark elements as kept so the MutationObserver does not\n // dispose their bindings while they are temporarily out of the DOM.\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n for (let i = 0, len = targets.length; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector);\n };\n\n // --- Event overrides ---\n\n // .on() — wrap the handler argument in batch().\n //\n // jQuery's full signature is: .on(events, selector?, data?, handler)\n // When the first arg is an object it is an event-map; otherwise the handler\n // is always the LAST argument (position 1, 2, or 3 depending on overload).\n // Iterating from the end and stopping at the first function is therefore\n // correct for the positional form, because `data` is never a function in\n // jQuery's documented API.\n // `...args: unknown[]` is used instead of jQuery's overloaded signature\n // because TypeScript cannot unify the 4+ overloads into a single rest type.\n // The casts at args[0] and the apply call site are therefore unavoidable.\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n args[0] = wrapEventMap(types as Record<string, EventHandler>);\n } else {\n for (let i = args.length - 1; i >= 0; i--) {\n if (typeof args[i] === 'function') {\n args[i] = getWrappedHandler(args[i] as EventHandler);\n break;\n }\n }\n }\n\n return orig.on.apply(this, args as Parameters<typeof $.fn.on>);\n };\n\n // .off() — resolve the original handler back to its wrapped counterpart so\n // jQuery can find and remove the correct internal listener.\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n const types = args[0];\n\n if (types && typeof types === 'object') {\n args[0] = resolveOffEventMap(types as Record<string, EventHandler | undefined>);\n } else {\n for (let i = args.length - 1; i >= 0; i--) {\n if (typeof args[i] === 'function') {\n const fn = args[i] as EventHandler;\n args[i] = handlerMap.get(fn) ?? fn;\n break;\n }\n }\n }\n\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>);\n };\n}\n\n/**\n * Restores all jQuery methods patched by `enablejQueryOverrides()`.\n * Primarily useful in test environments to reset state between suites.\n */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.off = originals.off;\n $.fn.remove = originals.remove;\n $.fn.empty = originals.empty;\n $.fn.detach = originals.detach;\n\n originals = null;\n}\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n EffectObject,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n/**\n * Cleanup function returned by effects or components.\n */\nexport type EffectCleanup = () => void;\n\n/**\n * Result of a reactive factory or component mount.\n */\nexport type EffectResult = undefined | EffectCleanup;\n\n/**\n * Generic equality predicate shared by `ValOptions` and any future consumer.\n * Extracted as a named type to avoid duplicating the inline function signature.\n */\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\n/**\n * Extended options for Atom creation.\n */\nexport interface AtomOptions extends BaseAtomOptions {\n /** Name for debugging purposes */\n name?: string;\n}\n\n/**\n * Represents a value that can be either a reactive node (Atom or Computed)\n * or a plain static value of the same type.\n *\n * `ComputedAtom<T>` is a structural sub-type of `ReadonlyAtom<T>`, so it is\n * already covered by `ReadonlyAtom<T>` — listing it separately would be\n * redundant and misleading.\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T>;\n\n/**\n * Values allowed for DOM properties and attributes.\n */\nexport type PrimitiveValue = string | number | boolean | null | undefined;\n\n/**\n * CSS value: either a direct reactive value or a numeric tuple of [source, unit].\n *\n * The tuple form `[source, unit]` only accepts numeric sources because appending\n * a unit suffix to a string value (e.g. `\"100%\" + \"px\"`) is semantically\n * meaningless. Use `ReactiveValue<string>` directly when the full CSS value is\n * already a string (e.g. `fontFamilyAtom`).\n */\nexport type CssValue =\n | ReactiveValue<string | number>\n | [source: ReactiveValue<number>, unit: string];\n\n/**\n * CSS bindings map property names to CSS values.\n */\nexport type CssBindings = Record<string, CssValue>;\n\n/**\n * Configuration options for `atomBind`.\n */\nexport interface BindingOptions {\n /** Binds textContent to any reactive source (usually string/number). */\n text?: ReactiveValue<unknown>;\n /** Binds innerHTML to a reactive string source (sanitized). */\n html?: ReactiveValue<string>;\n /** Map of class names to reactive boolean conditions. */\n class?: Record<string, ReactiveValue<boolean>>;\n /** Map of CSS properties to reactive values or [value, unit] tuples. */\n css?: CssBindings;\n /** Binds attributes with consistent primitive constraints. */\n attr?: Record<string, ReactiveValue<PrimitiveValue>>;\n /** Binds DOM properties. */\n prop?: Record<string, ReactiveValue<unknown>>;\n /** Direct visibility control (display: none). */\n show?: ReactiveValue<boolean>;\n /** Inverse visibility control. */\n hide?: ReactiveValue<boolean>;\n /**\n * Two-way binding for input values.\n * Pass a bare atom or a `[atom, options]` tuple to customise parse/format/debounce.\n */\n val?: WritableAtom<unknown> | [atom: WritableAtom<unknown>, options: ValOptions<unknown>];\n /** Two-way binding for checkboxes and radio buttons. */\n checked?: WritableAtom<boolean>;\n /** Event listeners with automatic batched execution and lifecycle-bound cleanup. */\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\n/**\n * Configuration options for `atomList`.\n */\nexport interface ListOptions<T> {\n /** Key to track items (property name or extractor function). */\n key: keyof T | ((item: T, index: number) => string | number);\n /** Render function for each item. */\n render: (item: T, index: number) => string | Element | DocumentFragment | JQuery;\n /** Optional post-render binding logic. */\n bind?: ($el: JQuery, item: T, index: number) => void;\n /** Optional update logic when item data changes but DOM is reused. */\n update?: ($el: JQuery, item: T, index: number) => void;\n /** Lifecycle hook: called when an element is added to the list. */\n onAdd?: ($el: JQuery) => void;\n /** Lifecycle hook: called when an element is about to be removed. Supports async transitions. */\n onRemove?: ($el: JQuery) => Promise<void> | void;\n /** Content to show when the list is empty. */\n empty?: string | Element | DocumentFragment | JQuery;\n}\n\n/**\n * Configuration options for `atomVal`.\n */\nexport interface ValOptions<T> {\n /** Delay in milliseconds before syncing DOM input to Atom. */\n debounce?: number;\n /** DOM event to trigger sync (default: 'input'). */\n event?: string;\n /** Parser to convert string input to Atom type T. */\n parse?: (v: string) => T;\n /** Formatter to convert Atom type T to string for DOM display. */\n format?: (v: T) => string;\n /** Custom equality check for comparing parsed values. Defaults to Object.is. */\n equal?: EqualFn<T>;\n}\n\n/**\n * Configuration options for `atomFetch`.\n */\nexport interface FetchOptions<T> {\n /**\n * Value exposed by the atom before the first fetch resolves.\n * Also returned while a subsequent fetch is in flight.\n */\n defaultValue: T;\n /**\n * HTTP method forwarded to `$.ajax` (default: `'GET'`).\n * Takes precedence over the same field in `ajaxOptions`.\n * Accepts any string for non-standard methods; common values are\n * auto-completed: `'GET'`, `'POST'`, `'PUT'`, `'PATCH'`, `'DELETE'`.\n */\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n /**\n * HTTP headers forwarded to `$.ajax`.\n * Takes precedence over the same field in `ajaxOptions`.\n */\n headers?: Record<string, string>;\n /**\n * Transforms the raw `$.ajax` response into `T`.\n *\n * When omitted the raw response is cast to `T` with no runtime validation.\n * Provide this function whenever the server response shape is not\n * guaranteed to match `T` at runtime.\n */\n transform?: (raw: unknown) => T;\n /**\n * Additional `$.ajax` settings.\n * Top-level fields (`url`, `method`, `headers`) always override the same\n * fields here, so avoid duplicating them to prevent silent conflicts.\n */\n ajaxOptions?: JQuery.AjaxSettings;\n /**\n * Called when the fetch fails with a non-abort error.\n * Receives the raw rejection value from `$.ajax`.\n * Does not suppress the error — the computed atom still enters its error\n * state and `hasError` becomes true.\n */\n onError?: (err: unknown) => void;\n /**\n * When `true` (default), the first fetch starts immediately on creation.\n * When `false`, the fetch is deferred until `atom.value` is first accessed.\n */\n eager?: boolean;\n}\n\n// ============================================================================\n// Input binding internals\n// Consumed only by input-binding.ts. Centralised here so enum definitions live\n// alongside their sibling types, but marked @internal — not part of the public\n// API surface and subject to change without notice.\n// ============================================================================\n\n/**\n * Bit flags for input binding state management.\n *\n * DESIGN RATIONALE:\n * - Mutually exclusive phases (SyncingTo*) and orthogonal states (Focused, Composing)\n * are packed into a single integer for O(1) state checks.\n * - 'Busy' mask is used as a Re-entrancy Guard to prevent infinite sync loops\n * between DOM events and Atom updates.\n *\n * @internal\n */\nexport enum BindingFlags {\n None = 0,\n /** Element is currently focused by the user. Prevents abrupt external updates from interrupting typing. */\n Focused = 1 << 0,\n /** User is typing via IME (Korean, Chinese, Japanese). Sync is deferred until composition completion. */\n Composing = 1 << 1,\n /** Internal: DOM -> Atom synchronization in progress. Prevents echo effects. */\n SyncingToAtom = 1 << 2,\n /** Internal: Atom -> DOM synchronization in progress. Prevents echo effects. */\n SyncingToDom = 1 << 3,\n /** Combined mask for any active processing phase (excluding simple focus). */\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\n/**\n * Functional Component type.\n * A function that initializes logic on a jQuery element and returns an optional cleanup function.\n * `P` defaults to `object` (empty props) — use `P = Record<string, never>` for strictly no-props\n * components.\n */\nexport type ComponentFn<P = object> = ($el: JQuery, props: P) => EffectResult;\n\n// ============================================================================\n// jQuery global interface augmentation\n// Extends JQueryStatic and JQuery with atom-effect plugin methods.\n// Importing this file applies these augmentations as a side effect.\n// ============================================================================\n\ndeclare global {\n interface JQueryStatic {\n /**\n * Reactive Atom Factory.\n * Also serves as a namespace for global configuration.\n */\n atom: {\n <T>(initialValue: T, options?: AtomOptions): WritableAtom<T>;\n /** Global debug toggle for logging and visual highlighting. */\n debug: boolean;\n };\n /** Sync computing primitive. */\n computed<T>(fn: () => T, options?: ComputedOptions<T>): ComputedAtom<T>;\n /** Async computing primitive with mandatory default value. */\n computed<T>(\n fn: () => Promise<T>,\n options: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n /** Side-effect primitive. Returns an object to control lifecycle. */\n effect(fn: () => EffectResult): EffectObject;\n /** Groups multiple updates into a single synchronous notification cycle. */\n batch(fn: () => void): void;\n /** Executes a function without establishing reactive dependencies. */\n untracked<T>(fn: () => T): T;\n /** Runtime check for Atom instances. */\n isAtom(v: unknown): boolean;\n /** Runtime check for ComputedAtom instances. */\n isComputed(v: unknown): boolean;\n /** Runtime check for any reactive node. */\n isReactive(v: unknown): boolean;\n /** Resolves after the next scheduler flush. */\n nextTick(): Promise<void>;\n /** Initializes the lightweight SPA router. */\n route(config: RouteConfig): Router;\n /** Declarative reactive AJAX primitive. */\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T>;\n }\n\n interface JQuery {\n /** Binds textContent to a reactive source. */\n atomText<T>(source: ReactiveValue<T>, formatter?: (v: T) => string): this;\n /** Binds innerHTML to a reactive source (sanitized). */\n atomHtml(source: ReactiveValue<string>): this;\n /** Toggles a single CSS class based on a reactive boolean. */\n atomClass(className: string, condition: ReactiveValue<boolean>): this;\n /** Toggles multiple CSS classes from a map of class names to reactive booleans. */\n atomClass(classMap: Record<string, ReactiveValue<boolean>>): this;\n /** Binds a single CSS property to a reactive value, with an optional unit suffix. */\n atomCss(prop: string, source: ReactiveValue<string | number>, unit?: string): this;\n /** Binds multiple CSS properties from a map of property names to reactive values. */\n atomCss(cssMap: CssBindings): this;\n /** Binds a single DOM attribute to a reactive value with security guards. */\n atomAttr(name: string, source: ReactiveValue<PrimitiveValue>): this;\n /** Binds multiple DOM attributes from a map of attribute names to reactive values. */\n atomAttr(attrMap: Record<string, ReactiveValue<PrimitiveValue>>): this;\n /** Binds a single DOM property to a reactive value. */\n atomProp<T>(name: string, source: ReactiveValue<T>): this;\n /** Binds multiple DOM properties from a map of property names to reactive values. */\n atomProp<T>(propMap: Record<string, ReactiveValue<T>>): this;\n /** Controls element visibility (display: none). */\n atomShow(condition: ReactiveValue<boolean>): this;\n /** Inverse of atomShow. */\n atomHide(condition: ReactiveValue<boolean>): this;\n /** Two-way binding for input values. */\n atomVal<T>(atom: WritableAtom<T>, options?: ValOptions<T>): this;\n /** Two-way binding for checkbox/radio checked state. */\n atomChecked(atom: WritableAtom<boolean>): this;\n /** Lifecycle-aware event listener. */\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n\n /** Integrated multi-behavior reactive binding. */\n atomBind(options: BindingOptions): this;\n\n /** Reactive list rendering with efficient LIS-based reconciliation. */\n atomList<T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): this;\n\n /** Mounts a functional component with automatic cleanup. */\n atomMount<P>(component: ComponentFn<P>, props?: P): this;\n /** Unmounts the component and its descendants. */\n atomUnmount(): this;\n\n /** Manually triggers cleanup of all reactive bindings on this element. */\n atomUnbind(): this;\n }\n}\n\n/**\n * Context passed to binding handlers for unified lifecycle management.\n *\n * @internal consumed only by unified.ts and its callers within this package.\n */\nexport interface BindingContext {\n /** The specific jQuery-wrapped element being bound. */\n readonly $el: JQuery;\n /** The raw DOM element. */\n readonly el: HTMLElement;\n /** Registers a cleanup function to be executed when the element is removed. */\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\n// ============================================================================\n// Route types\n// ============================================================================\n\n/**\n * Shared route lifecycle hooks available on every route definition.\n */\nexport interface RouteLifecycle {\n /**\n * Called when entering this route. May return additional params to merge\n * into the params object passed to `render` / `onMount`.\n */\n onEnter?: (params: Record<string, string>) => Record<string, string> | undefined;\n /**\n * Called when leaving this route.\n * Return `false` to block navigation; returning `void` (or nothing) allows it.\n */\n onLeave?: () => boolean | undefined;\n /** Called when the same route is re-activated with new query parameters. */\n onParamsChange?: (params: Record<string, string>) => void;\n}\n\n/**\n * Route that renders content by cloning a `<template>` element.\n */\nexport interface TemplateRoute extends RouteLifecycle {\n /** CSS selector for a `<template>` element (e.g., `'#tmpl-home'`). */\n template: string;\n render?: never;\n /** Called after template content is appended to the container. */\n onMount?: ($content: JQuery) => void;\n}\n\n/**\n * Route that renders content via a custom function.\n */\nexport interface RenderRoute extends RouteLifecycle {\n /** Custom render function providing full control over the container DOM. */\n render: (container: HTMLElement, route: string, params: Record<string, string>) => void;\n template?: never;\n}\n\n/**\n * Route definition for a single route.\n * Exactly one of `template` or `render` must be provided.\n *\n * Use `isTemplateRoute` / `isRenderRoute` from `utils.ts` for safe narrowing\n * instead of direct property access.\n */\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\n/**\n * Configuration for `$.route()`.\n */\nexport interface RouteConfig {\n /** CSS selector of the element into which route content is rendered. */\n target: string;\n /** Route name used when the URL has no explicit route segment. */\n default: string;\n /** Map of route names to their definitions. */\n routes: Record<string, RouteDefinition>;\n /**\n * Routing strategy. Default: `'hash'`.\n * - `'hash'` — reads/writes `location.hash` (`#routeName`).\n * - `'history'` — reads/writes `location.pathname` via `history.pushState`.\n */\n mode?: 'hash' | 'history';\n /**\n * Path prefix stripped from `location.pathname` in history mode.\n * A trailing slash is normalized away internally.\n * Has no effect in hash mode.\n */\n basePath?: string;\n /** Route name to render when the requested route is not found (404 fallback). */\n notFound?: string;\n /**\n * When `true`, clicks on `[data-route]` elements are intercepted and\n * handled via `navigate()` instead of triggering a full page load.\n * Default: `false`.\n */\n autoBindLinks?: boolean;\n /**\n * CSS class added to `[data-route]` links that match the current route.\n * Also sets `aria-current=\"page\"` on the active link.\n * Default: `'active'`.\n */\n activeClass?: string;\n /**\n * Called before each route transition.\n * `from` is `''` on the very first render (no previous route).\n */\n beforeTransition?: (from: string, to: string) => void;\n /**\n * Called after each route transition completes.\n * `from` is `''` on the very first render (no previous route).\n */\n afterTransition?: (from: string, to: string) => void;\n}\n\n/**\n * Router instance returned by `$.route()`.\n *\n * `currentRoute` and `queryParams` reflect the current URL state reactively:\n * - In `'hash'` mode, `queryParams` is parsed from the query string after `?`\n * in the hash fragment (e.g., `#home?page=2` → `{ page: '2' }`).\n * - In `'history'` mode, `queryParams` is parsed from `location.search`.\n */\nexport interface Router {\n /**\n * Reactive atom containing the current route name.\n * Read-only — use `navigate()` to change routes so that the URL stays in sync.\n */\n currentRoute: ReadonlyAtom<string>;\n /**\n * Reactive atom containing the current query parameters as a plain object.\n * Updated automatically on URL changes; reset to `{}` on programmatic navigation.\n */\n queryParams: ReadonlyAtom<Record<string, string>>;\n /** Navigate programmatically to the named route. */\n navigate: (route: string) => void;\n /** Destroy the router, removing all event listeners and reactive effects. */\n destroy: () => void;\n}\n\nexport type { WritableAtom, ReadonlyAtom, ComputedAtom, EffectObject, ComputedOptions };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { INTERNAL_HANDLER } from './jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from './types';\nimport { BindingFlags } from './types';\n\n// Monotonically increasing counter used to generate per-instance event\n// namespaces, preventing cleanup of sibling bindings on the same element.\nlet instanceCounter = 0;\n\ntype InputEl = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\nclass InputBinding<T> {\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly options: Required<ValOptions<T>>;\n\n private flags = 0;\n // undefined instead of null so clearTimeout(this.timeoutId) is always safe\n // without a null-check (clearTimeout(undefined) is a no-op per spec).\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns = `.atomBind-${++instanceCounter}`;\n\n // Initialized in constructor based on options.debounce decision.\n private readonly handleInput: () => void;\n\n constructor($el: JQuery, atom: WritableAtom<T>, options: ValOptions<T>) {\n this.$el = $el;\n this.el = $el[0] as InputEl;\n this.atom = atom;\n\n const debounce = options.debounce ?? 0;\n this.options = {\n debounce,\n event: options.event ?? INPUT_DEFAULTS.EVENT,\n parse: options.parse ?? ((v: string) => v as unknown as T),\n format: options.format ?? ((v: T) => String(v ?? '')),\n equal: options.equal ?? Object.is,\n };\n\n // Optimization: Pre-bind the appropriate input handler to avoid per-event branching.\n if (debounce > 0) {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n clearTimeout(this.timeoutId);\n this.timeoutId = setTimeout(() => this.syncAtomFromDom(), debounce);\n };\n } else {\n this.handleInput = () => {\n if (this.flags & BindingFlags.Composing) return;\n this.syncAtomFromDom();\n };\n }\n\n // Mark all internal handlers so the jQuery patch skips batch() wrapping.\n // Inlining markInternal avoids helper call overhead.\n (this.handleFocus as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n (this.handleBlur as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n (this.handleCompositionStart as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n (this.handleCompositionEnd as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n (this.handleInput as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n this.bindEvents();\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n // Chromium fires an input event after compositionend.\n // Safari/Firefox may not, so we trigger sync manually.\n this.handleInput();\n };\n\n private readonly handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private readonly handleBlur = () => {\n this.flags &= ~BindingFlags.Focused;\n\n // Flush any pending debounce timer on blur.\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n }\n\n // Re-format the displayed value to match the atom's canonical format.\n // peek() instead of .value: this is an event handler path — we want the\n // current value but must not register a reactive dependency here.\n const formatted = this.options.format(this.atom.peek());\n if (this.el.value !== formatted) {\n this.el.value = formatted;\n }\n };\n\n // --- Sync Logic ---\n\n private syncAtomFromDom(): void {\n // BindingFlags.Busy covers Composing | SyncingToAtom | SyncingToDom.\n // SyncingToDom is included defensively: if a future synchronous code path\n // triggers handleInput during an Atom→DOM write, this guard prevents echo.\n if (this.flags & BindingFlags.Busy) return;\n\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const parsed = this.options.parse(this.el.value);\n // peek() instead of .value: equality check in an event handler must not\n // register a dependency — only syncDomFromAtom (the effect body) tracks.\n if (!this.options.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n // parse() threw (e.g. invalid input) — leave the atom unchanged.\n debug.warn(LOG_PREFIXES.BINDING, `${ERROR_MESSAGES.PARSE_ERROR()}:`, e);\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n // --- Public Interface ---\n\n /**\n * Reactive effect body (Atom → DOM).\n * Called by the `effect()` wrapper in `applyInputBinding` whenever the atom\n * value changes. Named `syncDomFromAtom` to distinguish it from the imported\n * `effect` function and to clarify the data-flow direction.\n */\n public readonly syncDomFromAtom = () => {\n // Only this.atom.value is the intended dependency of this effect.\n // Everything else — format(), parse(), equal(), el.value DOM reads —\n // runs untracked so user callbacks cannot accidentally subscribe this\n // effect to extra atoms.\n const val = this.atom.value;\n\n untracked(() => {\n const formatted = this.options.format(val);\n const currentVal = this.el.value;\n\n // Skip if already synchronised.\n if (currentVal === formatted) return;\n\n const isFocused = !!(this.flags & BindingFlags.Focused);\n\n // While focused, skip update if the current raw input already parses to\n // the same logical value — avoids interrupting in-progress user input.\n if (isFocused) {\n try {\n if (this.options.equal(this.options.parse(currentVal), val)) return;\n } catch {\n // parse() threw on the current raw input (e.g. partially typed number).\n // Fall through and apply the formatted value.\n }\n }\n\n this.flags |= BindingFlags.SyncingToDom;\n try {\n if (\n isFocused &&\n (this.el instanceof HTMLInputElement || this.el instanceof HTMLTextAreaElement)\n ) {\n // Preserve cursor position so external atom updates don't jump the caret.\n const start = this.el.selectionStart;\n const end = this.el.selectionEnd;\n\n this.el.value = formatted;\n\n const len = formatted.length;\n if (start !== null && end !== null) {\n this.el.setSelectionRange(Math.min(start, len), Math.min(end, len));\n }\n } else {\n this.el.value = formatted;\n }\n\n debug.domUpdated(this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n public readonly cleanup = () => {\n // Remove only this instance's namespaced events — other bindings on the\n // same element are unaffected.\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(): void {\n this.$el\n .on(`focus${this.ns}`, this.handleFocus)\n .on(`blur${this.ns}`, this.handleBlur)\n .on(`compositionstart${this.ns}`, this.handleCompositionStart)\n .on(`compositionend${this.ns}`, this.handleCompositionEnd)\n .on(`${this.options.event}${this.ns}`, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n * Used by both `$.fn.atomVal` (explicit) and `$.fn.atomBind({ val })` (implicit).\n *\n * @param $el - jQuery-wrapped input, textarea, or select element.\n * @param atom - Writable atom to keep in sync with the element's value.\n * @param options - Optional parse/format/debounce/event/equal configuration.\n * @returns `fx` — the registered reactive effect (Atom → DOM),\n * `cleanup` — removes all event listeners and cancels pending timers.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n const binding = new InputBinding($el, atom, options);\n return { fx: effect(binding.syncDomFromAtom), cleanup: binding.cleanup };\n}\n","import { computed, effect, isAtom, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from './constants';\nimport { debug } from './debug';\nimport { type BindingDebugType, registerReactiveEffect } from './effect-factory';\nimport { applyInputBinding } from './input-binding';\nimport { INTERNAL_HANDLER } from './jquery-patch';\nimport { registry } from './registry';\nimport type {\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from './types';\n\nexport type { BindingContext };\n\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml } from './utils';\n\n// Cache for CSS property camelization to avoid repeated regex overhead.\n// Uses Map instead of a plain object to avoid prototype pollution risk and\n// for clearer semantics — CSS property names are a small, finite set so the\n// cache is effectively bounded in practice.\nconst camelCache = new Map<string, string>();\nfunction getCamelCase(prop: string): string {\n let cached = camelCache.get(prop);\n if (cached !== undefined) return cached;\n\n cached = prop.includes('-') ? prop.replace(/-./g, (m) => m[1]!.toUpperCase()) : prop;\n camelCache.set(prop, cached);\n return cached;\n}\n\n/**\n * Cache for sanitized versions of reactive strings.\n * Ensures that if 100 elements are bound to the same atom, sanitizeHtml() is\n * called only once per update instead of 100 times.\n */\nconst htmlSanitizeCache = new WeakMap<\n import('@but212/atom-effect').ReadonlyAtom<string>,\n import('@but212/atom-effect').ComputedAtom<string>\n>();\n\nfunction getSanitizedHtml(\n source: import('@but212/atom-effect').ReadonlyAtom<string>\n): import('@but212/atom-effect').ComputedAtom<string> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => sanitizeHtml(source.value));\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// Binding Context Factory\n// ============================================================================\n\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n $el: $(el),\n el,\n trackCleanup: (fn) => registry.trackCleanup(el, fn),\n };\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content. Decoupled from generic T for flexibility with any reactive source.\n */\nexport function bindText<T = unknown>(\n ctx: BindingContext,\n value: ReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n const el = ctx.el;\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const newVal = formatter ? formatter(val) : typeof val === 'string' ? val : String(val ?? '');\n // Guard against redundant DOM writes which trigger browser reflows\n if (el.textContent !== newVal) {\n el.textContent = newVal;\n }\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n * Calls `registry.cleanupDescendants` before replacing innerHTML so that any\n * reactive bindings on outgoing child nodes are disposed before they are removed —\n * preventing the MutationObserver auto-cleanup path from firing a redundant cleanup.\n */\nexport function bindHtml(ctx: BindingContext, value: ReactiveValue<string>): void {\n const el = ctx.el;\n\n // Optimization: If the source is reactive, use a cached computed atom to\n // ensure sanitization runs exactly once per atom change for all observers.\n const reactiveSource = isAtom(value)\n ? getSanitizedHtml(value as import('@but212/atom-effect').ReadonlyAtom<string>)\n : value;\n\n registerReactiveEffect(\n el,\n reactiveSource,\n (sanitized) => {\n if (el.innerHTML !== sanitized) {\n // Dispose child bindings before the nodes are removed from the DOM.\n registry.cleanupDescendants(el);\n el.innerHTML = sanitized;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n */\nexport function bindClass(\n ctx: BindingContext,\n classMap: Record<string, ReactiveValue<boolean>>\n): void {\n Object.entries(classMap).forEach(([className, source]) => {\n registerReactiveEffect(\n ctx.el,\n source,\n (val) => {\n ctx.el.classList.toggle(className, !!val);\n },\n `class.${className}`\n );\n });\n}\n\n/**\n * Updates multiple CSS style properties. Supports units (e.g., [source, 'px']).\n */\nexport function bindCss(ctx: BindingContext, cssMap: Record<string, CssValue>): void {\n const el = ctx.el;\n const style = el.style as unknown as Record<string, string>;\n Object.entries(cssMap).forEach(([prop, val]) => {\n const camel = getCamelCase(prop);\n // Destructure the tuple form explicitly so TypeScript can narrow each branch.\n const [source, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n\n registerReactiveEffect(\n el,\n source,\n (v) => {\n const strVal = unit ? `${v}${unit}` : String(v);\n if (isDangerousCssValue(strVal)) {\n return;\n }\n style[camel] = strVal;\n },\n `css.${prop}`\n );\n });\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n ctx: BindingContext,\n attrMap: Record<string, ReactiveValue<PrimitiveValue>>\n): void {\n const el = ctx.el;\n Object.keys(attrMap).forEach((name) => {\n // Block event handler attributes (on*) to prevent inline JS injection.\n // Attribute names from the DOM API are lowercase, but user-supplied keys\n // may use mixed case — normalize before the check.\n if (name.toLowerCase().startsWith('on')) {\n return;\n }\n\n registerReactiveEffect(\n el,\n attrMap[name]!,\n (v) => {\n if (v === null || v === undefined || v === false) {\n el.removeAttribute(name);\n return;\n }\n const newVal = v === true ? name : String(v);\n if (isDangerousUrl(name, newVal)) {\n return;\n }\n // Attribute write guard\n if (el.getAttribute(name) !== newVal) {\n el.setAttribute(name, newVal);\n }\n },\n `attr.${name}`\n );\n });\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, ReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n Object.keys(propMap).forEach((name) => {\n // Block dangerous DOM properties that can inject raw HTML (e.g., innerHTML)\n if (DANGEROUS_PROPS.has(name)) {\n return;\n }\n\n registerReactiveEffect(\n ctx.el,\n propMap[name]!,\n (val) => {\n // Redundancy check specifically for DOM properties\n if (el[name] !== val) {\n el[name] = val;\n }\n },\n `prop.${name}`\n );\n });\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n ctx: BindingContext,\n condition: ReactiveValue<boolean>,\n invert: boolean\n): void {\n const el = ctx.el;\n const label: BindingDebugType = invert ? 'hide' : 'show';\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const visible = invert !== !!val;\n el.style.display = visible ? '' : 'none';\n },\n label\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n * Supports parse/format options, debouncing, IME composition, and focus-aware updates.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tagName = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tagName)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.INVALID_INPUT_ELEMENT(tagName)}`);\n return;\n }\n const { fx, cleanup } = applyInputBinding(ctx.$el, atom, options);\n\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Two-way binding for checkbox/radio checked state.\n */\nexport function bindChecked(ctx: BindingContext, atom: WritableAtom<boolean>): void {\n const el = ctx.el as HTMLInputElement;\n const $el = ctx.$el;\n\n // DOM → Atom (jQuery events for .trigger() compatibility)\n // Note: el.checked = x does not fire 'change', so no re-entrancy guard is needed.\n const handler = () => {\n const current = el.checked;\n if (atom.value !== current) {\n atom.value = current;\n }\n };\n // Internal handler — skip batch() wrapping in the jQuery patch.\n (handler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n // DOM → Atom cleanup goes through ctx.trackCleanup (element lifecycle).\n // Atom → DOM cleanup goes through registry.trackEffect (reactive effect lifecycle).\n // The split is intentional: effects are disposed by the registry's effect tracker;\n // plain event listeners have no registry counterpart and need manual teardown.\n $el.on('change', handler);\n ctx.trackCleanup(() => $el.off('change', handler));\n\n // Atom → DOM\n const fx = effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n debug.domUpdated($el, 'checked', val);\n }\n });\n });\n registry.trackEffect(el, fx);\n}\n\n// ============================================================================\n// Event Binding Handler\n// ============================================================================\n\nexport function bindEvents(ctx: BindingContext, eventMap: NonNullable<BindingOptions['on']>): void {\n const $el = ctx.$el;\n $el.on(eventMap);\n ctx.trackCleanup(() => $el.off(eventMap));\n}\n\n/**\n * Binds a single event handler using jQuery's event system for compatibility.\n * Optimized to avoid creating jQuery wrapper objects repeatedly during setup/teardown.\n */\nexport function bindOn(\n ctx: BindingContext,\n event: string,\n handler: (e: JQuery.Event) => void\n): void {\n const $el = ctx.$el;\n $el.on(event, handler);\n ctx.trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n * Centralised here so `chainable.ts` does not need to import `registry` directly.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport type {\n BindingOptions,\n CssBindings,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from './types';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindUnbind,\n bindVal,\n bindVisibility,\n createContext,\n} from './unified';\n\n/**\n * Binds element `textContent` to a reactive source.\n *\n * @param source - Reactive or static value to display.\n * @param formatter - Optional function to convert the value to a string.\n * Defaults to `String(val ?? '')`.\n */\n$.fn.atomText = function <T>(source: ReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return this.each(function () {\n bindText(createContext(this), source, formatter);\n });\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n * The value is automatically sanitized before insertion to prevent XSS.\n */\n$.fn.atomHtml = function (source: ReactiveValue<string>): JQuery {\n return this.each(function () {\n bindHtml(createContext(this), source);\n });\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n *\n * @overload Single class: `atomClass(className, condition)`\n * @overload Multiple classes: `atomClass({ active: isActive, disabled: isDisabled })`\n */\n$.fn.atomClass = function (\n classNameOrMap: string | Record<string, ReactiveValue<boolean>>,\n condition?: ReactiveValue<boolean>\n): JQuery {\n // Validate arguments once before iterating — avoids repeated warnings per element.\n if (typeof classNameOrMap === 'string' && condition === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.MISSING_CONDITION('atomClass')}`);\n return this;\n }\n // Hoist: build the map once, not once-per-element inside each().\n const classMap =\n typeof classNameOrMap === 'string' ? { [classNameOrMap]: condition! } : classNameOrMap;\n return this.each(function () {\n bindClass(createContext(this), classMap);\n });\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n *\n * @overload Single property: `atomCss(prop, source, unit?)`\n * @overload Multiple properties: `atomCss({ color: colorAtom, opacity: [opacityAtom, 'px'] })`\n */\n$.fn.atomCss = function (\n propOrMap: string | CssBindings,\n source?: ReactiveValue<string | number>,\n unit?: string\n): JQuery {\n // Validate arguments once before iterating — avoids repeated warnings per element.\n if (typeof propOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n // Hoist: build the map once, not once-per-element inside each().\n const cssMap: CssBindings =\n typeof propOrMap === 'string'\n ? { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! }\n : propOrMap;\n return this.each(function () {\n bindCss(createContext(this), cssMap);\n });\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n * Event handler attributes (`on*`) are blocked. Dangerous URL protocols are blocked.\n *\n * @overload Single attribute: `atomAttr(name, source)`\n * @overload Multiple attributes: `atomAttr({ href: urlAtom, title: titleAtom })`\n */\n$.fn.atomAttr = function (\n nameOrMap: string | Record<string, ReactiveValue<PrimitiveValue>>,\n source?: ReactiveValue<PrimitiveValue>\n): JQuery {\n // Validate arguments once before iterating — avoids repeated warnings per element.\n if (typeof nameOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n // Hoist: build the map once, not once-per-element inside each().\n const attrMap: Record<string, ReactiveValue<PrimitiveValue>> = typeof nameOrMap === 'string'\n ? { [nameOrMap]: source! }\n : nameOrMap;\n return this.each(function () {\n bindAttr(createContext(this), attrMap);\n });\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n * Dangerous properties (`innerHTML`, `outerHTML`, etc.) are blocked.\n *\n * @overload Single property: `atomProp(name, source)`\n * @overload Multiple properties: `atomProp({ disabled: isDisabled, value: valAtom })`\n */\n$.fn.atomProp = function <T>(\n nameOrMap: string | Record<string, ReactiveValue<T>>,\n source?: ReactiveValue<T>\n): JQuery {\n // Validate arguments once before iterating — avoids repeated warnings per element.\n if (typeof nameOrMap === 'string' && source === undefined) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n // Hoist: build the map once, not once-per-element inside each().\n const propMap: Record<string, ReactiveValue<unknown>> = typeof nameOrMap === 'string'\n ? { [nameOrMap]: source as ReactiveValue<unknown> }\n : (nameOrMap as Record<string, ReactiveValue<unknown>>);\n return this.each(function () {\n bindProp(createContext(this), propMap);\n });\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: ReactiveValue<boolean>): JQuery {\n return this.each(function () {\n bindVisibility(createContext(this), condition, false);\n });\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n * Inverse of `atomShow`.\n */\n$.fn.atomHide = function (condition: ReactiveValue<boolean>): JQuery {\n return this.each(function () {\n bindVisibility(createContext(this), condition, true);\n });\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n * Supports debouncing, IME composition, parse/format, and focus-aware updates.\n *\n * @param atom - Writable atom to sync with the input.\n * @param options - Optional configuration (debounce, event, parse, format, equal).\n * An empty object and an omitted options argument are equivalent — both use defaults.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return this.each(function () {\n bindVal(createContext(this), atom as WritableAtom<unknown>, options as ValOptions<unknown>);\n });\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n * Uses the jQuery event system (not native `addEventListener`) for `.trigger()` compatibility.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return this.each(function () {\n bindChecked(createContext(this), atom);\n });\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n * The handler is automatically removed when the element is unbound via `atomUnbind`.\n *\n * @param event - jQuery event name (e.g. `'click'`, `'input'`, `'change.myns'`).\n * @param handler - Callback receiving the jQuery event object.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return this.each(function () {\n bindOn(createContext(this), event, handler);\n });\n};\n\n/**\n * Integrated multi-behavior reactive binding.\n * Delegates to the focused bind helpers — each option maps 1:1 to a handler.\n *\n * All conditional checks use `!== undefined` consistently so that meaningful\n * falsy values (`show: false`, `hide: false`, `class: {}`) are handled correctly.\n */\n$.fn.atomBind = function (options: BindingOptions): JQuery {\n return this.each(function () {\n const ctx = createContext(this);\n\n if (options.text !== undefined) bindText(ctx, options.text);\n if (options.html !== undefined) bindHtml(ctx, options.html);\n if (options.class !== undefined) bindClass(ctx, options.class);\n if (options.css !== undefined) bindCss(ctx, options.css);\n if (options.attr !== undefined) bindAttr(ctx, options.attr);\n if (options.prop !== undefined) bindProp(ctx, options.prop);\n if (options.show !== undefined) bindVisibility(ctx, options.show, false);\n if (options.hide !== undefined) bindVisibility(ctx, options.hide, true);\n if (options.val !== undefined) {\n if (Array.isArray(options.val)) {\n // BindingOptions.val is typed as WritableAtom | [WritableAtom, ValOptions].\n // Array.isArray narrows to the tuple branch; the cast makes the tuple explicit.\n const [atom, valOpts] = options.val as [WritableAtom<unknown>, ValOptions<unknown>];\n bindVal(ctx, atom, valOpts);\n } else {\n bindVal(ctx, options.val);\n }\n }\n if (options.checked !== undefined) bindChecked(ctx, options.checked);\n if (options.on !== undefined) bindEvents(ctx, options.on);\n });\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n * This calls `registry.cleanupTree` on each element, which disposes effects,\n * cleanup callbacks, and component lifecycle functions recursively.\n *\n * Difference from `atomUnmount`: `atomUnmount` is scoped to components mounted via\n * `atomMount`. `atomUnbind` removes all bindings regardless of how they were created.\n */\n$.fn.atomUnbind = function (): JQuery {\n return this.each(function () {\n bindUnbind(this);\n });\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ListOptions, ReadonlyAtom } from './types';\nimport { getLIS, getSelector, sanitizeHtml, shallowEqual } from './utils';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Inserts `$el` before `nextNode` when `nextNode` is non-null and connected,\n * otherwise appends it to `$container`.\n */\nfunction insertOrAppend($el: JQuery, nextNode: Node | null, $container: JQuery): void {\n if (nextNode?.isConnected) $el.insertBefore(nextNode);\n else $el.appendTo($container);\n}\n\n// ============================================================================\n// atomList\n// ============================================================================\n\n/**\n * Reactive list rendering with LIS-based DOM reconciliation.\n *\n * Note: when `key` is a property name string, the resolved property value is\n * used as the Map key. The property must produce a `string | number` at\n * runtime — boolean or object values will be coerced by the Map and may cause\n * unexpected key collisions.\n */\n$.fn.atomList = function <T>(source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const { key, render, bind, update, onAdd, onRemove, empty } = options;\n\n const getKey =\n typeof key === 'function'\n ? key\n : (item: T, _index: number) => item[key as keyof T] as unknown as string | number;\n\n return this.each(function (this: HTMLElement) {\n const $container = $(this);\n const containerSelector = getSelector(this);\n\n const itemMap = new Map<\n string | number,\n { $el: JQuery; item: T; state?: 'new' | 'replaced' | undefined }\n >();\n const removingKeys = new Set<string | number>();\n let oldKeys: (string | number)[] = [];\n let $emptyEl: JQuery | null = null;\n\n /**\n * Schedules DOM removal after an optional async `onRemove` transition.\n */\n const scheduleRemoval = (k: string | number, entry: { $el: JQuery; item: T }) => {\n const commitRemoval = () => {\n if (fx?.isDisposed) return; // Container already torn down — skip stale DOM work\n entry.$el.remove();\n removingKeys.delete(k);\n debug.log('list', `${containerSelector} removed item:`, k);\n };\n\n if (onRemove) {\n const result = onRemove(entry.$el);\n if (result instanceof Promise) {\n result.then(commitRemoval, commitRemoval);\n } else {\n commitRemoval();\n }\n } else {\n commitRemoval();\n }\n };\n\n const removeItem = (k: string | number, entry: { $el: JQuery; item: T }) => {\n itemMap.delete(k);\n removingKeys.add(k);\n scheduleRemoval(k, entry);\n };\n\n // Declare fx with let so scheduleRemoval's closure can reference it after assignment.\n let fx: ReturnType<typeof effect>;\n\n fx = effect(() => {\n // Only source.value is tracked. All side effects (DOM reads/writes,\n // render calls, bind calls) ran inside untracked() so they cannot\n // accidentally subscribe the list effect to atom reads within user callbacks.\n const items = source.value;\n const itemCount = items.length;\n\n untracked(() => {\n // 1. Handle Empty Template\n if ($emptyEl && itemCount > 0) {\n $emptyEl.remove();\n $emptyEl = null;\n }\n\n if (itemCount === 0) {\n if (empty && !$emptyEl) {\n const safeEmpty = typeof empty === 'string' ? sanitizeHtml(empty) : empty;\n $emptyEl = ($(safeEmpty as string) as JQuery).appendTo($container);\n }\n itemMap.forEach((entry, k) => {\n if (!removingKeys.has(k)) removeItem(k, entry);\n });\n oldKeys = [];\n return;\n }\n\n debug.log('list', `${containerSelector} updating with ${itemCount} items`);\n\n // 2. Build index structures\n const oldIndexMap = new Map<string | number, number>();\n for (let i = 0; i < oldKeys.length; i++) {\n oldIndexMap.set(oldKeys[i]!, i);\n }\n\n const newKeys: (string | number)[] = new Array(itemCount);\n const newKeySet = new Set<string | number>();\n const newIndices = new Int32Array(itemCount);\n // Parallel arrays replace an array-of-objects to reduce GC pressure and\n // improve cache locality when iterating targetsToRender (step 3).\n const trKeys: (string | number)[] = [];\n const trItems: T[] = [];\n const trIdxs: number[] = [];\n\n for (let i = 0; i < itemCount; i++) {\n const item = items[i]!;\n const k = getKey(item, i);\n newKeys[i] = k;\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.DUPLICATE_KEY(k, i));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const entry = itemMap.get(k);\n if (entry) {\n const oldItem = entry.item;\n if (!update && oldItem !== item && !shallowEqual(oldItem, item)) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n }\n newIndices[i] = removingKeys.has(k) ? -1 : (oldIndexMap.get(k) ?? -1);\n } else {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n }\n }\n\n // 3. Render New/Updated Items (Batch Sanitization)\n const SEPARATOR = '<!--sep-->';\n const renderCount = trKeys.length;\n const renderResults: Array<string | Element | DocumentFragment | JQuery> = new Array(\n renderCount\n );\n const htmlParts: string[] = [];\n\n for (let t = 0; t < renderCount; t++) {\n const raw = render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n }\n }\n\n // Batch sanitize: N calls → 1 call\n let sanitizedFragments: string[] | null = null;\n if (htmlParts.length > 0) {\n const combined = htmlParts.join(SEPARATOR);\n const sanitized = sanitizeHtml(combined);\n sanitizedFragments = sanitized.split(SEPARATOR);\n }\n\n // Create $el for each target\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el =\n typeof raw === 'string'\n ? $(sanitizedFragments![fragIdx++]!)\n : ($(raw as never) as JQuery);\n\n const k = trKeys[t]!;\n const entry = itemMap.get(k);\n if (entry) {\n const oldEl = entry.$el[0];\n if (oldEl) registry.cleanupTree(oldEl);\n entry.$el.replaceWith($el);\n entry.$el = $el;\n entry.state = 'replaced';\n } else {\n itemMap.set(k, { $el, item: null as unknown as T, state: 'new' });\n }\n }\n\n // 4. Cleanup Removed Keys\n for (const [k, entry] of itemMap) {\n if (!newKeySet.has(k) && !removingKeys.has(k)) {\n removeItem(k, entry);\n }\n }\n\n // 5. Place and Reorder via LIS\n const lisArr = getLIS(newIndices);\n let lisIdx = lisArr.length - 1;\n let nextNode: Node | null = null;\n const isInitial = oldKeys.length === 0;\n\n // innerHTML fast path: initial render, all string renders, no callbacks,\n // and no elements currently mid-removal (innerHTML would destroy them).\n const useInnerHtml =\n isInitial &&\n sanitizedFragments !== null &&\n fragIdx === renderCount &&\n !bind &&\n !onAdd &&\n !onRemove &&\n removingKeys.size === 0;\n\n if (useInnerHtml) {\n this.innerHTML = sanitizedFragments!.join('');\n\n // Map children back to itemMap entries\n let childIdx = 0;\n for (let i = 0; i < itemCount; i++) {\n const k = newKeys[i]!;\n const item = items[i]!;\n const entry = itemMap.get(k);\n if (!entry) continue;\n\n const el = this.children[childIdx++] as HTMLElement | undefined;\n if (el) {\n entry.$el = $(el);\n entry.item = item;\n entry.state = undefined;\n removingKeys.delete(k);\n debug.domUpdated(entry.$el, 'list.add', item);\n }\n }\n } else {\n const fragment = isInitial ? document.createDocumentFragment() : null;\n\n if (isInitial && fragment) {\n // ── Initial render: accumulate into DocumentFragment ──────────────\n // Loop-invariant branch hoisted out: avoids per-iteration isInitial check.\n for (let i = itemCount - 1; i >= 0; i--) {\n const k = newKeys[i]!;\n const item = items[i]!;\n const entry = itemMap.get(k)!;\n if (!entry) continue;\n\n const state = entry.state;\n const isNewItem = state === 'new';\n const isReplaced = state === 'replaced';\n entry.item = item;\n entry.state = undefined;\n\n if (entry.$el[0]) {\n if (!isNewItem && !isReplaced && update) {\n update(entry.$el, item, i);\n } else if ((isNewItem || isReplaced) && bind) {\n bind(entry.$el, item, i);\n }\n }\n\n for (let j = entry.$el.length - 1; j >= 0; j--) {\n fragment.insertBefore(entry.$el[j]!, fragment.firstChild);\n }\n if (onAdd && isNewItem) onAdd(entry.$el);\n\n if (isNewItem) {\n removingKeys.delete(k);\n debug.domUpdated(entry.$el, 'list.add', item);\n }\n }\n this.appendChild(fragment);\n } else {\n // ── Incremental update: LIS-based reconciliation ──────────────────\n for (let i = itemCount - 1; i >= 0; i--) {\n const k = newKeys[i]!;\n const item = items[i]!;\n const entry = itemMap.get(k)!;\n if (!entry) continue;\n\n const state = entry.state;\n const isNewItem = state === 'new';\n const isReplaced = state === 'replaced';\n entry.item = item;\n entry.state = undefined;\n\n if (entry.$el[0]) {\n if (!isNewItem && !isReplaced && update) {\n update(entry.$el, item, i);\n } else if ((isNewItem || isReplaced) && bind) {\n bind(entry.$el, item, i);\n }\n }\n\n if (lisIdx >= 0 && lisArr[lisIdx] === i) {\n lisIdx--;\n } else {\n insertOrAppend(entry.$el, nextNode, $container);\n }\n if (onAdd && isNewItem) onAdd(entry.$el);\n nextNode = entry.$el[0] ?? null;\n\n if (isNewItem) {\n removingKeys.delete(k);\n debug.domUpdated(entry.$el, 'list.add', item);\n }\n }\n }\n }\n\n oldKeys = newKeys;\n });\n });\n\n registry.trackEffect(this, fx);\n registry.trackCleanup(this, () => {\n itemMap.clear();\n removingKeys.clear();\n oldKeys = [];\n $emptyEl?.remove();\n });\n });\n};\n","import { untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from './constants';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { ComponentFn } from './types';\nimport { bindUnbind } from './unified';\n\n// ============================================================================\n// Internal helpers\n// ============================================================================\n\nconst EMPTY_PROPS = Object.freeze({});\n\n// ============================================================================\n// jQuery plugin methods\n// ============================================================================\n\n/**\n * Mounts a functional component on each selected element.\n *\n * @param component - Function receiving `($el, props)` and returning an\n * optional cleanup callback. See {@link ComponentFn}.\n * @param props - Props passed to the component. When omitted, `P` must be\n * compatible with an empty object (i.e. all fields optional or\n * `P = object`). Passing no props to a component with required fields is\n * a type error that TypeScript will catch at the call site, but only when\n * `props` is explicitly typed — the `{} as P` fallback is not type-safe\n * for components with required fields.\n */\n$.fn.atomMount = function <P>(component: ComponentFn<P>, props?: P): JQuery {\n // Hoist default props object to avoid allocation in loop\n const p = (props ?? EMPTY_PROPS) as P;\n\n return this.each(function () {\n // Unmount any existing component before mounting the new one.\n registry.cleanupTree(this);\n\n const $el = $(this);\n let teardown: ReturnType<typeof component>;\n try {\n // untracked: component setup code must not register dependencies on any\n // outer reactive context (e.g. if atomMount is called inside an effect).\n teardown = untracked(() => component($el, p));\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT_ERROR(), err);\n return;\n }\n\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(this, teardown);\n }\n });\n};\n\n/**\n * Unmounts the component and disposes all reactive bindings on each selected\n * element and its descendants.\n */\n$.fn.atomUnmount = function (): JQuery {\n return this.each(function () {\n bindUnbind(this);\n });\n};\n","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { computed, atom as createAtom, effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from './constants';\nimport { debug } from './debug';\nimport { registry } from './registry';\nimport type { RouteConfig, RouteDefinition, Router, WritableAtom } from './types';\n\n// --- Helper: Safe History API Wrappers ---\nfunction safePushState(data: unknown, url: string | URL | null): boolean {\n try {\n // Second argument (title) is deprecated in the spec and ignored by all\n // browsers — pass an empty string as required by the signature.\n history.pushState(data, '', url);\n return true;\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'PushState failed (likely file:// protocol or security restriction). UI will update, but URL will not.',\n e\n );\n return false;\n }\n}\n\nclass RouterImpl implements Router {\n /**\n * Reactive atom containing the current route name.\n * Exposed as ReadonlyAtom so external code cannot mutate route state\n * without going through navigate(), which keeps URL and atom in sync.\n */\n public currentRoute: ReadonlyAtom<string>;\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: RouteConfig;\n private isDestroyed = false;\n /**\n * Tracks the route name of the last completed transition.\n * Initialized to empty string so beforeTransition/afterTransition always\n * receive a consistent `from` value — never `from === to` on the first render.\n */\n private previousRoute = '';\n /**\n * Mirrors the browser URL after every committed navigation.\n * Used by handleUrlChange to detect real URL changes (vs. our own\n * programmatic updates) and by restoreUrl to roll back blocked transitions.\n */\n private previousUrl: string;\n private cleanups: Array<() => void> = [];\n\n private $target: JQuery;\n private isHistoryMode: boolean;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n /** Caches resolved HTMLTemplateElement references to avoid repeated querySelector calls. */\n private templateCache = new Map<string, HTMLTemplateElement>();\n /** Pre-calculated base path with trailing slash stripped for consistent URL building. */\n private normalizedBasePath: string;\n\n constructor(config: RouteConfig) {\n // Destructure configuration with defaults for internal use\n this.config = {\n ...config,\n mode: config.mode ?? ROUTE_DEFAULTS.mode,\n basePath: config.basePath ?? ROUTE_DEFAULTS.basePath,\n autoBindLinks: config.autoBindLinks ?? ROUTE_DEFAULTS.autoBindLinks,\n activeClass: config.activeClass ?? ROUTE_DEFAULTS.activeClass,\n };\n\n this.isHistoryMode = this.config.mode === 'history';\n this.$target = $(this.config.target);\n // Strip trailing slash so URL construction is always `${base}/${route}`.\n this.normalizedBasePath = this.config.basePath?.replace(/\\/$/, '') || '';\n\n // Initialize previousUrl based on current state before setting up atoms.\n // getCurrentUrl() cannot be called yet (method depends on isHistoryMode which is set above).\n this.previousUrl = this.isHistoryMode\n ? window.location.pathname + window.location.search\n : window.location.hash;\n\n // Initialize state atoms; expose via ReadonlyAtom to prevent external mutation.\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n // Use computed() to ensure queryParams is truly read-only at runtime,\n // as verified by the 'should be read-only (computed)' test.\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n // Bind methods that are used as callbacks\n this.handleUrlChange = this.handleUrlChange.bind(this);\n this.destroy = this.destroy.bind(this);\n\n // Initialize\n this.init();\n }\n\n private init() {\n // Set up URL change listener\n const eventName = this.isHistoryMode ? 'popstate' : 'hashchange';\n window.addEventListener(eventName, this.handleUrlChange);\n this.cleanups.push(() => window.removeEventListener(eventName, this.handleUrlChange));\n\n // Set up reactive rendering effect.\n // Only currentRouteAtom.value is the intended reactive dependency.\n // renderRoute calls user lifecycle hooks (beforeTransition, onEnter, render,\n // onMount, afterTransition) that may read atoms — those reads must not\n // subscribe this effect to extra dependencies.\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value; // sole tracked dependency\n untracked(() => this.renderRoute(routeName)); // user hooks run untracked\n });\n this.cleanups.push(() => renderEffect.dispose());\n\n // Auto-bind navigation links\n this.setupAutoBindLinks();\n\n // Auto-cleanup router if target element is removed\n if (this.$target[0]) {\n registry.trackCleanup(this.$target[0], this.destroy);\n }\n }\n\n // --- Mode-abstracted internal methods ---\n\n /**\n * Extracts route name from current URL.\n * Uses `normalizedBasePath` for consistent stripping in history mode.\n */\n private getRouteName(): string {\n const { default: defaultRoute } = this.config;\n\n if (this.isHistoryMode) {\n let pathname = window.location.pathname;\n // Strip the pre-normalized base path prefix.\n if (this.normalizedBasePath && pathname.startsWith(this.normalizedBasePath)) {\n pathname = pathname.substring(this.normalizedBasePath.length);\n }\n // Remove leading slash (optimized: charCodeAt avoids substring allocation)\n if (pathname.charCodeAt(0) === 47) {\n pathname = pathname.slice(1);\n }\n return pathname || defaultRoute;\n }\n // Hash mode\n const hash = window.location.hash;\n const qIndex = hash.indexOf('?');\n const routeName = qIndex === -1 ? hash.substring(1) : hash.substring(1, qIndex);\n return routeName || defaultRoute;\n }\n\n /**\n * Parses query parameters from the current URL.\n *\n * Note: duplicate keys (e.g. `?a=1&a=2`) are collapsed to the last value\n * only (`{ a: '2' }`). This matches `URLSearchParams` → `Object.fromEntries`\n * behaviour. If multi-value keys are needed, access `queryParams` via\n * `new URLSearchParams(window.location.search).getAll('key')` directly.\n */\n private getQueryParams(): Record<string, string> {\n let raw: string;\n\n if (this.isHistoryMode) {\n raw = window.location.search.substring(1); // Remove leading '?'\n if (!raw) return {};\n } else {\n const hash = window.location.hash;\n const qIndex = hash.indexOf('?');\n if (qIndex === -1) return {};\n raw = hash.substring(qIndex + 1);\n }\n\n const sp = new URLSearchParams(raw);\n const params: Record<string, string> = Object.fromEntries(sp);\n\n // Warn about malformed percent-encoded sequences\n if (raw.includes('%')) {\n try {\n decodeURIComponent(raw);\n } catch (_e) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.MALFORMED_URI(raw));\n }\n }\n\n return params;\n }\n\n /**\n * Updates the browser URL to reflect a new route and keeps `previousUrl`\n * in sync so `handleUrlChange` does not re-process our own navigation.\n */\n private setUrl(routeName: string): void {\n if (this.isHistoryMode) {\n const url = `${this.normalizedBasePath}/${routeName}`;\n safePushState(null, url);\n // Mirror the target URL so handleUrlChange knows this change was programmatic.\n this.previousUrl = url;\n } else {\n const hash = `#${routeName}`;\n // Set hash before updating previousUrl so getCurrentUrl() returns the\n // new value when we store it.\n window.location.hash = hash;\n this.previousUrl = hash;\n }\n }\n\n /**\n * Restores the URL when a navigation guard blocks the transition.\n * Uses pushState to safely add a new history entry, avoiding \"back button traps\"\n * that occur with replaceState during popstate events.\n */\n private restoreUrl(): void {\n if (this.isHistoryMode) {\n safePushState(null, this.previousUrl);\n } else {\n window.location.hash = this.previousUrl;\n }\n }\n\n /**\n * Returns the current full URL string for comparison purposes.\n */\n private getCurrentUrl(): string {\n if (this.isHistoryMode) {\n return window.location.pathname + window.location.search;\n }\n return window.location.hash;\n }\n\n // --- End mode-abstracted methods ---\n\n /**\n * Resolves route configuration, falling back to notFound route if needed.\n */\n private getRouteConfig(routeName: string): RouteDefinition | null {\n const { routes, notFound } = this.config;\n let routeConfig = routes[routeName];\n\n // Fallback to notFound route if route doesn't exist\n if (!routeConfig && notFound) {\n routeConfig = routes[notFound];\n }\n\n if (!routeConfig) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE_NOT_FOUND(routeName));\n return null;\n }\n\n return routeConfig;\n }\n\n /**\n * Appends cloned template content into the target container.\n * Always appends — callers are responsible for calling `$target.empty()`\n * before invoking this method if a clean slate is needed.\n */\n private renderTemplate(templateSelector: string): boolean {\n let template = this.templateCache.get(templateSelector);\n\n if (!template) {\n const el = document.querySelector(templateSelector);\n if (!el || !(el instanceof HTMLTemplateElement)) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.TEMPLATE_NOT_FOUND(templateSelector));\n return false;\n }\n template = el;\n this.templateCache.set(templateSelector, template);\n }\n\n const clonedContent = template.content.cloneNode(true) as DocumentFragment;\n this.$target.append(clonedContent);\n\n return true;\n }\n\n /**\n * Renders the specified route, including lifecycle hooks and content.\n *\n * Called from within a reactive effect, so DOM mutations here run\n * synchronously inside the effect body. `registry.cleanupDescendants` is\n * called before `$target.empty()` to ensure any reactive bindings on\n * outgoing content are disposed before the nodes are removed — preventing\n * the MutationObserver auto-cleanup path from firing a redundant cleanup.\n *\n * If `beforeTransition` throws, the render is aborted and the outgoing\n * content remains in the DOM. This is intentional — a throwing hook signals\n * that the transition should not proceed.\n */\n private renderRoute(routeName: string): void {\n if (this.isDestroyed) return;\n\n // Validate target element exists\n const container = this.$target[0];\n if (!container) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.TARGET_NOT_FOUND(this.config.target));\n return;\n }\n\n // Resolve route configuration\n const routeConfig = this.getRouteConfig(routeName);\n if (!routeConfig) return;\n\n // Parse query parameters\n const params = this.getQueryParams();\n\n // `previousRoute` is '' on first render, so from !== to in all cases.\n const fromRoute = this.previousRoute;\n\n // Call beforeTransition hook.\n // If it throws, the render is aborted — outgoing content stays in the DOM.\n if (this.config.beforeTransition) {\n this.config.beforeTransition(fromRoute, routeName);\n }\n\n // Dispose reactive bindings on outgoing content before clearing the DOM.\n // $.fn.empty() (patched via jquery-patch) handles cleanupDescendants automatically.\n this.$target.empty();\n\n // Call onEnter hook and merge params\n let routeParams = params;\n if (routeConfig.onEnter) {\n const result = routeConfig.onEnter(params);\n if (result !== undefined) {\n routeParams = { ...params, ...result };\n }\n }\n\n // Render content (custom render or template)\n if (routeConfig.render) {\n routeConfig.render(container, routeName, routeParams);\n } else if (routeConfig.template) {\n if (this.renderTemplate(routeConfig.template)) {\n if (routeConfig.onMount) {\n routeConfig.onMount(this.$target.children());\n }\n }\n }\n\n // Call afterTransition hook\n if (this.config.afterTransition) {\n this.config.afterTransition(fromRoute, routeName);\n }\n\n // Update previous route for next transition\n this.previousRoute = routeName;\n }\n\n /**\n * Handles browser URL change events (hashchange or popstate).\n */\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.getCurrentUrl();\n // Early-exit if URL didn't actually change (e.g., called by our own navigate()).\n if (currentUrl === this.previousUrl) return;\n\n const newRoute = this.getRouteName();\n // peek(): event handler path — reading for comparison only, not to subscribe.\n const oldRouteName = this.currentRouteAtom.peek();\n const params = this.getQueryParams();\n\n if (oldRouteName !== newRoute) {\n // Check onLeave guard for user-driven navigation\n const oldRouteConfig = this.config.routes[oldRouteName];\n if (oldRouteConfig?.onLeave) {\n if (oldRouteConfig.onLeave() === false) {\n // Navigation blocked — restore the URL without updating previousUrl,\n // so the next real navigation is still detected correctly.\n this.restoreUrl();\n return;\n }\n }\n // Update route first; the reactive effect will call renderRoute.\n // queryParamsAtom is set here so it is in sync before any subscriber\n // reads it during the same flush — renderRoute reads getQueryParams()\n // directly from the URL so there is no double-write risk.\n this.currentRouteAtom.value = newRoute;\n this.queryParamsAtom.value = params;\n } else {\n // Same route but URL changed (e.g., query params only)\n this.queryParamsAtom.value = params;\n const routeConfig = this.config.routes[oldRouteName];\n if (routeConfig?.onParamsChange) {\n routeConfig.onParamsChange(params);\n } else {\n this.renderRoute(newRoute);\n }\n }\n\n // Commit the new URL only after a successful (unblocked) transition.\n this.previousUrl = currentUrl;\n }\n\n /**\n * Sets up automatic binding for navigation links with data-route attribute.\n *\n * Event delegation is attached to `document` (not `$target`) so that\n * `[data-route]` links anywhere in the page — including outside the router's\n * target container — can trigger navigation. This is intentional: nav links\n * typically live in headers or sidebars, not inside the routed content area.\n *\n * Active-link management uses a reactive effect that re-runs only when\n * `currentRoute` changes — more efficient than a persistent MutationObserver.\n */\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n\n // 1. Event delegation on document so nav links outside $target are handled.\n const delegateHandler = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const routeAttr = (e.currentTarget as HTMLElement).dataset.route;\n if (routeAttr != null) this.navigate(routeAttr);\n };\n\n $(document).on('click', '[data-route]', delegateHandler);\n this.cleanups.push(() => {\n $(document).off('click', '[data-route]', delegateHandler);\n });\n\n // 2. Active state management — re-runs only when currentRoute changes.\n // `activeClass` is always set (constructor fills it from ROUTE_DEFAULTS).\n const { activeClass } = this.config;\n\n const activeLinksEffect = effect(() => {\n const current = this.currentRouteAtom.value; // sole tracked dependency\n // DOM queries and class manipulations run untracked: they must not\n // subscribe the effect to anything beyond currentRouteAtom.\n untracked(() => {\n const links = document.querySelectorAll<HTMLElement>('[data-route]');\n\n for (const el of links) {\n const routeAttr = el.dataset.route!;\n const isActive = current === routeAttr;\n\n el.classList.toggle(activeClass as string, isActive);\n if (isActive) {\n el.setAttribute('aria-current', 'page');\n } else {\n el.removeAttribute('aria-current');\n }\n }\n });\n });\n\n this.cleanups.push(() => activeLinksEffect.dispose());\n }\n\n /**\n * Navigates to the specified route programmatically.\n *\n * If `routeName` resolves to an empty string after falling back to\n * `config.default`, `setUrl` will be called with an empty string, producing\n * a URL of `${basePath}/` in history mode. Callers should ensure\n * `config.default` is always a non-empty route name.\n */\n public navigate(routeName: string): void {\n if (this.isDestroyed) return;\n\n // peek(): navigate() is called imperatively (not inside an effect), so\n // reading the current route must not register a reactive dependency.\n const currentRouteName = this.currentRouteAtom.peek();\n const currentRouteConfig = this.config.routes[currentRouteName];\n\n if (currentRouteConfig?.onLeave) {\n const canLeave = currentRouteConfig.onLeave();\n if (canLeave === false) return; // Navigation blocked\n }\n\n // Resolve empty route name to default route, matching getRouteName behavior\n const resolved = routeName || this.config.default;\n if (!resolved) {\n debug.warn(\n LOG_PREFIXES.ROUTE,\n 'navigate() called with empty routeName and no default configured.'\n );\n return;\n }\n\n this.setUrl(resolved);\n // Clear stale query params when navigating to a new route.\n this.queryParamsAtom.value = {};\n this.currentRouteAtom.value = resolved;\n }\n\n /**\n * Cleans up all event listeners and effects, and releases the template cache.\n * Each cleanup function is called in a try/catch so that a single failing\n * cleanup does not prevent the remaining ones from running.\n */\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n this.cleanups.forEach((fn) => {\n try {\n fn();\n } catch (e) {\n debug.warn(LOG_PREFIXES.ROUTE, 'Cleanup error during destroy:', e);\n }\n });\n this.cleanups.length = 0;\n\n // Release cached template references to allow GC.\n this.templateCache.clear();\n }\n}\n\n/**\n * Creates an SPA router with reactive state management.\n * Supports both hash-based and pushState-based (history) routing.\n *\n * This removes boilerplate from manual route handling by:\n * - Automatically tracking URL changes and updating the UI\n * - Managing template rendering with lifecycle hooks\n * - Handling active link states reactively\n * - Providing navigation guard support (onLeave)\n *\n * @param config - Router configuration\n * @returns Router instance with navigate, destroy methods and currentRoute atom\n *\n * @example\n * ```ts\n * const router = $.route({\n * target: '#app',\n * default: 'home',\n * routes: {\n * home: { template: '#tmpl-home' },\n * about: { template: '#tmpl-about' }\n * }\n * });\n * ```\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n/**\n * Register as jQuery static method.\n * `$.extend(obj)` merges into JQueryStatic; use `$.fn.extend(obj)` for instance methods.\n */\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchOptions } from './types';\n\n/**\n * A Promise that never settles, used to keep a computed atom in its pending\n * state after an aborted request — until the next reactive run supersedes it.\n *\n * When the async computed fn returns this value, core treats the run as still\n * in-flight (pending flag stays set) without resolving or rejecting. The next\n * run (triggered by invalidate() or a dependency change) replaces this state.\n *\n * Typed as `Promise<never>` so it can be widened to `Promise<T>` at the call\n * site without an `as unknown` double-cast — `never` is assignable to any `T`.\n *\n * Intentional module-level singleton: the Promise executor never resolves or\n * rejects, so the object is permanently live. This is expected and safe —\n * there are no closures over external references that would prevent GC of other\n * objects.\n */\nconst NEVER_SETTLE = new Promise<never>(() => {});\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const { defaultValue, transform, method, headers, ajaxOptions, onError, eager } = options;\n\n // Hoist 1: Determine URL getter once.\n const getUrl = typeof urlOrFn === 'function' ? urlOrFn : null;\n const staticUrl = typeof urlOrFn === 'string' ? urlOrFn : undefined;\n\n // Hoist 2: Pre-merge static options to avoid repeated object spreads per request.\n const baseOptions = {\n ...ajaxOptions,\n ...(method !== undefined && { method }),\n ...(headers !== undefined && { headers }),\n };\n\n let abortController: AbortController | null = null;\n\n return computed(\n async () => {\n abortController?.abort();\n abortController = new AbortController();\n const signal = abortController.signal;\n\n // Optimization: Use pre-merged options.\n // If staticUrl is present, it's used; otherwise getUrl() is called.\n // jQuery's ajax settings object is mutable but $.ajax copies it.\n // We create a fresh object here to be safe and reactive-friendly.\n const reqOptions = staticUrl\n ? { ...baseOptions, url: staticUrl }\n : { ...baseOptions, url: getUrl!() };\n\n const xhr = $.ajax(reqOptions);\n\n // Optimization: Use onabort property directly instead of addEventListener\n // to avoid the overhead of the EventTarget registry.\n // This signal is fresh per request and private to this scope.\n signal.onabort = () => xhr.abort();\n if (signal.aborted) xhr.abort();\n\n try {\n const raw = await xhr;\n return transform ? transform(raw) : (raw as T);\n } catch (err) {\n if (signal.aborted) {\n return NEVER_SETTLE as Promise<T>;\n }\n try {\n onError?.(err);\n } catch {\n // Ignore\n }\n throw err;\n } finally {\n signal.onabort = null; // Cleanup\n if (abortController.signal === signal) abortController = null;\n }\n },\n { defaultValue, lazy: !(eager ?? true) }\n );\n },\n});\n","/**\n * atom-effect-jquery\n *\n * Brings reactivity to jQuery.\n *\n * Features:\n * - Full CJK IME Support (Input Method Editor).\n * - Auto-cleanup via MutationObserver (No memory leaks).\n * - Debug Mode: Console logging + Visual Highlighting.\n *\n * Type augmentation note:\n * This package extends both `JQuery` and `JQueryStatic` via global interface\n * merging in `types.ts`. Consumers using the `export default $` path will\n * receive the augmented type automatically because the module's side-effect\n * imports apply the augmentation at import time.\n */\n\nimport $ from 'jquery';\n\n// ============================================================================\n// Plugin registrations (order matters — namespace must come first)\n// ============================================================================\n\n// Registers $.atom, $.computed, $.effect, $.batch, $.untracked,\n// $.isAtom, $.isComputed, $.isReactive, $.nextTick\nimport './namespace';\n\n// Registers $.fn.atomText/Html/Class/Css/Attr/Prop/Show/Hide/Val/Checked/On/Bind/Unbind.\nimport './chainable';\n\n// Registers $.fn.atomList\nimport './list';\n\n// Registers $.fn.atomMount / $.fn.atomUnmount\nimport './mount';\n\n// Registers $.route\nimport './route';\n\n// Registers $.atomFetch\nimport './fetch';\n\n// ============================================================================\n// Runtime initialisation (browser only)\n// ============================================================================\n\nimport { enablejQueryOverrides } from './jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from './registry';\n\n// $() runs after DOMContentLoaded, so document.body is guaranteed non-null here.\n// In JSDOM/test environments jQuery calls the callback synchronously.\n$(() => {\n // Wraps jQuery event dispatch in batch() so that rapid user interactions\n // (e.g. typing in an input) batch atom writes into a single reactive flush.\n enablejQueryOverrides();\n\n // Watches document.body for removed elements and disposes their reactive\n // bindings automatically, preventing memory leaks without manual cleanup.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n enableAutoCleanup(document.body!);\n});\n\n// ============================================================================\n// ESM exports — values\n// ============================================================================\n\n// Core primitives — re-exported so consumers do not need to depend on\n// @but212/atom-effect directly.\nexport {\n atom,\n batch,\n computed,\n effect,\n isAtom,\n isComputed,\n untracked,\n} from '@but212/atom-effect';\n\n// jQuery override controls — called automatically on DOM ready, but exposed\n// here for consumers who manage initialisation themselves (e.g. custom roots,\n// shadow DOMs, or environments where the automatic call is not appropriate).\nexport { disablejQueryOverrides, enablejQueryOverrides } from './jquery-patch';\n\n// nextTick is registered on $ via namespace.ts and exported here so ESM\n// consumers can import it without touching $.\n// isReactive is defined in utils.ts and also registered on $ via namespace.ts.\nexport { nextTick } from './namespace';\nexport { isReactive } from './utils';\n\n// Registry API — for advanced lifecycle control (custom roots, manual cleanup).\n// Note: enableAutoCleanup is called automatically on DOM ready with document.body.\n// Call it again only if you need a different root or want to re-initialise.\nexport { registry, enableAutoCleanup, disableAutoCleanup };\n\n// ============================================================================\n// ESM exports — types\n// ============================================================================\n\n// Public-facing types — includes everything needed to fully type-check calls\n// to every exported function and jQuery plugin method.\nexport type {\n // Binding authoring\n BindingOptions,\n ComponentFn,\n // Reactive primitives (core)\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n // Fetch\n FetchOptions,\n // List\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n // Routing\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from './types';\n\n// The augmented jQuery object. Consumers importing this receive a $ with all\n// atom-effect plugin methods already typed via global interface merging.\nexport default $;\n"],"names":["b","u","$","a","d","nt","H","R","W","rt","D","e","s","f","I","m","ot","ht","x","F","i","ct","ut","K","n","P","V","v","h","S","O","J","Z","r","k","w","M","B","L","tt","_t","X","G","at","lt","T","z","et","st","_","Ct","Q","ft","gt","Et","c","l","Tt","Ot","it","Y","q","A","p","y","E","g","N","C","U","dt","pt","It","o","At","j","St","Nt","yt","LOG_PREFIXES","ROUTE_DEFAULTS","INPUT_DEFAULTS","VALID_INPUT_TAGS","DANGEROUS_PROPS","ERROR_MESSAGES","name","selector","raw","prop","tagName","method","key","index","debugType","isReactive","value","isAtom","getSelector","el","list","len","URL_ATTRS","hasOwn","DANGEROUS_PROTOCOL_RE","DANGEROUS_CSS_RE","DANGEROUS_CSS_URL_RE","STRIP_CTRL_RE","STRIP_XML_RE","DANGEROUS_TAG_RE","DANGEROUS_PROTOCOL_GLOBAL_RE","DANGEROUS_DATA_URI_RE","UNSAFE_ATTR_RE","DANGEROUS_CSS_GLOBAL_RE","sanitizeHtml","html","safe","prev","isDangerousUrl","attrName","isDangerousCssValue","shallowEqual","keysA","keysB","objA","objB","getLIS","arr","predecessors","result","resultLen","val","lastIdx","left","right","mid","midIdx","leftIdx","lis","curr","HIGHLIGHT_DURATION_MS","HIGHLIGHT_TRANSITION","getInitialDebugState","flag","__vite_import_meta_env__","debugEnabled","debug","type","args","oldVal","newVal","target","highlightElement","prefix","message","rest","cause","HIGHLIGHT_CLASS","HIGHLIGHT_STYLE_ATTR","_highlightStyleRef","injectHighlightStyle","style","highlightTimers","highlightRafs","existingRaf","existingTimer","rafId","atom","initialValue","options","createAtom","nextTick","resolve","staticExtensions","computed","effect","batch","untracked","isComputed","AES_BOUND","BindingRegistry","node","res","fx","record","fn","descendants","child","registry","observer","observedRoot","enableAutoCleanup","root","mutations","mutation","disableAutoCleanup","registerReactiveEffect","source","updater","reactiveSource","INTERNAL_HANDLER","handlerMap","originals","getWrappedHandler","wrapped","wrapEventMap","map","newMap","handler","resolveOffEventMap","enablejQueryOverrides","orig","targets","types","disablejQueryOverrides","BindingFlags","instanceCounter","InputBinding","$el","formatted","currentVal","isFocused","start","end","debounce","parsed","applyInputBinding","binding","camelCache","getCamelCase","cached","htmlSanitizeCache","getSanitizedHtml","createContext","bindText","ctx","formatter","bindHtml","sanitized","bindClass","classMap","className","bindCss","cssMap","camel","unit","strVal","bindAttr","attrMap","bindProp","propMap","bindVisibility","condition","invert","visible","bindVal","cleanup","bindChecked","current","bindEvents","eventMap","bindOn","event","bindUnbind","classNameOrMap","propOrMap","nameOrMap","valOpts","insertOrAppend","nextNode","$container","render","bind","update","onAdd","onRemove","empty","getKey","item","_index","containerSelector","itemMap","removingKeys","oldKeys","$emptyEl","scheduleRemoval","entry","commitRemoval","removeItem","items","itemCount","safeEmpty","oldIndexMap","newKeys","newKeySet","newIndices","trKeys","trItems","trIdxs","oldItem","SEPARATOR","renderCount","renderResults","htmlParts","t","sanitizedFragments","combined","fragIdx","oldEl","lisArr","lisIdx","isInitial","childIdx","fragment","state","isNewItem","isReplaced","EMPTY_PROPS","component","props","teardown","err","safePushState","data","url","RouterImpl","config","eventName","renderEffect","routeName","defaultRoute","pathname","hash","qIndex","sp","params","routes","notFound","routeConfig","templateSelector","template","clonedContent","container","fromRoute","routeParams","currentUrl","newRoute","oldRouteName","oldRouteConfig","delegateHandler","routeAttr","activeClass","activeLinksEffect","links","isActive","currentRouteName","currentRouteConfig","resolved","route","NEVER_SETTLE","urlOrFn","defaultValue","transform","headers","ajaxOptions","onError","eager","getUrl","staticUrl","baseOptions","abortController","signal","reqOptions","xhr"],"mappings":"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"}
|