@but212/atom-effect-jquery 0.30.0 → 0.31.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 +12 -1
- package/dist/atom-effect-jquery.min.js +5 -10
- package/dist/atom-effect-jquery.min.js.map +1 -1
- package/dist/index.cjs +5 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +83 -85
- package/dist/index.mjs +1739 -1497
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["$"],"sources":["../../core/dist/index.mjs","../src/utils/index.ts","../src/constants.ts","../src/utils/debug.ts","../src/core/namespace.ts","../src/utils/pool.ts","../src/core/registry.ts","../src/core/dom.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/bindings/chainable.ts","../src/bindings/list/utils.ts","../src/bindings/list/context.ts","../src/bindings/list/diff.ts","../src/bindings/list/dom.ts","../src/bindings/list/index.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/index.ts"],"sourcesContent":["var u = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 256,\n RECOMPUTING: 512,\n HAS_ERROR: 1024,\n FORCE_COMPUTE: 2048,\n IDLE: 65536,\n PENDING: 131072,\n RESOLVED: 262144,\n REJECTED: 524288,\n ATOM_SYNC: 16777216,\n ATOM_NOTIFICATION_SCHEDULED: 33554432,\n EFFECT_EXECUTING: 268435456\n}, bt = Object.freeze({\n ASYNC_STATE: u.IDLE | u.PENDING | u.RESOLVED | u.REJECTED,\n COMPUTED_DIRTY_MASK: u.DIRTY | u.RECOMPUTING | u.FORCE_COMPUTE\n}), U = Object.freeze({\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}), S = Object.freeze({\n DISPOSED: u.DISPOSED,\n EXECUTING: u.EFFECT_EXECUTING\n}), Q = Object.freeze({\n DISPOSED: u.DISPOSED,\n IS_COMPUTED: u.IS_COMPUTED,\n DIRTY: u.DIRTY,\n IDLE: u.IDLE,\n PENDING: u.PENDING,\n RESOLVED: u.RESOLVED,\n REJECTED: u.REJECTED,\n RECOMPUTING: u.RECOMPUTING,\n HAS_ERROR: u.HAS_ERROR,\n FORCE_COMPUTE: u.FORCE_COMPUTE\n}), f = Object.freeze({\n DISPOSED: u.DISPOSED,\n SYNC: u.ATOM_SYNC,\n NOTIFICATION_SCHEDULED: u.ATOM_NOTIFICATION_SCHEDULED\n}), C = Object.freeze({\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}), k = 1073741823, Y = Object.freeze({\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3,\n LOOP_THRESHOLD: 100\n}), at = Object.freeze({ MAX_PROMISE_ID: k }), w = Object.freeze({\n UNINITIALIZED: -1,\n MIN: 1\n}), ot = !1;\ntry {\n ot = !!(typeof globalThis < \"u\" && globalThis.__ATOM_DEBUG__ || typeof sessionStorage < \"u\" && sessionStorage.getItem(\"__ATOM_DEBUG__\") === \"true\");\n} catch {\n}\nvar _ = (typeof process < \"u\" && process.env, typeof __DEV__ < \"u\" && !!__DEV__ || ot), et = Object.freeze([]), g = class V extends Error {\n constructor(e, s = null, i = !0, n) {\n super(e), this.cause = s, this.recoverable = i, this.code = n, this.name = \"AtomError\", Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);\n }\n getChain() {\n if (this.cause === null || this.cause === void 0) return [this];\n const e = [this], s = /* @__PURE__ */ new Set([this]);\n let i = this.cause;\n for (; i != null; ) {\n const n = s.has(i);\n if (e.push(i), n) break;\n if (s.add(i), i instanceof V) i = i.cause;\n else if (i instanceof Error && \"cause\" in i) i = i.cause;\n else break;\n }\n return e;\n }\n toJSON(e = /* @__PURE__ */ new Set()) {\n if (e.has(this)) return {\n name: this.name,\n message: \"[Circular Reference]\",\n recoverable: this.recoverable,\n code: this.code\n };\n e.add(this);\n let s = this.cause;\n return this.cause instanceof V ? s = this.cause.toJSON(e) : this.cause instanceof Error && (s = {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack,\n cause: this.cause.cause\n }), {\n name: this.name,\n message: this.message,\n code: this.code,\n recoverable: this.recoverable,\n stack: this.stack,\n cause: s\n };\n }\n static format(e, s, i) {\n return `${e} (${s}): ${i}`;\n }\n}, A = class extends g {\n constructor(...t) {\n super(...t), this.name = \"ComputedError\";\n }\n}, m = class extends g {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"EffectError\";\n }\n}, L = class extends g {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"SchedulerError\";\n }\n}, h = {\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_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\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_FLUSH_OVERFLOW: (t, e) => `Maximum flush iterations (${t}) exceeded. ${e} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\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 BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n};\nfunction O(t, e, s) {\n if (t instanceof g) return new e(g.format(t.name, s, t.message), t, t.recoverable, t.code);\n if (t instanceof Error) {\n const i = t.name || t.constructor.name || \"Error\";\n return new e(g.format(i, s, t.message), t);\n }\n return new e(g.format(\"Unexpected error\", s, String(t)), t);\n}\nvar st = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), ft = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), it = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), B = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), Et = \"[Atom Effect]\", dt = class {\n constructor() {\n this.enabled = !0, this.warnInfiniteLoop = Y.WARN_INFINITE_LOOP, this._updateCounts = /* @__PURE__ */ new Map(), this._nodeRegistry = /* @__PURE__ */ new Map(), this._threshold = Y.LOOP_THRESHOLD, this._cleanupScheduled = !1, this.warn = (t, e) => {\n this.enabled && t && console.warn(`${Et} ${e}`);\n }, this.registerNode = (t) => {\n this._nodeRegistry.set(t.id, new WeakRef(t));\n }, this.attachDebugInfo = (t, e, s, i) => {\n this.enabled && (Object.defineProperties(t, {\n [st]: {\n value: i ?? `${e}_${s}`,\n configurable: !0\n },\n [ft]: {\n value: s,\n configurable: !0\n },\n [it]: {\n value: e,\n configurable: !0\n }\n }), this.registerNode(t));\n }, this.trackUpdate = (t, e) => {\n if (!this.enabled || !this.warnInfiniteLoop) return;\n const s = this._updateCounts, i = (s.get(t) ?? 0) + 1;\n i > this._threshold ? this.warn(!0, `Infinite loop detected for ${e ?? `dependency ${t}`}. Over ${this._threshold} updates in a single execution scope.`) : s.set(t, i), this._cleanupScheduled || (this._cleanupScheduled = !0, Promise.resolve().then(() => {\n this._updateCounts.clear(), this._cleanupScheduled = !1;\n }));\n }, this.dumpGraph = () => {\n const t = [];\n for (const [e, s] of this._nodeRegistry) {\n const i = s.deref();\n i ? t.push({\n id: e,\n name: this.getDebugName(i),\n type: this.getDebugType(i),\n updateCount: this._updateCounts.get(e) ?? 0\n }) : (this._nodeRegistry.delete(e), this._updateCounts.delete(e));\n }\n return t;\n }, this.getDebugName = (t) => {\n if (t)\n return t[st];\n }, this.getDebugType = (t) => {\n if (t)\n return t[it];\n };\n }\n}, pt = {\n enabled: !1,\n warnInfiniteLoop: !1,\n warn: () => {\n },\n registerNode: () => {\n },\n attachDebugInfo: () => {\n },\n trackUpdate: () => {\n },\n dumpGraph: () => [],\n getDebugName: () => {\n },\n getDebugType: () => {\n }\n}, d = _ ? new dt() : pt, It = 1, Ct = () => It++ | 0, ut = class {\n constructor() {\n this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._count = 0, this._actualCount = 0, this._overflow = null, this._freeIndices = null;\n }\n _rawWrite(t, e) {\n if (t < 4) t === 0 ? this._s0 = e : t === 1 ? this._s1 = e : t === 2 ? this._s2 = e : this._s3 = e;\n else {\n this._overflow === null && (this._overflow = []);\n const s = this._overflow, i = t - 4;\n s[i] = e;\n }\n }\n _rawAdd(t) {\n if (this._s0 === null)\n return this._s0 = t, 0;\n if (this._s1 === null)\n return this._s1 = t, 1;\n if (this._s2 === null)\n return this._s2 = t, 2;\n if (this._s3 === null)\n return this._s3 = t, 3;\n this._overflow === null && (this._overflow = []);\n const e = this._overflow, s = this._freeIndices;\n if (s !== null && s.length > 0) {\n const i = s.pop();\n return e[i] = t, i + 4;\n }\n return e.push(t), 4 + e.length - 1;\n }\n _rawSwap(t, e) {\n if (t === e) return;\n const s = this.getAt(t), i = this.getAt(e);\n this._rawWrite(t, i), this._rawWrite(e, s);\n }\n get size() {\n return this._actualCount;\n }\n get physicalSize() {\n return this._count;\n }\n getAt(t) {\n return t < 4 ? t === 0 ? this._s0 : t === 1 ? this._s1 : t === 2 ? this._s2 : this._s3 : this._overflow?.[t - 4] ?? null;\n }\n setAt(t, e) {\n const s = this.getAt(t);\n s !== e && (this._rawWrite(t, e), s === null ? this._actualCount++ : e === null && this._actualCount--, e !== null && t >= this._count ? this._count = t + 1 : e === null && this._shrinkPhysicalSizeFrom(t));\n }\n _shrinkPhysicalSizeFrom(t) {\n if (t === this._count - 1)\n for (this._count--; this._count > 0 && this.getAt(this._count - 1) == null; ) this._count--;\n }\n truncateFrom(t) {\n t <= 3 && (t <= 0 && this._s0 !== null && (this._onItemRemoved(this._s0), this._s0 = null, this._actualCount--), t <= 1 && this._s1 !== null && (this._onItemRemoved(this._s1), this._s1 = null, this._actualCount--), t <= 2 && this._s2 !== null && (this._onItemRemoved(this._s2), this._s2 = null, this._actualCount--), t <= 3 && this._s3 !== null && (this._onItemRemoved(this._s3), this._s3 = null, this._actualCount--));\n const e = this._overflow;\n if (e !== null) {\n const s = t > 4 ? t - 4 : 0, i = e.length;\n for (let n = s; n < i; n++) {\n const r = e[n];\n r != null && (this._onItemRemoved(r), e[n] = null, this._actualCount--);\n }\n t <= 4 ? this._overflow = null : e.length = t - 4;\n }\n this._count = t, this._actualCount < 0 && (this._actualCount = 0), this._freeIndices = null;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n const e = this._rawAdd(t);\n return e >= this._count && (this._count = e + 1), this._actualCount++, e;\n }\n remove(t) {\n let e = -1;\n if (this._s0 === t) e = 0;\n else if (this._s1 === t) e = 1;\n else if (this._s2 === t) e = 2;\n else if (this._s3 === t) e = 3;\n else {\n const s = this._overflow;\n s !== null && (e = s.indexOf(t), e !== -1 && (e += 4));\n }\n return e !== -1 ? (this._rawWrite(e, null), this._shrinkPhysicalSizeFrom(e), this._actualCount--, e >= 4 && (this._freeIndices === null && (this._freeIndices = []), this._freeIndices.push(e - 4)), !0) : !1;\n }\n has(t) {\n if (this._actualCount === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const e = this._overflow;\n return e !== null ? e.indexOf(t) !== -1 : !1;\n }\n forEach(t) {\n const e = this._actualCount;\n if (e === 0) return;\n if (e === this._count) {\n this._s0 != null && t(this._s0), this._s1 != null && t(this._s1), this._s2 != null && t(this._s2), this._s3 != null && t(this._s3);\n const n = this._overflow;\n if (n !== null) for (let r = 0, o = n.length; r < o; r++) {\n const c = n[r];\n c != null && t(c);\n }\n return;\n }\n let s = 0;\n const i = this._count;\n for (let n = 0; n < i; n++) {\n const r = this.getAt(n);\n if (r != null && (t(r), ++s >= e))\n break;\n }\n }\n compact() {\n if (this._actualCount === this._count) return;\n let t = 0;\n const e = this._count;\n for (let s = 0; s < e; s++) {\n const i = this.getAt(s);\n i != null && (s !== t && (this._rawWrite(t, i), this._rawWrite(s, null)), t++);\n }\n this._count = this._actualCount, this._overflow !== null && (t <= 4 ? this._overflow = null : this._overflow.length = t - 4), this._freeIndices = null;\n }\n clear() {\n this._s0 = this._s1 = this._s2 = this._s3 = null, this._count = 0, this._actualCount = 0, this._overflow = null, this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, ht = class extends ut {\n constructor(...t) {\n super(...t), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n t.unsub?.();\n }\n setAt(t, e) {\n const s = this.getAt(t);\n super.setAt(t, e), this._map !== null && (s?.unsub && this._map.delete(s.node), e?.unsub && this._map.set(e.node, t));\n }\n claimExisting(t, e) {\n const s = this._count;\n if (s <= e) return !1;\n const i = this.getAt(e);\n if (i && i.node === t && i.unsub)\n return i.version = t.version, !0;\n if (this._map !== null || s - e > this._SCAN_THRESHOLD) return this._claimViaMap(t, e);\n for (let n = e + 1; n < s; n++) {\n const r = this.getAt(n);\n if (r && r.node === t && r.unsub)\n return r.version = t.version, this._rawSwap(n, e), !0;\n }\n return !1;\n }\n _claimViaMap(t, e) {\n this._map === null && (this._map = this._initMap());\n const s = this._map, i = s.get(t);\n if (i === void 0 || i < e) return !1;\n const n = this.getAt(i);\n if (n == null || !n.unsub) return !1;\n if (n.version = t.version, i !== e) {\n const r = this.getAt(e);\n this._rawSwap(i, e), s.set(t, e), r?.unsub && s.set(r.node, i);\n }\n return !0;\n }\n _initMap() {\n const t = /* @__PURE__ */ new Map();\n for (let e = 0; e < this._count; e++) {\n const s = this.getAt(e);\n s?.unsub && t.set(s.node, e);\n }\n return t;\n }\n insertNew(t, e) {\n const s = this.getAt(t);\n if (s !== null) {\n const i = this._rawAdd(s);\n i >= this._count && (this._count = i + 1), this._map !== null && s.unsub && this._map.set(s.node, i);\n }\n this._rawWrite(t, e), t >= this._count && (this._count = t + 1), this._actualCount++, this._map !== null && e.unsub && this._map.set(e.node, t);\n }\n add(t) {\n const e = super.add(t);\n return this._map !== null && t.unsub && this._map.set(t.node, e), e;\n }\n remove(t) {\n throw new Error(\"remove() prohibited\");\n }\n compact() {\n }\n truncateFrom(t) {\n super.truncateFrom(t), this._map !== null && (this._map = null);\n }\n disposeAll() {\n this.truncateFrom(0), this.hasComputeds = !1;\n }\n}, F = /* @__PURE__ */ Symbol.for(\"atom-effect/brand\"), p = {\n Atom: 1,\n Writable: 2,\n Computed: 4,\n Effect: 8\n};\nfunction q(t, e) {\n if (!t) return !1;\n const s = typeof t;\n return (s === \"object\" || s === \"function\") && !!((t[F] ?? 0) & e);\n}\nfunction At(t) {\n return q(t, p.Atom);\n}\nfunction yt(t) {\n return q(t, p.Computed);\n}\nfunction Rt(t) {\n return q(t, p.Effect);\n}\nfunction $(t) {\n if (t instanceof Promise) return !0;\n if (!t) return !1;\n const e = typeof t;\n return (e === \"object\" || e === \"function\") && typeof t.then == \"function\";\n}\nvar j = class {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}, gt = class {\n constructor(t = void 0, e = void 0) {\n this.fn = t, this.sub = e;\n }\n notify(t, e) {\n M(() => {\n const s = this.fn;\n s !== void 0 && s(t, e);\n const i = this.sub;\n i !== void 0 && i.execute();\n });\n }\n}, Dt = class {\n constructor() {\n this.current = null;\n }\n run(t, e) {\n if (this.current === t) return e();\n const s = this.current;\n this.current = t;\n try {\n const i = e();\n return _ && d.warn($(i), 'Detected Promise returned within tracking context. Dependencies accessed after \"await\" will NOT be tracked. Consider using synchronous tracking before the async boundary.'), i;\n } finally {\n this.current = s;\n }\n }\n}, l = new Dt();\nfunction M(t) {\n const e = l, s = e.current;\n if (s === null) return t();\n e.current = null;\n try {\n return t();\n } finally {\n e.current = s;\n }\n}\nvar K = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = w.UNINITIALIZED, this._nextEpoch = void 0, this._notifying = 0, this._hotIndex = -1, this._slots = null, this._deps = null, this.id = Ct() & k;\n }\n get isDisposed() {\n return (this.flags & Q.DISPOSED) !== 0;\n }\n get isComputed() {\n return (this.flags & Q.IS_COMPUTED) !== 0;\n }\n get hasError() {\n return !1;\n }\n subscribe(t) {\n const e = typeof t == \"function\";\n if (!e && (!t || typeof t.execute != \"function\")) throw O(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), g, h.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let s = this._slots;\n s || (s = new ut(), this._slots = s);\n let i = !1;\n if (s._s0 != null && (e ? s._s0.fn === t : s._s0.sub === t)) i = !0;\n else if (s._s1 != null && (e ? s._s1.fn === t : s._s1.sub === t)) i = !0;\n else if (s._s2 != null && (e ? s._s2.fn === t : s._s2.sub === t)) i = !0;\n else if (s._s3 != null && (e ? s._s3.fn === t : s._s3.sub === t)) i = !0;\n else {\n const r = s._overflow;\n if (r != null) for (let o = 0, c = r.length; o < c; o++) {\n const a = r[o];\n if (a != null && (e ? a.fn === t : a.sub === t)) {\n i = !0;\n break;\n }\n }\n }\n if (i)\n return _ && console.warn(`[atom-effect] Duplicate subscription ignored on node ${this.id}`), () => {\n };\n const n = new gt(e ? t : void 0, e ? void 0 : t);\n return s.add(n), () => this._unsubscribe(n);\n }\n _unsubscribe(t) {\n const e = this._slots;\n e && (e.remove(t), this._notifying === 0 && e.compact());\n }\n subscriberCount() {\n const t = this._slots;\n return t === null ? 0 : t.size;\n }\n _notifySubscribers(t, e) {\n const s = this._slots;\n if (!(s === null || s.size === 0)) {\n this._notifying++;\n try {\n let i = s._s0;\n if (i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s1, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s2, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n if (i = s._s3, i != null) try {\n i.notify(t, e);\n } catch (r) {\n this._logNotifyError(r);\n }\n const n = s._overflow;\n if (n != null) for (let r = 0, o = n.length; r < o; r++) {\n const c = n[r];\n if (c != null) try {\n c.notify(t, e);\n } catch (a) {\n this._logNotifyError(a);\n }\n }\n } finally {\n --this._notifying === 0 && s.compact();\n }\n }\n }\n _logNotifyError(t) {\n console.error(O(t, g, h.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n _isDirty() {\n const t = this._deps;\n if (t === null || t.size === 0) return !1;\n const e = this._hotIndex;\n if (e !== -1) {\n const s = t.getAt(e);\n if (s != null && s.node.version !== s.version) return !0;\n }\n return this._deepDirtyCheck();\n }\n}, H = 0;\nfunction J() {\n const t = H + 1 & k;\n return H = t === 0 ? 1 : t, H;\n}\nfunction W(t) {\n const e = t + 1 & k;\n return e === 0 ? 1 : e;\n}\nvar Z = 0, z = !1, ct = 0;\nfunction St() {\n return ct;\n}\nfunction nt() {\n return z ? (_ && console.warn(\"startFlush() called during flush - ignored\"), !1) : (z = !0, ct = J(), Z = 0, !0);\n}\nfunction rt() {\n z = !1;\n}\nfunction Tt() {\n if (!z) return 0;\n const t = ++Z;\n if (t <= C.MAX_EXECUTIONS_PER_FLUSH) return t;\n throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${C.MAX_EXECUTIONS_PER_FLUSH}`);\n}\nvar mt = class {\n constructor() {\n this._queueBuffer = [[], []], this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._isProcessing = !1, this._isFlushingSync = !1, this._batchDepth = 0, this._batchQueue = [], this._batchQueueSize = 0, this._maxFlushIterations = C.MAX_FLUSH_ITERATIONS, this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get queueSize() {\n return this._size + this._batchQueueSize;\n }\n get isBatching() {\n return this._batchDepth > 0;\n }\n schedule(t) {\n if (_ && typeof t != \"function\" && (!t || typeof t.execute != \"function\"))\n throw new L(h.SCHEDULER_CALLBACK_MUST_BE_FUNCTION);\n const e = this._epoch;\n if (t._nextEpoch === e) return;\n if (t._nextEpoch = e, this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n const s = this._queueBuffer[this._bufferIndex];\n s[this._size++] = t, this._isProcessing || this._flush();\n }\n _flush() {\n this._isProcessing || this._size === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = nt();\n this._drainQueue(), t && rt();\n } finally {\n this._isProcessing = !1;\n }\n }\n _flushSync() {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = this._isFlushingSync;\n this._isFlushingSync = !0;\n const e = nt();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = t, e && rt();\n }\n }\n _mergeBatchQueue() {\n const t = this._batchQueueSize;\n if (t === 0) return;\n this._epoch = this._epoch + 1 | 0;\n const e = this._epoch, s = this._batchQueue, i = this._queueBuffer[this._bufferIndex];\n let n = this._size;\n for (let r = 0; r < t; r++) {\n const o = s[r];\n o._nextEpoch !== e && (o._nextEpoch = e, i[n++] = o), s[r] = void 0;\n }\n this._size = n, this._batchQueueSize = 0, s.length > C.BATCH_QUEUE_SHRINK_THRESHOLD && (s.length = 0);\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0 || this._batchQueueSize > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._batchQueueSize > 0 && this._mergeBatchQueue(), this._size > 0 && this._processQueue();\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 = this._epoch + 1 | 0;\n for (let i = 0; i < s; i++) {\n const n = e[i];\n e[i] = void 0;\n try {\n typeof n == \"function\" ? n() : n.execute();\n } catch (r) {\n console.error(new L(\"Error occurred during scheduler execution\", r));\n }\n }\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n console.error(new L(h.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t))), this._size = 0, this._queueBuffer[0].length = 0, this._queueBuffer[1].length = 0, this._batchQueueSize = 0, this._batchQueue.length = 0;\n const e = this.onOverflow;\n if (e) try {\n e(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++;\n }\n endBatch() {\n if (this._batchDepth === 0) {\n _ && console.warn(h.SCHEDULER_END_BATCH_WITHOUT_START);\n return;\n }\n --this._batchDepth === 0 && (this._isFlushingSync || this._flushSync());\n }\n setMaxFlushIterations(t) {\n if (t < C.MIN_FLUSH_ITERATIONS) throw new L(`Max iterations must be at least ${C.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, N = new mt();\nfunction wt(t) {\n if (_ && typeof t != \"function\") throw new TypeError(h.BATCH_CALLBACK_MUST_BE_FUNCTION);\n N.startBatch();\n try {\n return t();\n } finally {\n N.endBatch();\n }\n}\nvar vt = class extends K {\n constructor(t, e) {\n super(), this[F] = p.Atom | p.Writable, this._value = t, this._equal = e.equal ?? Object.is, e.sync && (this.flags |= f.SYNC), d.attachDebugInfo(this, \"atom\", this.id, e.name);\n }\n get isNotificationScheduled() {\n return (this.flags & f.NOTIFICATION_SCHEDULED) !== 0;\n }\n get isSync() {\n return (this.flags & f.SYNC) !== 0;\n }\n get value() {\n const t = l.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const e = this._value;\n if (this._equal(e, t) || (this._value = t, this.version = W(this.version), d.trackUpdate(this.id, d.getDebugName(this)), (this.flags & f.NOTIFICATION_SCHEDULED) !== 0)) return;\n const s = this._slots;\n s == null || s.size === 0 || (this._pendingOldValue = e, this.flags |= f.NOTIFICATION_SCHEDULED, (this.flags & f.SYNC) !== 0 && !N.isBatching ? this._notifying === 0 && this._flushNotifications() : N.schedule(this));\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = f.NOTIFICATION_SCHEDULED, e = f.DISPOSED, s = f.SYNC;\n for (; (this.flags & (t | e)) === t; ) {\n const i = this._pendingOldValue;\n if (this._pendingOldValue = void 0, this.flags &= ~t, this._equal(this._value, i) || this._notifySubscribers(this._value, i), (this.flags & s) === 0 || N.isBatching) break;\n }\n }\n peek() {\n return this._value;\n }\n dispose() {\n const t = this.flags;\n (t & f.DISPOSED) === 0 && (this._slots?.clear(), this.flags = t | f.DISPOSED, this._value = void 0, this._pendingOldValue = void 0, this._equal = Object.is);\n }\n _deepDirtyCheck() {\n return !1;\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n};\nfunction Ft(t, e = {}) {\n return new vt(t, e);\n}\nvar { IDLE: D, DIRTY: E, PENDING: v, RESOLVED: I, REJECTED: T, HAS_ERROR: P, RECOMPUTING: y, DISPOSED: G, IS_COMPUTED: R, FORCE_COMPUTE: X } = Q, Ot = class extends K {\n constructor(t, e = {}) {\n if (typeof t != \"function\") throw new A(h.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[F] = p.Atom | p.Computed, this._error = null, this._promiseId = 0, this._deps = new ht(), this._trackEpoch = w.UNINITIALIZED, this._trackCount = 0, this._value = void 0, this.flags = R | E | D, this._equal = e.equal ?? Object.is, this._fn = t, this._defaultValue = \"defaultValue\" in e ? e.defaultValue : B, this._onError = e.onError ?? null, d.attachDebugInfo(this, \"computed\", this.id, e.name), e.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n get isDirty() {\n return (this.flags & E) !== 0;\n }\n get isRejected() {\n return (this.flags & T) !== 0;\n }\n get isRecomputing() {\n return (this.flags & y) !== 0;\n }\n get _hasErrorInternal() {\n return (this.flags & P) !== 0;\n }\n _track() {\n l.current?.addDependency(this);\n }\n get value() {\n const t = l.current;\n t?.addDependency(this);\n let e = this.flags;\n if ((e & (I | E | D)) === I) return this._value;\n if ((e & G) !== 0) throw new A(h.COMPUTED_DISPOSED);\n if ((e & y) !== 0) {\n const n = this._defaultValue;\n if (n !== B) return n;\n throw new A(h.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if ((e & (E | D)) !== 0) {\n const n = this._deps;\n if ((e & D) === 0 && (e & X) === 0 && n.size > 0 && !this._isDirty() ? e = this.flags &= ~E : (this._recompute(), e = this.flags), (e & I) !== 0) return this._value;\n }\n const s = this._defaultValue, i = s !== B;\n if ((e & v) !== 0) {\n if (i) return s;\n throw new A(h.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if ((e & T) !== 0) {\n if (i) return s;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n const t = l.current;\n t?.addDependency(this);\n const e = this.flags;\n return (e & I) !== 0 ? U.RESOLVED : (e & v) !== 0 ? U.PENDING : (e & T) !== 0 ? U.REJECTED : U.IDLE;\n }\n get hasError() {\n const t = l.current;\n if (t?.addDependency(this), (this.flags & (T | P)) !== 0) return !0;\n const e = this._deps;\n return e.hasComputeds ? M(() => {\n const s = e.size;\n for (let i = 0; i < s; i++) if (e.getAt(i)?.node.hasError) return !0;\n return !1;\n }) : !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n const t = l.current;\n t?.addDependency(this);\n const e = this._error, s = this._deps;\n if (!s.hasComputeds)\n return e == null ? et : Object.freeze([e]);\n const i = [];\n return e != null && i.push(e), M(() => {\n const n = s.size;\n for (let r = 0; r < n; r++) {\n const o = s.getAt(r)?.node;\n o != null && (o.flags & R) !== 0 && this._accumulateErrors(o, i);\n }\n }), i.length === 0 ? et : Object.freeze(i);\n }\n _accumulateErrors(t, e) {\n const s = t._error;\n s != null && !e.includes(s) && e.push(s);\n const i = t._deps;\n if (!i.hasComputeds) return;\n const n = i.size;\n for (let r = 0; r < n; r++) {\n const o = i.getAt(r)?.node;\n o != null && (o.flags & R) !== 0 && this._accumulateErrors(o, e);\n }\n }\n get lastError() {\n const t = l.current;\n return t?.addDependency(this), this._error;\n }\n get isPending() {\n const t = l.current;\n return t?.addDependency(this), (this.flags & v) !== 0;\n }\n get isResolved() {\n const t = l.current;\n return t?.addDependency(this), (this.flags & I) !== 0;\n }\n invalidate() {\n this.flags |= X, this._markDirty();\n }\n dispose() {\n (this.flags & G) === 0 && (this._deps.disposeAll(), this._slots != null && this._slots.clear(), this.flags = G | E | D, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n const e = this._trackEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._trackCount++, i = this._deps, n = i.getAt(s);\n if (n != null && n.node === t) n.version = t.version;\n else if (!i.claimExisting(t, s)) {\n const r = new j(t, t.version, t.subscribe(this));\n i.insertNew(s, r);\n }\n (t.flags & R) !== 0 && (i.hasComputeds = !0);\n }\n _recompute() {\n if (this.isRecomputing) return;\n this.flags = (this.flags | y) & ~X, this._trackEpoch = J(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const e = l.run(this, this._fn);\n this._deps.truncateFrom(this._trackCount), t = !0, $(e) ? this._handleAsyncComputation(e) : this._finalizeResolution(e);\n } catch (e) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch (s) {\n _ && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", s);\n }\n this._handleError(e, h.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = w.UNINITIALIZED, this._trackCount = 0, this.flags &= ~y;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | v) & ~(D | E | I | T), this._notifySubscribers(void 0, void 0), this._promiseId = (this._promiseId + 1) % at.MAX_PROMISE_ID;\n const e = this._promiseId;\n t.then((s) => {\n if (e === this._promiseId) {\n if (this._isDirty()) return this._markDirty();\n this._finalizeResolution(s), this._notifySubscribers(s, void 0);\n }\n }, (s) => e === this._promiseId && this._handleError(s, h.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, e, s = !1) {\n const i = O(t, A, e);\n if ((!this.isRejected || this._error !== i) && (this.version = W(this.version)), this._error = i, this.flags = this.flags & ~(D | E | v | I) | T | P, this._onError) try {\n this._onError(i);\n } catch (n) {\n console.error(h.CALLBACK_ERROR_IN_ERROR_HANDLER, n);\n }\n if (this._notifySubscribers(void 0, void 0), s) throw i;\n }\n _finalizeResolution(t) {\n const e = this.flags;\n ((e & I) === 0 || !this._equal(this._value, t)) && (this.version = W(this.version)), this._value = t, this._error = null, this.flags = (e | I) & ~(D | E | v | T | P);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n const t = this.flags;\n (t & (y | E)) === 0 && (this.flags = t | E, d.trackUpdate(this.id, d.getDebugName(this)), this._notifySubscribers(void 0, void 0));\n }\n _deepDirtyCheck() {\n const t = this._deps;\n return M(() => {\n const e = t.size;\n for (let s = 0; s < e; s++) {\n const i = t.getAt(s);\n if (i == null) continue;\n const n = i.node;\n if ((n.flags & R) !== 0) try {\n n.value;\n } catch {\n _ && console.warn(`[atom-effect] Dependency #${n.id} threw during dirty check`);\n }\n if (n.version !== i.version)\n return this._hotIndex = s, !0;\n }\n return this._hotIndex = -1, !1;\n });\n }\n};\nfunction Ut(t, e = {}) {\n return new Ot(t, e);\n}\nvar Nt = class extends K {\n constructor(t, e = {}) {\n super(), this[F] = p.Effect, this._cleanup = null, this._deps = new ht(), this._currentEpoch = w.UNINITIALIZED, this._lastFlushEpoch = w.UNINITIALIZED, this._fn = t, this._onError = e.onError ?? null, this._sync = e.sync ?? !1, this._maxExecutions = e.maxExecutionsPerSecond ?? C.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = e.maxExecutionsPerFlush ?? C.MAX_EXECUTIONS_PER_EFFECT, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => N.schedule(this), d.attachDebugInfo(this, \"effect\", this.id, e.name);\n }\n run() {\n if (this.isDisposed) throw new m(h.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.isDisposed || (this.flags |= S.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n [Symbol.dispose]() {\n this.dispose();\n }\n addDependency(t) {\n if ((this.flags & S.EXECUTING) === 0) return;\n const e = this._currentEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._trackCount++, i = this._deps;\n let n;\n switch (s) {\n case 0:\n n = i._s0;\n break;\n case 1:\n n = i._s1;\n break;\n case 2:\n n = i._s2;\n break;\n case 3:\n n = i._s3;\n break;\n default:\n n = i.getAt(s);\n }\n n != null && n.node === t ? n.version = t.version : i.claimExisting(t, s) || this._insertNewDependency(t, s), t.isComputed && (i.hasComputeds = !0);\n }\n _insertNewDependency(t, e) {\n let s;\n try {\n const i = t.subscribe(this._notifyCallback);\n s = new j(t, t.version, i);\n } catch (i) {\n const n = O(i, m, h.EFFECT_EXECUTION_FAILED);\n if (console.error(n), this._onError) try {\n this._onError(n);\n } catch {\n }\n s = new j(t, t.version, void 0);\n }\n this._deps.insertNew(e, s);\n }\n execute(t = !1) {\n const e = this.flags;\n if ((e & (S.DISPOSED | S.EXECUTING)) !== 0) return;\n const s = this._deps;\n if (!t && s.size > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), d.trackUpdate(this.id, d.getDebugName(this)), this.flags = e | S.EXECUTING, this._execCleanup(), this._currentEpoch = J(), this._trackCount = 0, s.prepareTracking(), this._hotIndex = -1;\n let i = !1;\n try {\n const n = l.run(this, this._fn);\n s.truncateFrom(this._trackCount), i = !0, $(n) ? this._handleAsyncResult(n) : this._cleanup = typeof n == \"function\" ? n : null;\n } catch (n) {\n if (!i) try {\n s.truncateFrom(this._trackCount);\n } catch (r) {\n _ && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", r);\n }\n this._handleExecutionError(n), this._cleanup = null;\n } finally {\n this.flags &= ~S.EXECUTING;\n }\n }\n _handleAsyncResult(t) {\n const e = ++this._execId;\n t.then((s) => {\n if (e !== this._execId || this.isDisposed) {\n if (typeof s == \"function\") try {\n s();\n } catch (i) {\n this._handleExecutionError(i, h.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof s == \"function\" && (this._cleanup = s);\n }, (s) => e === this._execId && this._handleExecutionError(s));\n }\n _deepDirtyCheck() {\n const t = l.current;\n l.current = null;\n const e = this._deps;\n try {\n const s = e.size;\n for (let i = 0; i < s; i++) {\n const n = e.getAt(i);\n if (n == null) continue;\n const r = n.node;\n if (r.isComputed && this._tryPullComputed(r), r.version !== n.version)\n return this._hotIndex = i, !0;\n }\n return !1;\n } finally {\n l.current = t;\n }\n }\n _tryPullComputed(t) {\n try {\n t.value;\n } catch {\n _ && console.warn(`[atom-effect] Dependency #${t.id} threw during dirty check`);\n }\n }\n _execCleanup() {\n const t = this._cleanup;\n if (t != null) {\n this._cleanup = null;\n try {\n t();\n } catch (e) {\n this._handleExecutionError(e, h.EFFECT_CLEANUP_FAILED);\n }\n }\n }\n _checkInfiniteLoops() {\n const t = St();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), Tt() > C.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++, _ && this._checkFrequencyLimit();\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= Y.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const e = new m(h.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(e), e;\n }\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & S.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const e = new m(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${Z}`);\n throw this.dispose(), console.error(e), e;\n }\n _handleExecutionError(t, e = h.EFFECT_EXECUTION_FAILED) {\n const s = O(t, m, e);\n if (console.error(s), this._onError) try {\n this._onError(s);\n } catch (i) {\n console.error(O(i, m, h.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Lt(t, e = {}) {\n if (typeof t != \"function\") throw new m(h.EFFECT_MUST_BE_FUNCTION);\n const s = new Nt(t, e);\n return s.execute(), s;\n}\nfunction lt(t, e, s, i) {\n if (s === e.length) return i;\n const n = e[s], r = t != null && typeof t == \"object\" ? t : {}, o = r[n], c = lt(o, e, s + 1, i);\n if (Object.is(o, c)) return t;\n if (Array.isArray(r)) {\n const a = r.slice(), b = Number.parseInt(n, 10);\n return Number.isNaN(b) ? a[n] = c : a[b] = c, a;\n }\n return {\n ...r,\n [n]: c\n };\n}\nfunction x(t, e) {\n let s = t;\n const i = e.length;\n for (let n = 0; n < i; n++) {\n if (s == null) return;\n s = s[e[n]];\n }\n return s;\n}\nfunction _t(t, e) {\n const s = e.includes(\".\") ? e.split(\".\") : [e], i = /* @__PURE__ */ new Set(), n = () => {\n i.forEach((r) => r()), i.clear();\n };\n return {\n get value() {\n return x(t.value, s);\n },\n set value(r) {\n const o = t.peek(), c = lt(o, s, 0, r);\n c !== o && (t.value = c);\n },\n peek: () => x(t.peek(), s),\n subscribe(r) {\n const o = t.subscribe((c, a) => {\n const b = x(c, s), tt = x(a, s);\n Object.is(b, tt) || r(b, tt);\n });\n return i.add(o), () => {\n o(), i.delete(o);\n };\n },\n subscriberCount: () => i.size,\n dispose: n,\n [Symbol.dispose]: n,\n [F]: p.Atom | p.Writable\n };\n}\nvar Pt = (t, e) => _t(t, e), xt = (t) => (e) => _t(t, e);\nexport {\n U as AsyncState,\n g as AtomError,\n A as ComputedError,\n Y as DEBUG_CONFIG,\n m as EffectError,\n C as SCHEDULER_CONFIG,\n L as SchedulerError,\n Ft as atom,\n _t as atomLens,\n wt as batch,\n Pt as composeLens,\n Ut as computed,\n Lt as effect,\n x as getPathValue,\n N as globalScheduler,\n At as isAtom,\n yt as isComputed,\n Rt as isEffect,\n xt as lensFor,\n d as runtimeDebug,\n lt as setDeepValue,\n M as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","import type { ReadonlyAtom } from '@but212/atom-effect';\nimport { isAtom } from '@but212/atom-effect';\nimport type { RenderRoute, RouteDefinition, TemplateRoute } from '@/types';\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\nconst isObject = (v: unknown): v is object => v !== null && typeof v === 'object';\n\n// ============================================================================\n// Reactive helpers\n// ============================================================================\n\n/** Checks if a given value is a reactive node (Atom or Computed). */\nexport const isReactive = (v: unknown): v is ReadonlyAtom<unknown> => isAtom(v);\n\n/**\n * Checks if value is a Promise or Thenable.\n */\nexport const isPromise = <T>(v: unknown): v is Promise<T> =>\n (isObject(v) || typeof v === 'function') &&\n typeof (v as Record<string, unknown>).then === 'function';\n\n/** Generates a human-readable selector string for debug. */\nexport function getSelector(el: Element): string {\n const { localName: tag, id, className } = el;\n let res = tag;\n if (id) res += `#${id}`;\n\n // Handle SVG className which returns SVGAnimatedString instead of string\n const classStr =\n typeof className === 'string'\n ? className\n : (className as unknown as { baseVal: string }).baseVal;\n\n if (typeof classStr === 'string') {\n const trimmed = classStr.trim();\n if (trimmed) {\n res += `.${trimmed.replace(/\\s+/g, '.')}`;\n }\n }\n\n // Include type attribute for inputs/buttons for extra context\n const type = (el as HTMLInputElement | HTMLButtonElement).type;\n if (type && typeof type === 'string' && type !== 'text') {\n res += `.${type}`;\n }\n\n return res;\n}\n\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\nexport const isTemplateRoute = (r: RouteDefinition): r is TemplateRoute =>\n isObject(r) && 'template' in r && typeof r.template === 'string';\n\nexport const isRenderRoute = (r: RouteDefinition): r is RenderRoute =>\n isObject(r) && 'render' in r && typeof r.render === 'function';\n\n/**\n * Shallow equality check for objects.\n * Handles NaN correctly using Object.is.\n */\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (!isObject(a) || !isObject(b)) return false;\n\n const objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n\n const keysA = Object.keys(objA);\n const keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!hasOwn.call(objB, key) || !Object.is(objA[key], objB[key])) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * Constants for atom-effect-jquery\n */\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 ROUTE: '[atom-route]',\n BINDING: '[atom-binding]',\n LIST: '[atom-list]',\n MOUNT: '[atom-mount]',\n} as const;\n\nexport const ROUTE_DEFAULTS = Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n} as const);\n\nexport const INPUT_DEFAULTS = Object.freeze({ EVENT: 'input', DEBOUNCE: 0 } as const);\nexport const DEBUG_DEFAULTS = Object.freeze({ HIGHLIGHT_DURATION_MS: 500 } as const);\n\nexport const VALID_INPUT_TAGS: ReadonlySet<string> = new Set(['input', 'select', 'textarea']);\n\nexport const URL_PROPS: ReadonlySet<string> = new Set([\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n]);\n\nexport const DANGEROUS_PROPS: ReadonlySet<string> = new Set([\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n]);\n\n/** Regex-like pattern for dangerous protocols (javascript, vbscript) with optional whitespace. */\nexport const DANGEROUS_PROTOCOL_PATTERN =\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)';\n\n/**\n * Centralized error messages for the entire library.\n * Structured by subsystem to facilitate easy debugging and consistent error reporting.\n *\n * Each entry is a function that takes dynamic data (e.g. element name) to produce\n * a human-readable and actionable error message.\n */\nexport const ERROR_MESSAGES = {\n /** Errors related to the SPA Router. */\n ROUTE: {\n NOT_FOUND: (n: string) => `Route \"${n}\" not found and no notFound route configured`,\n TEMPLATE_NOT_FOUND: (s: string) => `Template \"${s}\" not found`,\n TARGET_NOT_FOUND: (s: string) => `Target element \"${s}\" not found`,\n MALFORMED_URI: (r: string) => `Malformed URI component: ${r}`,\n },\n /** Security-related errors, specifically from the CSS/HTML sanitizer. */\n SECURITY: {\n UNSAFE_CONTENT: () => 'Unsafe content neutralized during sanitization.',\n BLOCKED_CSS_VALUE: (p: string) => `Blocked dangerous value in CSS style property \"${p}\".`,\n BLOCKED_EVENT_HANDLER: (n: string) =>\n `Blocked setting dangerous event handler attribute/property \"${n}\".`,\n BLOCKED_PROTOCOL: (n: string) => `Blocked dangerous protocol in \"${n}\".`,\n BLOCKED_PROP: (n: string) =>\n `Blocked setting dangerous property \"${n}\". Use html binding for sanitized HTML.`,\n },\n /** General errors from reactive bindings (text, map, input, etc). */\n BINDING: {\n INVALID_INPUT_ELEMENT: (t: string) => `Val binding used on non-input element <${t}>.`,\n MISSING_SOURCE: (m: string) => `[${m}] source is required when prop/name is a string.`,\n MISSING_CONDITION: (m: string) => `[${m}] condition is required when className is a string.`,\n UPDATER_ERROR: (d: string, s?: boolean) =>\n `Updater threw in binding \"${d}\"${s ? ' (static)' : ''}`,\n CLEANUP_ERROR: (i?: string) => `Binding cleanup error${i ? `: ${i}` : ''}`,\n PARSE_ERROR: (d?: string) => `parse() threw during DOM→Atom sync${d ? `: ${d}` : ''}`,\n },\n /** Errors specific to atomList rendering and reconciliation. */\n LIST: {\n DUPLICATE_KEY: (k: string | number, i: number, c: string) =>\n `Duplicate key \"${k}\" at index ${i} in atomList <${c}>.`,\n },\n /** Lifecycle errors from atomMount/atomUnmount. */\n MOUNT: {\n ERROR: (n?: string) => `Mount error${n ? ` in component <${n}>` : ''}`,\n CLEANUP_ERROR: (n?: string) => `Cleanup error${n ? ` in component <${n}>` : ''}`,\n },\n /** Internal architectural errors from the core engine or registry. */\n CORE: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Effect dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n","import { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\n// ============================================================================\n// Constants & Configuration\n// ============================================================================\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nconst ATTR_MARKER = 'data-atom-debug';\nconst IS_BROWSER = typeof window !== 'undefined';\n\n/** Shared timer maps to track active animations and timeouts on elements. */\nconst timers = new WeakMap<Element, ReturnType<typeof setTimeout>>();\nconst rafs = new WeakMap<Element, number>();\n\nlet styleInjected = false;\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/** Calculates the CSS transition duration based on configuration. */\nconst getTransitionDuration = () => `${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s`;\n\n/** Returns the necessary CSS for visual debugging. */\nconst getHighlightStyles = () =>\n `\n [${ATTR_MARKER}] {\n transition: outline ${getTransitionDuration()} ease-out;\n }\n .${HIGHLIGHT_CLASS} {\n outline: 2px solid rgba(255, 68, 68, 0.8);\n outline-offset: 1px;\n }\n`.replace(/\\s+/g, ' ');\n\n/** Injects necessary CSS for highlighting to the document head. */\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n\n // Double check existence in case of multiple debug modules or manual removal\n if (document.querySelector(`style[${ATTR_MARKER}]`)) {\n styleInjected = true;\n return;\n }\n\n const style = document.createElement('style');\n style.setAttribute(ATTR_MARKER, '');\n style.textContent = getHighlightStyles();\n document.head.appendChild(style);\n styleInjected = true;\n}\n\n/** Determines the initial debug state of the application. */\nfunction resolveInitialState(): boolean {\n const g = globalThis as {\n __ATOM_DEBUG__?: boolean;\n __DEV__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n // 1. Explicit global override or sessionStorage (supports runtime toggling in builds)\n if (typeof g.__ATOM_DEBUG__ !== 'undefined') return !!g.__ATOM_DEBUG__;\n try {\n if (\n typeof sessionStorage !== 'undefined' &&\n sessionStorage.getItem('__ATOM_DEBUG__') === 'true'\n )\n return true;\n } catch {}\n\n // 2. Node.js / Bundler environment check\n if (g.process?.env?.NODE_ENV !== 'production' && g.process?.env?.NODE_ENV !== undefined) {\n return true;\n }\n\n // 3. __DEV__ flag (often injected by bundlers)\n if (typeof g.__DEV__ !== 'undefined') return !!g.__DEV__;\n\n // 4. Vite/Meta specific\n try {\n if (import.meta.env?.DEV) return true;\n if (import.meta.env?.VITE_ATOM_DEBUG === 'true') return true;\n } catch {}\n\n return false;\n}\n\n// ============================================================================\n// DebugController\n// ============================================================================\n\nexport interface DebugConfig {\n enabled: boolean;\n log(prefix: string, ...args: unknown[]): void;\n atomChanged(prefix: string, name: string | undefined, prev: unknown, next: unknown): void;\n domUpdated(prefix: string, target: Element | JQuery<Element>, type: string, value: unknown): void;\n cleanup(prefix: string, subject: string): void;\n warn(prefix: string, message: string, ...rest: unknown[]): void;\n error(prefix: string, message: string, cause: unknown): void;\n}\n\nclass DevDebugController implements DebugConfig {\n public enabled = true;\n\n public log(prefix: string, ...args: unknown[]): void {\n if (!this.enabled) return;\n console.log(prefix, ...args);\n }\n\n public atomChanged(prefix: string, name: string | undefined, prev: unknown, next: unknown): void {\n if (!this.enabled) return;\n console.log(`${prefix} Atom \"${name ?? 'anonymous'}\" changed:`, prev, '→', next);\n }\n\n public cleanup(prefix: string, subject: string): void {\n if (!this.enabled) return;\n console.log(`${prefix} Cleanup: ${subject}`);\n }\n\n public warn(prefix: string, message: string, ...rest: unknown[]): void {\n console.warn(`${prefix} ${message}`, ...rest);\n }\n\n public error(prefix: string, message: string, cause: unknown): void {\n console.error(`${prefix} ${message}`, cause);\n }\n\n public domUpdated(\n prefix: string,\n target: Element | JQuery<Element>,\n type: string,\n value: unknown\n ): void {\n if (!this.enabled) return;\n // Resolve element from target (supports HTMLElement, SVGElement, or JQuery wrapper)\n const el = 'jquery' in target ? target[0] : target;\n\n // Only proceed if it is a connected Element node\n if (el && el.nodeType === 1 && el.isConnected) {\n console.log(`${prefix} DOM updated: ${getSelector(el as Element)}.${type} =`, value);\n this._triggerVisualHighlight(el as Element);\n }\n }\n\n /** Applies a visual outline highlight to an element with a fade-out transition. */\n private _triggerVisualHighlight(el: Element): void {\n const g = globalThis;\n const raf = g.requestAnimationFrame;\n const caf = g.cancelAnimationFrame;\n\n if (!IS_BROWSER || typeof raf !== 'function') return;\n injectStyle();\n\n // Cancel existing scheduled highlights on this element\n const existingRaf = rafs.get(el);\n const existingTimer = timers.get(el);\n if (existingRaf !== undefined && typeof caf === 'function') caf(existingRaf);\n if (existingTimer !== undefined) {\n clearTimeout(existingTimer);\n timers.delete(el);\n }\n\n // Apply the marker attribute if not present to enable the CSS transition\n if (!el.hasAttribute(ATTR_MARKER)) {\n el.setAttribute(ATTR_MARKER, '');\n }\n\n // Use requestAnimationFrame to ensure the class change happens in the next paint cycle\n rafs.set(\n el,\n raf(() => {\n rafs.delete(el);\n if (!el.isConnected) return;\n\n el.classList.add(HIGHLIGHT_CLASS);\n\n // Schedule removal\n timers.set(\n el,\n setTimeout(() => {\n // Remove the highlight class. The outline will fade out smoothly\n // because the [data-atom-debug] transition remains active.\n el.classList.remove(HIGHLIGHT_CLASS);\n timers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n })\n );\n }\n}\n\n/**\n * Inert implementation for production.\n */\nconst ProdDebugController: DebugConfig = {\n enabled: false,\n log: () => {},\n atomChanged: () => {},\n domUpdated: () => {},\n cleanup: () => {},\n warn: (prefix: string, message: string, ...rest: unknown[]) =>\n console.warn(`${prefix} ${message}`, ...rest),\n error: (prefix: string, message: string, cause: unknown) =>\n console.error(`${prefix} ${message}`, cause),\n};\n\n/**\n * Global debug controller singleton.\n * Swaps between Dev and Prod implementations for zero overhead in production.\n */\nexport const debug: DebugConfig = resolveInitialState()\n ? new DevDebugController()\n : ProdDebugController;\n","import {\n atomLens,\n batch,\n composeLens,\n computed,\n atom as createAtom,\n effect,\n isAtom,\n isComputed,\n lensFor,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\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';\nimport { debug } from '@/utils/debug';\n\n// ============================================================================\n// atom factory + debug namespace\n// ============================================================================\n\n/**\n * Local wrapper around core's `atom` factory.\n *\n * This wrapper exists to attach the `$.atom.debug` accessor directly to the\n * function object at runtime. TypeScript requires a double cast for this\n * augmentation, but `NamespaceExtensions` ensures all other fields are type-safe.\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>(v: T, opts?: AtomOptions): WritableAtom<T> {\n return createAtom(v, opts);\n}\n\nObject.defineProperty(atom, 'debug', {\n enumerable: true,\n configurable: true,\n get: () => debug.enabled,\n set: (v: boolean) => {\n debug.enabled = v;\n },\n});\n\n/** Resolves after microtask effects flush. Fast Promise-based scheduling. */\nexport const nextTick = (): Promise<void> => Promise.resolve();\n\n// Register static extensions to jQuery\n$.extend({\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 atomLens,\n composeLens,\n lensFor,\n});\n","import type { EffectObject } from '@/types';\n\n// ============================================================================\n// ArrayPool\n// ============================================================================\n\n/**\n * Array pool for reusing temporarily allocated arrays to avoid GC pressure.\n *\n * @template T - Element type.\n */\nexport class ArrayPool<T> {\n private readonly pool: T[][] = [];\n\n constructor(\n private readonly limit = 50,\n private readonly capacity = 256\n ) {}\n\n /** Acquires array from pool or returns a new one. */\n acquire(): T[] {\n return this.pool.pop() ?? [];\n }\n\n /** Releases array back to pool if within capacity and limit. */\n release(arr: T[]): void {\n if (Object.isFrozen(arr)) return;\n\n const length = arr.length;\n // Always clear the array to help GC by breaking references,\n // even if it won't be stored in the pool.\n arr.length = 0;\n\n if (this.pool.length < this.limit && length <= this.capacity) {\n // Basic double-release protection. indexOf is O(N) but pool size is small.\n if (this.pool.indexOf(arr) === -1) {\n this.pool.push(arr);\n }\n }\n }\n\n /** Clears the pool. */\n reset(): void {\n this.pool.length = 0;\n }\n}\n\n// ============================================================================\n// ObjectPool\n// ============================================================================\n\n/**\n * Generic object pool for reusing fixed-shape plain objects.\n *\n * Design constraints:\n * - Pooled objects MUST have a fixed property shape (monomorphic).\n * Mixing shapes in a single pool will de-optimize V8's hidden classes.\n * - The `reset` callback MUST restore the object to a clean, reusable state.\n * Failing to do so leaks stale references and causes subtle bugs.\n * - The pool is LIFO (stack) for better CPU cache locality.\n *\n * @template T - Object type to pool. Must be a plain object with a fixed shape.\n */\nexport class ObjectPool<T extends object> {\n private readonly pool: T[] = [];\n\n constructor(\n private readonly factory: () => T,\n private readonly reset: (obj: T) => void,\n private readonly limit = 64\n ) {}\n\n /** Acquires object from pool or creates a new one. */\n acquire(): T {\n return this.pool.pop() ?? this.factory();\n }\n\n /** Releases object back to pool after reset. */\n release(obj: T): void {\n if (Object.isFrozen(obj)) return;\n\n // Always reset the object to help GC by breaking references,\n // even if it won't be stored in the pool.\n this.reset(obj);\n\n if (this.pool.length < this.limit) {\n // Basic double-release protection. indexOf is O(N) but pool size is small.\n if (this.pool.indexOf(obj) === -1) {\n this.pool.push(obj);\n }\n }\n }\n\n /** Drains all retained objects. */\n drain(): void {\n if (this.pool.length > 0) {\n this.pool.length = 0;\n }\n }\n\n get size(): number {\n return this.pool.length;\n }\n}\n\n// ============================================================================\n// Specialized Pools\n// ============================================================================\n\n/** Limit synchronized with bindingRecordPool to ensure constituent arrays are also pooled. */\nconst SHARED_LIMIT = 128;\n\nexport const effectsArrayPool = new ArrayPool<EffectObject>(SHARED_LIMIT);\nexport const cleanupsArrayPool = new ArrayPool<() => void>(SHARED_LIMIT);\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 */\nexport interface BindingRecord {\n effects: EffectObject[] | undefined;\n cleanups: Array<() => void> | undefined;\n componentCleanup: (() => void) | undefined;\n}\n\n/**\n * Pool for BindingRecord objects.\n * Orchestrates constituent array pools during reset to prevent resource leaks.\n */\nexport const bindingRecordPool = new ObjectPool<BindingRecord>(\n () => ({\n effects: undefined,\n cleanups: undefined,\n componentCleanup: undefined,\n }),\n (r) => {\n // Orchestration: Proactively dispose all effects and execute cleanups.\n // This is defensive; registry.ts handles primary cleanup with logging.\n if (r.effects) {\n const len = r.effects.length;\n for (let i = 0; i < len; i++) {\n try {\n r.effects[i]!.dispose();\n } catch {\n /* ignore */\n }\n }\n effectsArrayPool.release(r.effects);\n r.effects = undefined;\n }\n\n if (r.cleanups) {\n const len = r.cleanups.length;\n for (let i = 0; i < len; i++) {\n try {\n r.cleanups[i]!();\n } catch {\n /* ignore */\n }\n }\n cleanupsArrayPool.release(r.cleanups);\n r.cleanups = undefined;\n }\n\n if (r.componentCleanup) {\n try {\n r.componentCleanup();\n } catch {\n /* ignore */\n }\n r.componentCleanup = undefined;\n }\n },\n SHARED_LIMIT\n);\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport {\n type BindingRecord,\n bindingRecordPool,\n cleanupsArrayPool,\n effectsArrayPool,\n} from '@/utils/pool';\n\nlet autoCleanupScheduled = false;\n\n/**\n * Ensures that the MutationObserver for automatic cleanup is active.\n * Lazily triggered on the first reactive binding registration.\n */\nfunction ensureAutoCleanup(): void {\n if (autoCleanupScheduled) return;\n if (typeof document !== 'undefined' && document.body) {\n autoCleanupScheduled = true;\n enableAutoCleanup(document.body);\n }\n}\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// BindingRecord type is defined in @/internal/pool to co-locate with its ObjectPool.\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 private preservedNodes = new WeakSet<Node>();\n private ignoredNodes = new WeakSet<Node>();\n\n keep(node: Node): void {\n this.preservedNodes.add(node);\n }\n isKept(node: Node): boolean {\n return this.preservedNodes.has(node);\n }\n markIgnored(node: Node): void {\n this.ignoredNodes.add(node);\n }\n isIgnored(node: Node): boolean {\n return this.ignoredNodes.has(node);\n }\n\n private getOrCreateRecord(el: Element): BindingRecord {\n ensureAutoCleanup();\n let res = this.records.get(el);\n if (!res) {\n res = bindingRecordPool.acquire();\n this.records.set(el, res);\n el.classList.add(AES_BOUND);\n }\n return res;\n }\n\n /**\n * Registers a reactive effect with an element's record.\n * Effects are automatically disposed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the effect to.\n * @param fx - The reactive effect instance.\n */\n trackEffect(el: Element, fx: EffectObject): void {\n const record = this.getOrCreateRecord(el);\n if (!record.effects) {\n record.effects = effectsArrayPool.acquire();\n }\n record.effects.push(fx);\n }\n\n /**\n * Registers an arbitrary cleanup function with an element's record.\n * Cleanups are executed when the element is removed from the DOM.\n *\n * @param el - The DOM element to bind the cleanup to.\n * @param fn - The cleanup function (e.g., event unbinding, timer clear).\n */\n trackCleanup(el: Element, fn: () => void): void {\n const record = this.getOrCreateRecord(el);\n if (!record.cleanups) {\n record.cleanups = cleanupsArrayPool.acquire();\n }\n record.cleanups.push(fn);\n }\n\n /**\n * Assigns a component-level cleanup function (e.g., from atomMount).\n * Unlike generic cleanups, there can only be one component cleanup per element.\n */\n setComponentCleanup(el: Element, fn: (() => void) | undefined): void {\n this.getOrCreateRecord(el).componentCleanup = fn;\n }\n\n hasBind(el: Element): boolean {\n return this.records.has(el);\n }\n\n cleanup(el: Node): void {\n // Shared deletions for all node types\n this.preservedNodes.delete(el);\n this.ignoredNodes.delete(el);\n\n if (el.nodeType !== 1) return; // Only Elements can have bindings\n\n const element = el as Element;\n const record = this.records.get(element);\n\n if (!record) {\n element.classList.remove(AES_BOUND);\n return;\n }\n\n this.records.delete(element);\n element.classList.remove(AES_BOUND);\n\n const selector = getSelector(element);\n debug.cleanup(LOG_PREFIXES.BINDING, selector);\n\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (e) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), e);\n }\n record.componentCleanup = undefined;\n }\n\n if (record.effects) {\n for (const fx of record.effects) {\n try {\n fx.dispose();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector), e);\n }\n }\n effectsArrayPool.release(record.effects);\n record.effects = undefined;\n }\n\n if (record.cleanups) {\n for (const fn of record.cleanups) {\n try {\n fn();\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), e);\n }\n }\n cleanupsArrayPool.release(record.cleanups);\n record.cleanups = undefined;\n }\n bindingRecordPool.release(record);\n }\n\n cleanupDescendants(el: Element | DocumentFragment | ShadowRoot): void {\n // Fast path: getElementsByClassName is significantly faster than querySelectorAll\n const live =\n 'getElementsByClassName' in el\n ? (el as Element).getElementsByClassName(AES_BOUND)\n : el.querySelectorAll(`.${AES_BOUND}`);\n\n const len = live.length;\n if (len === 0) return;\n\n // Snapshot to avoid issues with live collection changing during cleanup\n const snapshot = new Array<Element>(len);\n for (let i = 0; i < len; i++) snapshot[i] = live[i]!;\n\n for (let i = len - 1; i >= 0; i--) {\n const child = snapshot[i]!;\n if (this.records.has(child)) {\n this.cleanup(child);\n } else {\n child.classList.remove(AES_BOUND);\n }\n }\n }\n\n cleanupTree(el: Node): void {\n if (el.nodeType === 1 || el.nodeType === 11) {\n this.cleanupDescendants(el as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(el);\n }\n}\n\n// ============================================================================\n// Singleton + auto-cleanup\n// ============================================================================\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Node, MutationObserver>();\n\n/**\n * Starts observing `root` for removed elements and automatically disposes\n * their reactive bindings when they leave the DOM.\n *\n * Supports Element, ShadowRoot, and DocumentFragment roots.\n * Multiple roots can be observed concurrently (e.g. for Micro-Frontends).\n */\nexport function enableAutoCleanup(root: Element | ShadowRoot | DocumentFragment): void {\n // Idempotent: calling more than once with the same root has no effect.\n if (observers.has(root)) {\n return;\n }\n\n const observer = new MutationObserver((mutations) => {\n const reg = registry;\n for (let i = 0, mLen = mutations.length; i < mLen; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, rLen = removedNodes.length; j < rLen; j++) {\n const node = removedNodes[j]!;\n\n // Performance: skip non-element nodes early\n if (node.nodeType !== 1) continue;\n\n // Skip nodes that were moved (still connected elsewhere)\n if ((node as Element).isConnected) continue;\n\n const el = node as Element;\n if (reg.isKept(el) || reg.isIgnored(el)) continue;\n\n reg.cleanupTree(el);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\n/**\n * Marks the auto-cleanup as scheduled or already running.\n * Used internally and by reset helpers in tests.\n */\nexport function setAutoCleanupScheduled(scheduled: boolean): void {\n autoCleanupScheduled = scheduled;\n}\n\n/**\n * Stops all MutationObservers started by `enableAutoCleanup`.\n */\nexport function disableAutoCleanup(): void {\n observers.forEach((obs) => obs.disconnect());\n observers.clear();\n}\n","import { LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { BindingContext, EffectCleanup } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/**\n * Creates a binding context for a DOM element.\n * Encapsulates the element and a helper to register cleanups.\n */\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn: EffectCleanup) => registry.trackCleanup(el, fn),\n };\n}\n\n/**\n * Internal helper to iterate over a jQuery set and apply a binding function\n * to each Element node. Handles nodeType check and conditional context creation.\n *\n * This is the central engine for all chainable atomXXX methods.\n */\nexport function atomEachElement(\n jq: JQuery,\n fn: (ctx: BindingContext | null, el: HTMLElement) => void,\n options: { needsCtx?: boolean } = {}\n): JQuery {\n for (let i = 0, len = jq.length; i < len; i++) {\n const node = jq[i];\n if (node?.nodeType === 1) {\n const el = node as HTMLElement;\n fn(options.needsCtx ? createContext(el) : null, el);\n } else if (node) {\n debug.log(LOG_PREFIXES.BINDING, `Skipping non-Element node (nodeType=${node.nodeType})`);\n }\n }\n return jq;\n}\n\n/**\n * Utility to handle [source, options] tuple arguments in integrated bindings.\n * Supports both standalone values and reactive atoms/promises.\n */\nexport function unpack<T, O>(val: T | [T, O]): [T, O?] {\n return Array.isArray(val) &&\n val.length === 2 &&\n (typeof val[0] === 'function' ||\n (val[0] !== null &&\n typeof val[0] === 'object' &&\n ('value' in (val[0] as object) || 'then' in (val[0] as object))))\n ? (val as [T, O])\n : [val as T];\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/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.for('atom-effect-internal');\n\n/**\n * Symbol used to store the wrapped version of a handler directly on the original\n * function. This enables different instances of the library to correctly\n * identify and unbind handlers registered by others.\n */\nexport const WRAPPED_HANDLER = Symbol.for('atom-effect-wrapped');\n\n/** Matches jQuery handler signature with internal metadata properties. */\ninterface JQueryHandlerInternal extends Function {\n [INTERNAL_HANDLER]?: boolean;\n [WRAPPED_HANDLER]?: EventHandler;\n}\n\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n// ============================================================================\n// Originals store\n// ============================================================================\n\ntype JQueryEventHandler = EventHandler | boolean;\n\n/**\n * Snapshot of jQuery prototype methods captured at `enablejQueryOverrides()`\n * time and restored by `disablejQueryOverrides()`.\n *\n * Stored as a typed object and captured into `orig` (a local const) inside\n * `enablejQueryOverrides` so that the override closures always reference the\n * pre-patch methods even if `disablejQueryOverrides()` later resets the\n * module-level `originals` variable to null.\n */\ntype OriginalMethods = {\n on: typeof $.fn.on;\n one: typeof $.fn.one;\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 const internal = fn as unknown as JQueryHandlerInternal;\n\n // Fast check: is already wrapped?\n if (internal[INTERNAL_HANDLER]) return fn;\n\n // 1. Check direct property (for cross-instance/bundle compatibility)\n let wrapped = internal[WRAPPED_HANDLER];\n if (wrapped) return wrapped;\n\n // 2. Check local map\n wrapped = handlerMap.get(fn);\n\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 (wrapped as unknown as JQueryHandlerInternal)[INTERNAL_HANDLER] = true;\n\n // Store in both places\n handlerMap.set(fn, wrapped);\n try {\n internal[WRAPPED_HANDLER] = wrapped;\n } catch {\n // Ignore if function is not extensible (rare for event handlers)\n }\n }\n return wrapped;\n};\n\nconst resolveWrapped = (fn: EventHandler): EventHandler => {\n const internal = fn as unknown as JQueryHandlerInternal;\n return internal[WRAPPED_HANDLER] ?? handlerMap.get(fn) ?? fn;\n};\n\nfunction wrapEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler> {\n const newMap: Record<string, JQueryEventHandler> = {};\n for (const k in map) {\n const fn = map[k];\n if (typeof fn === 'function') newMap[k] = getWrappedHandler(fn);\n else if (fn !== undefined) newMap[k] = fn;\n }\n return newMap;\n}\n\nfunction resolveOffEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler | undefined> {\n const newMap: Record<string, JQueryEventHandler | undefined> = {};\n for (const k in map) {\n const h = map[k];\n if (typeof h === 'function') newMap[k] = resolveWrapped(h);\n else newMap[k] = h;\n }\n return newMap;\n}\n\n/**\n * Common logic to detect and process event handler functions in jQuery argument lists.\n * jQuery standard signatures are:\n * - Positional: (types, [selector], [data], handler, ...)\n * - Map: (map, [selector], [data], ...)\n */\nfunction patchEventArguments(\n args: unknown[],\n mapProcessor: (\n map: Record<string, JQueryEventHandler | undefined>\n ) => Record<string, JQueryEventHandler | undefined>,\n handlerProcessor: (fn: EventHandler) => EventHandler\n) {\n const first = args[0];\n if (first && typeof first === 'object') {\n args[0] = mapProcessor(first as Record<string, JQueryEventHandler | undefined>);\n } else {\n // Scan positional arguments (skipping types at index 0) for handler functions.\n for (let i = 1; i < args.length; i++) {\n if (typeof args[i] === 'function') {\n args[i] = handlerProcessor(args[i] as EventHandler);\n }\n }\n }\n}\n\nfunction createEventHandlerPatch(origFn: Function) {\n return function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, wrapEventMap, getWrappedHandler);\n return origFn.apply(this, args) ?? this;\n };\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n one: $.fn.one,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n const orig = originals;\n\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; 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) ?? this;\n };\n\n $.fn.empty = function (this: JQuery) {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const el = this[i];\n if (el?.hasChildNodes()) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this) ?? this;\n };\n\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector) ?? this;\n };\n\n // --- Event Handling Patches ---\n\n $.fn.on = createEventHandlerPatch(orig.on) as typeof $.fn.on;\n $.fn.one = createEventHandlerPatch(orig.one) as typeof $.fn.one;\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, resolveOffEventMap, resolveWrapped);\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>) ?? this;\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.one = originals.one;\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 Paths,\n PathValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n// ============================================================================\n// Shared API Types\n// ============================================================================\n\nexport type EffectCleanup = () => void;\nexport type EffectResult = undefined | EffectCleanup;\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\nexport interface AtomOptions extends BaseAtomOptions {\n name?: string;\n}\n\n/**\n * Represents a value that can be tracked by the reactive system.\n * - T: Static value (one-time bind)\n * - ReadonlyAtom<T>: Reactive value (updates DOM when atom changes)\n * - () => T: Reactive function (updates DOM when any atom read inside changes)\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * An extension of ReactiveValue that also supports Promises and async functions.\n * The binding system automatically handles the promise lifecycle, showing the\n * latest resolved value and ignoring stale ones (race condition protection).\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\nexport type PrimitiveValue = string | number | boolean | null | undefined;\ntype KeysOfType<T, V> = { [K in keyof T]: T[K] extends V ? K : never }[keyof T];\n\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\nexport type CssBindings = Record<string, CssValue>;\n\nexport interface BindingOptions<T = unknown> {\n text?:\n | AsyncReactiveValue<unknown>\n | [source: AsyncReactiveValue<unknown>, formatter: (v: unknown) => string];\n html?: AsyncReactiveValue<string>;\n class?: Record<string, AsyncReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n show?: AsyncReactiveValue<boolean>;\n hide?: AsyncReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n form?:\n | WritableAtom<T extends object ? T : unknown>\n | [\n atom: WritableAtom<T extends object ? T : unknown>,\n options: FormOptions<T extends object ? T : unknown>,\n ];\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\nexport interface DisposableWritableAtom<T> extends WritableAtom<T> {\n dispose(): void;\n}\n\nexport type ListKey = string | number;\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\nexport interface ListOptions<T> {\n key: KeysOfType<T, ListKey> | ListKeyFn<T>;\n render: (item: T, index: number) => ListRenderResult;\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?: ListRenderResult;\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n isEqual?: (a: T, b: T) => boolean;\n}\n\n/**\n * Options for `atomVal`, `atomChecked`, and `atomForm` bindings.\n */\nexport interface ValOptions<T> {\n /** Debounce duration in milliseconds for DOM -> Atom sync. Defaults to 0. */\n debounce?: number;\n /** jQuery event name(s) to listen to. Defaults to \"input\". */\n event?: string;\n /** Custom function to parse DOM string to atom type T. */\n parse?: (v: string) => T;\n /** Custom function to format atom type T to DOM string. */\n format?: (v: T) => string;\n /** Custom equality check to prevent redundant atom updates. */\n equal?: EqualFn<T>;\n}\n\n/**\n * Options for `atomForm` binding.\n */\nexport interface FormOptions<T> extends ValOptions<T> {\n /** Custom function to transform field value based on path before atomic sync. */\n transform?: (path: string, value: unknown) => unknown;\n /** Callback triggered when a field value changes. */\n onChange?: (path: string, value: unknown) => void;\n}\n\nexport interface FetchOptions<T> {\n defaultValue: T;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n headers?: Record<string, string>;\n transform?: (raw: unknown) => T;\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n onError?: (err: unknown) => void;\n eager?: boolean;\n}\n\nexport interface FetchError extends Error {\n jqXHR?: JQuery.jqXHR;\n}\n\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\nexport interface RouteLifecycle {\n onEnter?: (params: Record<string, string>, router: Router) => Record<string, string> | undefined;\n onLeave?: (router: Router) => boolean | undefined;\n}\n\nexport interface TemplateRoute extends RouteLifecycle {\n template: string;\n render?: never;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RenderRoute extends RouteLifecycle {\n render: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n template?: never;\n}\n\nexport type RouteDefinition = TemplateRoute | RenderRoute;\n\nexport interface RouteConfig {\n target: string;\n default: string;\n routes: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\nexport interface BindingContext {\n readonly el: HTMLElement;\n readonly trackCleanup: (fn: EffectCleanup) => void;\n}\n\ndeclare global {\n interface JQueryStatic {\n atom: { <T>(v: T, opts?: AtomOptions): WritableAtom<T>; debug: boolean };\n computed<T>(fn: () => T, opts?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n opts: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(fn: () => EffectResult): 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 atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(p: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n atomFetch<T>(\n url: string | (() => string),\n opts: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void };\n }\n\n interface JQuery {\n atomText<T>(src: AsyncReactiveValue<T>, fmt?: (v: T) => string): this;\n atomHtml(src: AsyncReactiveValue<string>): this;\n atomClass(name: string, cond: AsyncReactiveValue<boolean>): this;\n atomClass(map: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, src: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(map: CssBindings): this;\n atomAttr(name: string, src: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(map: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, src: AsyncReactiveValue<T>): this;\n atomProp(map: Record<string, AsyncReactiveValue<unknown>>): this;\n atomShow(cond: AsyncReactiveValue<boolean>): this;\n atomHide(cond: AsyncReactiveValue<boolean>): this;\n atomVal<T>(atom: WritableAtom<T>, opts?: ValOptions<T>): this;\n atomChecked(atom: WritableAtom<boolean>): this;\n atomForm<T extends object>(atom: WritableAtom<T>, opts?: FormOptions<T>): this;\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n atomBind<T = unknown>(opts: BindingOptions<T>): this;\n atomList<T>(src: ReadonlyAtom<T[]>, opts: ListOptions<T>): this;\n atomMount<P>(comp: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\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\n/**\n * Marks a handler as library-internal so the jQuery patch skips batch() wrapping.\n * All handlers registered by InputBinding must be marked — unmarked handlers are\n * wrapped in batch() by the jQuery override, which is redundant and potentially\n * harmful here since InputBinding manages atom writes directly.\n */\nfunction markInternal(fn: Function): void {\n (fn as unknown as Record<symbol, true>)[INTERNAL_HANDLER] = true;\n}\n\nclass InputBinding<T> {\n private readonly $el: JQuery;\n private readonly el: InputEl;\n private readonly atom: WritableAtom<T>;\n private readonly isMultipleSelect: boolean;\n private readonly isTextControl: boolean;\n\n private readonly parse: (v: string) => T;\n private readonly format: (v: T) => string;\n private readonly equal: (a: T, b: T) => boolean;\n private readonly readDom: () => T;\n private readonly getRawDom: () => string | string[];\n private readonly writeDom: (val: T, formatted: string) => void;\n\n /**\n * Internal state flags using bitwise operations for zero-overhead tracking.\n * Tracks focus, IME composition, and sync direction to prevent infinite loops.\n */\n private flags = 0;\n private timeoutId: ReturnType<typeof setTimeout> | undefined = undefined;\n\n /** Per-instance jQuery event namespace — prevents cleanup collisions. */\n private readonly ns: string;\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 tagName = this.el.tagName;\n this.isMultipleSelect = tagName === 'SELECT' && (this.el as HTMLSelectElement).multiple;\n this.isTextControl = tagName === 'INPUT' || tagName === 'TEXTAREA';\n this.ns = `.atomBind-${++instanceCounter}`;\n\n // Initialize strategies based on element type\n const { parse, format, equal, readDom, getRawDom, writeDom } = this.initStrategies(options);\n this.parse = parse;\n this.format = format;\n this.equal = equal;\n this.readDom = readDom;\n this.getRawDom = getRawDom;\n this.writeDom = writeDom;\n\n const debounce = options.debounce ?? 0;\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)) this.syncAtomFromDom();\n };\n }\n\n [\n this.handleFocus,\n this.handleBlur,\n this.handleCompositionStart,\n this.handleCompositionEnd,\n this.handleInput,\n ].forEach(markInternal);\n\n this.bindEvents(options.event ?? INPUT_DEFAULTS.EVENT);\n }\n\n /**\n * Specializes binding strategies at construction.\n * This avoids branching in the sync hot-paths (syncDomFromAtom / syncAtomFromDom).\n */\n private initStrategies(options: ValOptions<T>) {\n const parse = options.parse ?? ((v: string) => v as unknown as T);\n const baseEqual = options.equal ?? Object.is;\n\n if (this.isMultipleSelect) {\n const format =\n options.format ?? ((v: T) => (Array.isArray(v) ? v : v ? [String(v)] : []).join(','));\n\n return {\n parse,\n format,\n getRawDom: () => (this.$el.val() as string[] | null) || [],\n readDom: () => ((this.$el.val() as string[] | null) || []) as unknown as T,\n writeDom: (val: T) => {\n this.$el.val(val as unknown as string[]);\n },\n equal: (a: T, b: T): boolean => {\n if (baseEqual(a, b)) return true;\n if (Array.isArray(a) && Array.isArray(b)) {\n const len = a.length;\n if (len !== b.length) return false;\n for (let i = 0; i < len; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n }\n return false;\n },\n };\n }\n\n const format = options.format ?? ((v: T) => String(v ?? ''));\n const getRawDom = () => this.el.value;\n const readDom = () => parse(this.el.value);\n const writeDom = this.isTextControl\n ? (_val: T, formatted: string) => this.writeTextValue(formatted)\n : (_: T, formatted: string) => {\n this.el.value = formatted;\n };\n\n return { parse, format, equal: baseEqual, readDom, getRawDom, writeDom };\n }\n\n private writeTextValue(formatted: string): void {\n const el = this.el as HTMLInputElement;\n if (this.flags & BindingFlags.Focused) {\n try {\n const start = el.selectionStart;\n const end = el.selectionEnd;\n el.value = formatted;\n const len = formatted.length;\n if (start !== null && end !== null) {\n el.setSelectionRange(Math.min(start, len), Math.min(end, len));\n }\n } catch {\n el.value = formatted;\n }\n } else {\n el.value = formatted;\n }\n }\n\n // --- Event Handlers ---\n\n private readonly handleCompositionStart = () => {\n // We ignore input events while the user is still composing characters\n // (e.g., CJK character selection) to avoid syncing incomplete/partial data.\n this.flags |= BindingFlags.Composing;\n };\n\n private readonly handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n // Trigger sync once composition is finished to capture the final character.\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 const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~BindingFlags.Composing;\n\n // Ensure any pending debounced change is committed immediately on blur.\n const flushed = this.flushPendingDebounce();\n\n // If composition was interrupted by blur (e.g. clicking away),\n // and no debounced sync happened, we must perform a final sync.\n if (wasComposing && !flushed) {\n this.syncAtomFromDom();\n }\n\n // Restore the strict formatted value from the atom.\n this.normalizeDomValue();\n };\n\n // --- Helpers ---\n\n private flushPendingDebounce(): boolean {\n if (this.timeoutId !== undefined) {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n this.syncAtomFromDom();\n return true;\n }\n return false;\n }\n\n private normalizeDomValue(): void {\n const val = this.atom.peek();\n const formatted = this.format(val);\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n if (!this.equal(raw as unknown as T, val)) {\n this.writeDom(val, formatted);\n }\n } else if (raw !== formatted) {\n this.writeDom(val, formatted);\n }\n }\n\n private syncAtomFromDom(): void {\n if (this.flags & BindingFlags.Busy) return;\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const parsed = this.readDom();\n if (!this.equal(this.atom.peek(), parsed)) {\n this.atom.value = parsed;\n }\n } catch (e) {\n debug.warn(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.PARSE_ERROR(e instanceof Error ? e.message : String(e)),\n e\n );\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n public readonly syncDomFromAtom = () => {\n // Always read the value first to ensure the effect tracks this atom,\n // even if we skip the DOM update due to composition or atom syncing.\n const val = this.atom.value;\n\n // Skip DOM update if we are currently composing IME or syncing in either direction.\n if (this.flags & BindingFlags.Busy) return;\n\n untracked(() => {\n if (this.isDomUpToDate(val)) return;\n\n const formatted = this.format(val);\n this.flags |= BindingFlags.SyncingToDom;\n try {\n this.writeDom(val, formatted);\n debug.domUpdated(LOG_PREFIXES.BINDING, this.$el, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n /** Check if the DOM value is functionally equivalent to the atom value. */\n private isDomUpToDate(atomVal: T): boolean {\n const raw = this.getRawDom();\n\n if (this.isMultipleSelect) {\n return this.equal(raw as unknown as T, atomVal);\n }\n\n const formatted = this.format(atomVal);\n if (raw === formatted) return true;\n\n // If focused, also check via parse to avoid overwriting \"1.0\" with \"1\" if parse(\"1.0\") === 1\n if (this.flags & BindingFlags.Focused) {\n try {\n return this.equal(this.readDom(), atomVal);\n } catch {\n // Ignore parse errors on check-only read\n }\n }\n\n return false;\n }\n\n public readonly cleanup = () => {\n this.$el.off(this.ns);\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n };\n\n private bindEvents(eventName: string): void {\n const ns = this.ns;\n const namespacedEvents = eventName\n .trim()\n .split(/\\s+/)\n .map((e) => `${e}${ns}`)\n .join(' ');\n\n this.$el\n .on(`focus${ns}`, this.handleFocus)\n .on(`blur${ns}`, this.handleBlur)\n .on(`compositionstart${ns}`, this.handleCompositionStart)\n .on(`compositionend${ns}`, this.handleCompositionEnd)\n .on(namespacedEvents, this.handleInput);\n }\n}\n\n/**\n * Applies two-way data binding between a writable atom and an input element.\n */\nexport function applyInputBinding<T>(\n $el: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { fx: EffectObject; cleanup: () => void } {\n let binding: InputBinding<T> | null = new InputBinding($el, atom, options);\n return {\n fx: effect(binding.syncDomFromAtom),\n cleanup: () => {\n if (binding) {\n binding.cleanup();\n binding = null;\n }\n },\n };\n}\n","import { effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { hasOwn, isPromise, isReactive } from '@/utils';\nimport { debug } from '@/utils/debug';\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 *\n * Note: the trailing `(string & {})` member makes this type accept any string\n * at runtime while still surfacing the named literals as IDE autocomplete\n * suggestions. It does NOT enforce that only the listed values are used —\n * TypeScript absorbs all narrower literal members into `string & {}`, so there\n * is no compile-time restriction beyond `string`.\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 with `untracked`.\n *\n * @param el DOM element or SVG 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 and effect naming.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n const state = {\n latestId: 0,\n isDisposed: false,\n };\n\n // Ensure zombie protection by registering cleanup immediately.\n // Covers all execution paths, including static Promise inputs.\n registry.trackCleanup(el, () => {\n state.isDisposed = true;\n });\n\n const runUpdater = (val: T | Promise<T>) => {\n // Sync Path: Update immediately and invalidate any pending async runs.\n if (!isPromise(val)) {\n state.latestId++;\n untracked(() => {\n try {\n updater(val);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true),\n e\n );\n }\n });\n return;\n }\n\n // Async Path: Increment ID to track this specific execution's relevance.\n const myId = ++state.latestId;\n val\n .then((resolved) => {\n // Execute only if this element is still connected and this promise is still current.\n if (myId === state.latestId && !state.isDisposed) {\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n })\n .catch((e) => {\n if (myId === state.latestId && !state.isDisposed) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n };\n\n const sourceIsReactive = isReactive(source);\n const sourceIsFunction = typeof source === 'function';\n\n if (sourceIsReactive || sourceIsFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = sourceIsReactive\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n runUpdater(value);\n },\n { name: debugType }\n )\n );\n } else {\n runUpdater(source as T | Promise<T>);\n }\n}\n\n/**\n * Registers a single reactive effect that observes multiple sources in a map.\n * When any source changes, the entire map is re-processed via the updater.\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const keys = Object.keys(map);\n const reactiveKeys: string[] = [];\n const reactiveSources: AsyncReactiveValue<T>[] = [];\n const sourceIsAtom: boolean[] = [];\n const staticValues: Record<string, T | Promise<T>> = {};\n\n for (let i = 0, len = keys.length; i < len; i++) {\n const key = keys[i]!;\n const val = map[key]!;\n const isAtomVal = isReactive(val);\n if (isAtomVal || typeof val === 'function') {\n reactiveKeys.push(key);\n reactiveSources.push(val);\n sourceIsAtom.push(isAtomVal);\n } else {\n staticValues[key] = val;\n }\n }\n\n const state = {\n latestId: 0,\n isDisposed: false,\n cache: {} as Record<string, { p: Promise<T>; v: T }>,\n };\n\n // Ensure zombie protection by registering cleanup immediately.\n registry.trackCleanup(el, () => {\n state.isDisposed = true;\n });\n\n const runUpdater = (currentMap: Record<string, T | Promise<T>>) => {\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n const len = keys.length;\n\n for (let i = 0; i < len; i++) {\n const key = keys[i]!;\n const val = currentMap[key]!;\n\n // Optimization: use cached result if it matches the current promise instance.\n if (isPromise(val) && hasOwn.call(state.cache, key)) {\n const entry = state.cache[key]!;\n if (entry.p === val) {\n resolvedMap[key] = entry.v;\n continue;\n }\n }\n\n if (isPromise(val)) {\n promises.push(\n val.then((v) => {\n state.cache[key] = { p: val as Promise<T>, v };\n return { key, val: v };\n })\n );\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n if (promises.length > 0) {\n const myId = ++state.latestId;\n Promise.all(promises).then(\n (results) => {\n if (myId === state.latestId && !state.isDisposed) {\n for (let i = 0, rLen = results.length; i < rLen; i++) {\n const res = results[i]!;\n resolvedMap[res.key] = res.val;\n }\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolvedMap);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType),\n e\n );\n }\n });\n }\n },\n (e) => {\n if (myId === state.latestId && !state.isDisposed) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n }\n );\n } else {\n // Sync Path: Update immediately and invalidate any pending async runs.\n state.latestId++;\n untracked(() => {\n try {\n updater(resolvedMap);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, resolvedMap);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true),\n e\n );\n }\n });\n }\n };\n\n if (reactiveKeys.length > 0) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const currentMap: Record<string, T | Promise<T>> = { ...staticValues };\n for (let i = 0, rLen = reactiveKeys.length; i < rLen; i++) {\n const source = reactiveSources[i]!;\n currentMap[reactiveKeys[i]!] = sourceIsAtom[i]\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n }\n runUpdater(currentMap);\n },\n { name: debugType }\n )\n );\n } else {\n runUpdater(staticValues);\n }\n}\n","/**\n * HTML sanitization and security guards for XSS mitigation.\n *\n * This module is the **sole** sanitization layer — there is no downstream\n * sanitizer (e.g. DOMPurify) applied automatically. All regex-based\n * filtering happens here before content reaches the DOM.\n *\n * **Threat model:** best-effort defence for developer-authored templates and\n * reactive string bindings. For user-controlled rich text (e.g. a WYSIWYG\n * editor), replace or supplement this with DOMPurify.\n */\nimport { DANGEROUS_PROTOCOL_PATTERN } from '@/constants';\n\n// ============================================================================\n// Constants & Registry\n// ============================================================================\n\n/** Attributes that carry a single URL value. */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'fill',\n 'filter',\n 'mask',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'clip-path',\n]);\n\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n Tab: '\\t',\n NewLine: '\\n',\n};\n\n// ============================================================================\n// Pre-compiled regex constants\n// ============================================================================\n\n/** Normalization & Fast-path regexes */\nconst RE_NUMERIC_ENTITY = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\nconst RE_NAMED_ENTITY = /&(colon|Tab|NewLine);/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\nconst RE_STRIP_CTRL = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g;\n// biome-ignore lint/suspicious/noControlCharactersInRegex: Intentionally matching control characters for XSS sanitization\nconst RE_FAST_SCAN = /[<&\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/;\n\n/** Sanitization regexes */\nconst RE_STRIP_XML = /<\\?[\\s\\S]*?\\?>/g;\nconst RE_DANGEROUS_TAG =\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;\n\nconst RE_UNSAFE_ATTR = /\\bon\\w+\\s*=/gim;\nconst RE_DANGEROUS_DATA_URI =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/gi;\n\nconst RE_DANGEROUS_PROTOCOL_GLOBAL = new RegExp(`${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`, 'gi');\nconst RE_DANGEROUS_PROTOCOL_START = new RegExp(`^\\\\s*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`, 'i');\n\n/** CSS Sanitization */\nconst CSS_KEYWORD_PATTERN = `(?:expression\\\\s*\\\\(|behavior\\\\s*:|-moz-binding\\\\s*:|(?:\\\\\\\\[0-9a-f]{1,6}\\\\s*|[\\\\s\\\\x00-\\\\x20/'\"])*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:(?!image\\\\/)|data\\\\s*:\\\\s*(?!image\\\\/))`;\nconst RE_DANGEROUS_CSS_GLOBAL = new RegExp(CSS_KEYWORD_PATTERN, 'gim');\nconst RE_DANGEROUS_CSS_SINGLE = new RegExp(CSS_KEYWORD_PATTERN, 'im');\nconst RE_DANGEROUS_CSS_URL = new RegExp(\n `url\\\\s*\\\\(\\\\s*(?:[\"']?\\\\s*)?${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`,\n 'i'\n);\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/** Normalizes a string by decoding entities and stripping control characters. */\nfunction normalize(s: string): string {\n return s\n .replace(RE_NUMERIC_ENTITY, (_, hex, dec) => {\n const cp = hex ? parseInt(hex, 16) : parseInt(dec, 10);\n return cp >= 0 && cp <= 0x10ffff ? String.fromCodePoint(cp) : '';\n })\n .replace(RE_NAMED_ENTITY, (_, name) => NAMED_ENTITY_MAP[name] ?? '')\n .replace(RE_STRIP_CTRL, '');\n}\n\n/** Returns true if the string contains a dangerous protocol or data URI. */\nfunction hasDangerousProtocol(s: string): boolean {\n return (\n RE_DANGEROUS_PROTOCOL_START.test(s) || new RegExp(RE_DANGEROUS_DATA_URI.source, 'i').test(s)\n );\n}\n\n/** Returns true if the string contains dangerous CSS patterns. */\nfunction hasDangerousCss(s: string): boolean {\n return (\n (s.toLowerCase().includes('url(') && RE_DANGEROUS_CSS_URL.test(s)) ||\n RE_DANGEROUS_CSS_SINGLE.test(s)\n );\n}\n\n/**\n * O(n) single-pass scan for characters that indicate potential danger.\n */\nfunction needsSanitization(s: string): boolean {\n if (RE_FAST_SCAN.test(s) || s.indexOf(':') !== -1) return true;\n\n const lower = s.toLowerCase();\n let onIdx = lower.indexOf('on');\n while (onIdx !== -1 && onIdx < s.length - 2) {\n const nextChar = lower.charCodeAt(onIdx + 2);\n if (nextChar >= 97 && nextChar <= 122) return true;\n onIdx = lower.indexOf('on', onIdx + 1);\n }\n return false;\n}\n\n// ============================================================================\n// Public API\n// ============================================================================\n\n/**\n * HTML sanitization for XSS mitigation using regex-based filtering.\n * Optimized with an early-exit fast-path for safe strings.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n const sInit = String(html);\n\n // Fast path: skip expensive processing if no dangerous patterns exist.\n if (!needsSanitization(sInit)) return sInit;\n\n // 1. Normalize (Decode entities -> Strip control chars)\n let s = normalize(sInit);\n\n // 2. Strip Tags (Recursive to handle nested reassembly like <scr<script>ipt>)\n if (s.indexOf('<') !== -1) {\n s = s.replace(RE_STRIP_XML, '');\n let prev: string;\n do {\n prev = s;\n s = s.replace(RE_DANGEROUS_TAG, '');\n } while (s !== prev);\n }\n\n // 3. Neutralize CSS, Protocols, Data URIs, and Attributes\n // (Note: CSS first to ensure url(javascript:) captures the whole property)\n return s\n .replace(RE_DANGEROUS_CSS_GLOBAL, 'data-unsafe-css:')\n .replace(RE_DANGEROUS_PROTOCOL_GLOBAL, 'data-unsafe-protocol:')\n .replace(RE_DANGEROUS_DATA_URI, 'data-unsafe-protocol:')\n .replace(RE_UNSAFE_ATTR, 'data-unsafe-attr=');\n}\n\n/** Checks for javascript:/vbscript: protocols in URL attributes. */\nexport const isDangerousUrl = (attr: string, val: string): boolean => {\n const lowerAttr = attr.toLowerCase();\n if (!URL_ATTRS.has(lowerAttr)) return false;\n return hasDangerousProtocol(normalize(val));\n};\n\n/** Checks for protocols/expressions inside CSS. */\nexport const isDangerousCssValue = (val: string): boolean => {\n return hasDangerousCss(normalize(val));\n};\n","import { computed, effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\n\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { hasOwn, isPromise } from '@/utils';\nimport { debug } from '@/utils/debug';\n\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml, URL_ATTRS } from '@/utils/sanitize';\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 ReadonlyAtom<string | Promise<string>>,\n ReadonlyAtom<string | Promise<string>>\n>();\n\nfunction getSanitizedHtml(\n source: ReadonlyAtom<string | Promise<string>>\n): ReadonlyAtom<string | Promise<string>> {\n let cached = htmlSanitizeCache.get(source);\n if (!cached) {\n cached = computed(() => {\n const val = source.value;\n if (isPromise(val)) {\n return val.then((v: string) => sanitizeHtml(v));\n }\n return sanitizeHtml(val);\n });\n htmlSanitizeCache.set(source, cached);\n }\n return cached;\n}\n\n// ============================================================================\n// One-Way Binding Handlers (Atom → DOM)\n// ============================================================================\n\n/**\n * Updates element text content.\n */\nexport function bindText<T = unknown>(\n { el }: BindingContext,\n value: AsyncReactiveValue<T>,\n formatter?: (val: T) => string\n): void {\n registerReactiveEffect(\n el,\n value,\n (val) => {\n const text = formatter ? formatter(val) : String(val ?? '');\n if (el.textContent !== text) el.textContent = text;\n },\n 'text'\n );\n}\n\n/**\n * Updates element inner HTML with XSS sanitization.\n */\nexport function bindHtml({ el }: BindingContext, value: AsyncReactiveValue<string>): void {\n const source = isAtom(value)\n ? getSanitizedHtml(value as ReadonlyAtom<string | Promise<string>>)\n : value;\n\n let lastHtml: string | null = null;\n\n registerReactiveEffect(\n el,\n source,\n (val) => {\n const html = source === value ? sanitizeHtml(val) : val;\n if (lastHtml !== html) {\n registry.cleanupDescendants(el);\n el.innerHTML = html;\n lastHtml = html;\n }\n },\n 'html'\n );\n}\n\n/**\n * Toggles multiple CSS classes based on reactive boolean conditions.\n */\nexport function bindClass(\n { el }: BindingContext,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokenMap: Record<string, string[]> = {};\n const prevStates: Record<string, boolean> = {};\n\n for (const k in classMap) {\n if (hasOwn.call(classMap, k)) {\n const trimmed = k.trim();\n // Optimization: avoid regex for simple single-class keys, but handle all whitespace robustly\n tokenMap[k] = /\\s/.test(trimmed) ? trimmed.split(/\\s+/).filter(Boolean) : [trimmed];\n }\n }\n\n registerMapEffect(\n el,\n classMap,\n (states) => {\n for (const k in states) {\n const val = !!states[k];\n if (prevStates[k] === val) continue;\n\n const tokens = tokenMap[k]!;\n if (val) {\n el.classList.add(...tokens);\n } else {\n // Safely remove tokens only if no other active key in this map requires them\n for (const token of tokens) {\n let stillNeeded = false;\n for (const otherK in states) {\n if (otherK !== k && states[otherK] && tokenMap[otherK]!.includes(token)) {\n stillNeeded = true;\n break;\n }\n }\n if (!stillNeeded) el.classList.remove(token);\n }\n }\n prevStates[k] = val;\n }\n },\n 'class'\n );\n}\n\n/**\n * Updates multiple CSS style properties.\n */\nexport function bindCss({ el }: BindingContext, cssMap: Record<string, CssValue>): void {\n const style = el.style as unknown as Record<string, string | null>;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const meta: Record<string, { camel: string; unit: string }> = {};\n const prevValues: Record<string, string | null> = {};\n\n for (const p in cssMap) {\n if (hasOwn.call(cssMap, p)) {\n const val = cssMap[p]!;\n const [src, unit] = Array.isArray(val) ? val : ([val, ''] as const);\n reactiveMap[p] = src;\n meta[p] = { camel: getCamelCase(p), unit };\n }\n }\n\n registerMapEffect(\n el,\n reactiveMap,\n (states) => {\n for (const p in states) {\n const m = meta[p]!;\n const val = states[p];\n const str = m.unit ? `${val}${m.unit}` : String(val);\n const camel = m.camel;\n\n if (prevValues[p] !== str) {\n if (!isDangerousCssValue(str)) {\n style[camel] = str;\n }\n prevValues[p] = str;\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Binds DOM attributes with security guards and primitive value constraints.\n */\nexport function bindAttr(\n { el }: BindingContext,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const safeMap: Record<string, AsyncReactiveValue<PrimitiveValue>> = {};\n const metaMap: Record<string, { isAria: boolean; isUrl: boolean }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const name in attrMap) {\n if (!hasOwn.call(attrMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`\n );\n continue;\n }\n safeMap[name] = attrMap[name]!;\n metaMap[name] = { isAria: lower.startsWith('aria-'), isUrl: URL_ATTRS.has(lower) };\n cache[name] = el.getAttribute(name);\n }\n\n registerMapEffect(\n el,\n safeMap,\n (states) => {\n for (const name in states) {\n const m = metaMap[name]!;\n const val = states[name] as PrimitiveValue;\n\n if (val == null || (val === false && !m.isAria)) {\n if (cache[name] !== null) el.removeAttribute(name);\n cache[name] = null;\n continue;\n }\n\n const newVal = val === true ? (m.isAria ? 'true' : name) : String(val);\n if (isDangerousUrl(name, newVal)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (cache[name] !== newVal) {\n el.setAttribute(name, newVal);\n cache[name] = newVal;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties. Uses strict property write guards and security filters.\n */\nexport function bindProp(\n ctx: BindingContext,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const el = ctx.el as unknown as Record<string, unknown>;\n const safeMap: Record<string, AsyncReactiveValue<unknown>> = {};\n const metaMap: Record<string, { isUrl: boolean }> = {};\n const prevValues: Record<string, unknown> = {};\n\n for (const name in propMap) {\n if (!hasOwn.call(propMap, name)) continue;\n const lower = name.toLowerCase();\n if (lower.startsWith('on') || DANGEROUS_PROPS.has(name)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${\n lower.startsWith('on')\n ? ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)\n : ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)\n }`\n );\n continue;\n }\n safeMap[name] = propMap[name]!;\n metaMap[name] = { isUrl: URL_ATTRS.has(lower) };\n }\n\n registerMapEffect(\n ctx.el,\n safeMap,\n (states) => {\n for (const name in states) {\n const val = states[name];\n if (prevValues[name] === val) continue;\n\n if (typeof val === 'string' && isDangerousUrl(name, val)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n el[name] = val;\n prevValues[name] = val;\n }\n },\n 'prop'\n );\n}\n\n/**\n * Handles visibility (display: none) toggle.\n */\nexport function bindVisibility(\n { el }: BindingContext,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n let lastDisplay = el.style.display === 'none' ? '' : el.style.display;\n\n registerReactiveEffect(\n el,\n condition,\n (val) => {\n const isVisible = invert !== !!val;\n if (isVisible) {\n if (el.style.display === 'none') {\n el.style.display = lastDisplay;\n }\n } else if (el.style.display !== 'none') {\n lastDisplay = el.style.display;\n el.style.display = 'none';\n }\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/**\n * Two-way value binding with full feature parity to $.fn.atomVal.\n */\nexport function bindVal(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tag = ctx.el.tagName.toLowerCase();\n if (!VALID_INPUT_TAGS.has(tag)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tag)}`);\n return;\n }\n const { fx, cleanup } = applyInputBinding($(ctx.el), atom, options);\n registry.trackEffect(ctx.el, fx);\n ctx.trackCleanup(cleanup);\n}\n\n/**\n * Helper to trigger synchronization across a radio group.\n */\nfunction syncRadioGroup(el: HTMLInputElement): void {\n if (el.type === 'radio' && el.name) {\n (el.form ? $(el.form) : $(document))\n .find(`input[type=\"radio\"][name=\"${$.escapeSelector(el.name)}\"]`)\n .not(el)\n .trigger('change.atomRadioSync');\n }\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 = $(el);\n\n const handler = () => {\n if (atom.peek() !== el.checked) {\n atom.value = el.checked;\n syncRadioGroup(el);\n }\n };\n (handler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $el.on('change change.atomRadioSync', handler);\n ctx.trackCleanup(() => $el.off('change change.atomRadioSync', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const val = !!atom.value;\n untracked(() => {\n if (el.checked !== val) {\n el.checked = val;\n debug.domUpdated(LOG_PREFIXES.BINDING, el, 'checked', val);\n if (val) syncRadioGroup(el);\n }\n });\n })\n );\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 */\nexport function bindOn(\n { el, trackCleanup }: BindingContext,\n event: string,\n handler: (e: JQuery.TriggeredEvent) => void\n): void {\n const $el = $(el);\n $el.on(event, handler);\n trackCleanup(() => $el.off(event, handler));\n}\n\n/**\n * Disposes all reactive bindings on an element and its descendants.\n */\nexport function bindUnbind(el: HTMLElement): void {\n registry.cleanupTree(el);\n}\n","import {\n batch,\n atom as createAtom,\n type EffectObject,\n effect,\n getPathValue,\n setDeepValue,\n untracked,\n type WritableAtom,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { createContext } from '@/core/dom';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type { BindingContext, FormOptions } from '@/types';\nimport { bindVal } from './unified';\n\n/**\n * Interface for managing the state and synchronization logic of individual form fields.\n */\ninterface FieldEntry {\n /** Independent Atom managing the data for this specific field */\n atom: WritableAtom<unknown>;\n /** Path segments for deep object property traversal (e.g., \"a.b[0]\" -> [\"a\", \"b\", \"0\"]) */\n parts: string[];\n /** The value of the field's \"name\" attribute */\n name: string;\n /** Number of DOM elements currently referencing this field */\n refCount: number;\n /** Effect object that reflects field Atom changes back to the root Atom */\n effect: EffectObject | null;\n}\n\n/** Selector definition for form controls (input, select, textarea) */\nconst SELECTOR = 'input, select, textarea';\n\n/**\n * Orchestrator class for managing two-way synchronization between a single object-based Atom\n * and HTML form elements.\n *\n * This class uses a \"Root -> Leaf\" dispatcher model to maintain performance in large forms:\n * - Root -> Leaf: Updates individual field Atoms conditionally when the root data changes.\n * - Leaf -> Root: Updates the specific path within the root Atom when a field Atom changes.\n *\n * It uses the `isSyncingFromLeaf` flag to prevent infinite loops during two-way updates.\n *\n * @template T The type of the form data (object)\n */\nclass FormBinder<T extends object> {\n /** Map using field names as keys to manage field entries */\n private fieldMap = new Map<string, FieldEntry>();\n /** Cache of field entries for efficient iteration */\n private fields: FieldEntry[] = [];\n /** WeakMap tracking the previous name of elements to support cleanup when name attributes change */\n private elementNames = new WeakMap<Element, string>();\n /** Protection flag to prevent root dispatcher execution when the update originates from a leaf field */\n private isSyncingFromLeaf = false;\n\n constructor(\n private form: HTMLFormElement,\n private atom: WritableAtom<T>,\n private options: FormOptions<unknown> = {}\n ) {\n this.init();\n }\n\n /**\n * Initializes the Root -> Leaf synchronization dispatcher.\n * Updates child field Atoms whenever the root Atom value changes.\n */\n private init(): void {\n const rootDispatcher = effect(() => {\n const rootValue = this.atom.value;\n // Skip if updating from a leaf field or if there are no managed fields (optimization & loop protection).\n if (this.isSyncingFromLeaf || !this.fields.length) return;\n\n batch(() => {\n untracked(() => {\n for (let i = 0; i < this.fields.length; i++) {\n const f = this.fields[i]!;\n const newVal = getPathValue(rootValue, f.parts);\n // Only update the field Atom if the value has actually changed to prevent redundant DOM renders.\n if (!Object.is(f.atom.peek(), newVal)) f.atom.value = newVal;\n }\n });\n });\n });\n\n // Link the form element lifecycle with the dispatcher.\n registry.trackEffect(this.form, rootDispatcher);\n this.bindElement(this.form);\n this.setupObserver();\n }\n\n /**\n * Finds and binds all form controls within the given element.\n * @param el Root element to start binding from\n */\n public bindElement(el: Element): void {\n const targets = el.matches?.(SELECTOR)\n ? [el]\n : (el as HTMLElement).querySelectorAll?.(SELECTOR) || [];\n for (let i = 0, len = targets.length; i < len; i++) {\n this.bindControl(targets[i] as Element);\n }\n }\n\n /**\n * Handles binding for individual controls (input, select, textarea).\n * Only processes elements with a name attribute and prevents duplicate bindings.\n */\n private bindControl(el: Element): void {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLTextAreaElement\n )\n ) {\n return;\n }\n const control = el;\n const name = control.name;\n if (!name) return;\n\n // Cleanup existing field resources if the name attribute has changed.\n const oldName = this.elementNames.get(control);\n if (oldName !== undefined && oldName !== name) registry.cleanup(control);\n // Prevent duplicate binding if already bound with the same name.\n if (this.elementNames.has(control) && oldName === name) return;\n\n const entry = this.acquireField(name);\n this.elementNames.set(control, name);\n\n const ctx = createContext(control);\n // Track cleanup to decrement field reference count when the element is removed from DOM.\n ctx.trackCleanup(() => this.releaseField(control, name));\n\n // Choose appropriate binding strategy based on control type.\n if (\n control instanceof HTMLInputElement &&\n (control.type === 'radio' || control.type === 'checkbox')\n ) {\n this.bindToggle(ctx, entry.atom, control.value, control.type === 'checkbox');\n } else {\n // Standard input fields (text, select, etc.) use the standard bindVal logic.\n bindVal(ctx, entry.atom, this.options);\n }\n }\n\n /**\n * Handles specialized binding logic for checkboxes and radio buttons.\n * Supports multi-checkbox configurations (managing values as an array).\n */\n private bindToggle(\n ctx: BindingContext,\n atom: WritableAtom<unknown>,\n val: string,\n isCheck: boolean\n ): void {\n const el = ctx.el as HTMLInputElement;\n\n // Handler to reflect UI changes back to the Atom\n const handler = () => {\n const curr = atom.peek();\n if (isCheck && Array.isArray(curr)) {\n // Multi-checkbox logic using Set for array-based values\n const s = new Set(curr.map(String));\n el.checked ? s.add(val) : s.delete(val);\n atom.value = Array.from(s);\n } else {\n // Standard radio buttons and single checkboxes\n atom.value = isCheck ? el.checked : val;\n }\n };\n\n // Mark as internal handler to prevent redundant interceptions.\n (handler as unknown as { [INTERNAL_HANDLER]: boolean })[INTERNAL_HANDLER] = true;\n $(el).on('change', handler);\n ctx.trackCleanup(() => $(el).off('change', handler));\n\n // Effect to update UI checked state when the Atom changes\n registry.trackEffect(\n el,\n effect(() => {\n const v = atom.value;\n const checked = isCheck\n ? Array.isArray(v)\n ? v.some((x) => String(x) === val)\n : !!v\n : String(v) === val;\n if (el.checked !== checked) el.checked = checked;\n })\n );\n }\n\n /**\n * Acquires field resources for a specific name path.\n * Increments refCount if it exists, otherwise creates a new Atom and synchronization Effect.\n */\n private acquireField(name: string): FieldEntry {\n let entry = this.fieldMap.get(name);\n if (entry) {\n entry.refCount++;\n return entry;\n }\n\n // Parse the name attribute into an object path (e.g., \"user[info].name\" -> [\"user\", \"info\", \"name\"])\n const parts = name\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n // Create an independent field Atom for Leaf -> Root synchronization\n const fieldAtom = createAtom(getPathValue(this.atom.peek(), parts));\n entry = { atom: fieldAtom, parts, name, refCount: 1, effect: null };\n\n // Set up Leaf (field Atom) -> Root (main data Atom) synchronization effect\n entry.effect = effect(() => {\n let val = fieldAtom.value;\n // Support custom data transformation via options\n if (this.options.transform) val = this.options.transform(name, val);\n\n const root = this.atom.peek();\n // Update deep path value immutably\n const next = setDeepValue(root, parts, 0, val);\n\n if (next !== root) {\n // Mark as syncing from leaf to prevent infinite loop in Root dispatcher\n this.isSyncingFromLeaf = true;\n try {\n this.atom.value = next as T;\n // Execute onChange callback if provided (wrapped in untracked to protect from effect collection)\n if (this.options.onChange) untracked(() => this.options.onChange!(name, val));\n } finally {\n this.isSyncingFromLeaf = false;\n }\n }\n });\n\n this.fieldMap.set(name, entry);\n this.fields.push(entry);\n return entry;\n }\n\n /**\n * Releases field usage and cleans up resources when refCount reaches zero.\n */\n private releaseField(el: Element, name: string): void {\n const entry = this.fieldMap.get(name);\n if (entry && --entry.refCount <= 0) {\n const idx = this.fields.indexOf(entry);\n if (idx !== -1) this.fields.splice(idx, 1);\n entry.effect?.dispose();\n this.fieldMap.delete(name);\n }\n registry.cleanup(el);\n }\n\n /**\n * Uses MutationObserver to detect dynamic changes within the form.\n * Automatically updates bindings when new elements are added or name attributes change.\n */\n private setupObserver(): void {\n const observer = new MutationObserver((ms) => {\n for (let i = 0, len = ms.length; i < len; i++) {\n const m = ms[i]!;\n if (m.type === 'childList') {\n for (let j = 0; j < m.addedNodes.length; j++) {\n const node = m.addedNodes[j]!;\n if (node.nodeType === 1) this.bindElement(node as Element);\n }\n } else if (m.attributeName === 'name') {\n this.bindElement(m.target as Element);\n }\n }\n });\n\n observer.observe(this.form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n // Disconnect the observer when the form is destroyed.\n registry.trackCleanup(this.form, () => observer.disconnect());\n }\n}\n\n/**\n * Binds an entire HTML form to a single object-based Atom.\n *\n * Key Features:\n * - O(1) level update performance for large forms (only changed fields react)\n * - Circular loop protection via internal flags for two-way updates\n * - Support for custom data transformation (transform) and change callbacks (onChange)\n * - Automatic dynamic element binding and memory management via MutationObserver\n *\n * @param form The HTMLFormElement to bind\n * @param atom The WritableAtom holding the form data\n * @param options Evaluation options for performance tuning or callbacks\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): void {\n new FormBinder(form, atom, options);\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\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} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { atomEachElement, unpack } from '@/core/dom';\nimport type {\n AsyncReactiveValue,\n BindingContext,\n BindingOptions,\n CssBindings,\n FormOptions,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Binds element `textContent` to a reactive source.\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (ctx) => bindText(ctx!, source, formatter), { needsCtx: true });\n};\n\n/**\n * Binds element `innerHTML` to a reactive string source.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (ctx) => bindHtml(ctx!, source), { needsCtx: true });\n};\n\n/**\n * Toggles one or more CSS classes based on reactive boolean conditions.\n */\n$.fn.atomClass = function (\n this: JQuery,\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n const map =\n typeof classNameOrMap === 'string'\n ? condition === undefined\n ? null\n : { [classNameOrMap]: condition }\n : classNameOrMap;\n\n if (!map) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')}`\n );\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindClass(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Binds one or more CSS style properties to reactive values.\n */\n$.fn.atomCss = function (\n this: JQuery,\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n const map =\n typeof propOrMap === 'string'\n ? source === undefined\n ? null\n : { [propOrMap]: unit ? [source as ReactiveValue<number>, unit] : source! }\n : propOrMap;\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindCss(ctx!, map as CssBindings), { needsCtx: true });\n};\n\n/**\n * Binds one or more HTML attributes to reactive values with security guards.\n */\n$.fn.atomAttr = function (\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n const map =\n typeof nameOrMap === 'string'\n ? source === undefined\n ? null\n : { [nameOrMap]: source }\n : nameOrMap;\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomAttr')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindAttr(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Binds one or more DOM properties to reactive values.\n */\n$.fn.atomProp = function <T>(\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n const map =\n typeof nameOrMap === 'string'\n ? source === undefined\n ? null\n : ({ [nameOrMap]: source } as Record<string, AsyncReactiveValue<unknown>>)\n : (nameOrMap as Record<string, AsyncReactiveValue<unknown>>);\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.MISSING_SOURCE('atomProp')}`);\n return this;\n }\n\n return atomEachElement(this, (ctx) => bindProp(ctx!, map), { needsCtx: true });\n};\n\n/**\n * Shows the element when `condition` is truthy (`display: ''`).\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx!, condition, false), {\n needsCtx: true,\n });\n};\n\n/**\n * Hides the element when `condition` is truthy (`display: 'none'`).\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindVisibility(ctx!, condition, true), {\n needsCtx: true,\n });\n};\n\n/**\n * Two-way binding for `<input>`, `<select>`, and `<textarea>` values.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(\n this,\n (ctx) => bindVal(ctx!, atom as WritableAtom<unknown>, options as ValOptions<unknown>),\n { needsCtx: true }\n );\n};\n\n/**\n * Two-way binding for checkbox and radio button `checked` state.\n */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (ctx) => bindChecked(ctx!, atom), { needsCtx: true });\n};\n\n/**\n * Two-way binding for an entire form.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: FormOptions<T> = {}\n): JQuery {\n return atomEachElement(\n this,\n (_, el) => {\n if (el instanceof HTMLFormElement) {\n bindForm(el, atom as WritableAtom<object>, options as unknown as FormOptions<unknown>);\n } else {\n debug.log(LOG_PREFIXES.BINDING, 'Skipping non-Form element for atomForm');\n }\n },\n { needsCtx: false }\n );\n};\n\n/**\n * Attaches a lifecycle-aware event handler using the jQuery event system.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (ctx) => bindOn(ctx!, event, handler), { needsCtx: true });\n};\n\n/**\n * Lookup table for reactive binding handlers.\n * Ordered to match the bitmask bits in atomBind.\n */\nconst BIND_HANDLERS: Array<(ctx: BindingContext, options: BindingOptions<unknown>) => void> = [\n (ctx, o) =>\n bindText(ctx, ...(unpack(o.text!) as [AsyncReactiveValue<unknown>, (v: unknown) => string])), // 1 << 0\n (ctx, o) => bindHtml(ctx, o.html!), // 1 << 1\n (ctx, o) => bindClass(ctx, o.class!), // 1 << 2\n (ctx, o) => bindCss(ctx, o.css!), // 1 << 3\n (ctx, o) => bindAttr(ctx, o.attr!), // 1 << 4\n (ctx, o) => bindProp(ctx, o.prop as Record<string, AsyncReactiveValue<unknown>>), // 1 << 5\n (ctx, o) => bindVisibility(ctx, o.show!, false), // 1 << 6\n (ctx, o) => bindVisibility(ctx, o.hide!, true), // 1 << 7\n (ctx, o) => bindVal(ctx, ...(unpack(o.val!) as [WritableAtom<unknown>, ValOptions<unknown>])), // 1 << 8\n (ctx, o) => bindChecked(ctx, o.checked!), // 1 << 9\n (ctx, o) => {\n // 1 << 10: form\n if (ctx.el instanceof HTMLFormElement) {\n bindForm(ctx.el, ...(unpack(o.form!) as [WritableAtom<object>, FormOptions<unknown>]));\n }\n },\n (ctx, o) => bindEvents(ctx, o.on!), // 1 << 11\n];\n\n/**\n * Integrated multi-behavior reactive binding.\n * Uses a bitmask dispatch strategy to minimize branch mispredictions in hot-path.\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n let mask = 0;\n if (options.text !== undefined) mask |= 1 << 0;\n if (options.html !== undefined) mask |= 1 << 1;\n if (options.class !== undefined) mask |= 1 << 2;\n if (options.css !== undefined) mask |= 1 << 3;\n if (options.attr !== undefined) mask |= 1 << 4;\n if (options.prop !== undefined) mask |= 1 << 5;\n if (options.show !== undefined) mask |= 1 << 6;\n if (options.hide !== undefined) mask |= 1 << 7;\n if (options.val !== undefined) mask |= 1 << 8;\n if (options.checked !== undefined) mask |= 1 << 9;\n if (options.form !== undefined) mask |= 1 << 10;\n if (options.on !== undefined) mask |= 1 << 11;\n\n if (mask === 0) return this;\n\n return atomEachElement(\n this,\n (ctx) => {\n let m = mask;\n while (m > 0) {\n const bit = m & -m;\n const idx = 31 - Math.clz32(bit);\n BIND_HANDLERS[idx]!(ctx!, options as BindingOptions<unknown>);\n m ^= bit;\n }\n },\n { needsCtx: true }\n );\n};\n\n/**\n * Destroys all reactive bindings on the selected elements **and their descendants**.\n */\n$.fn.atomUnbind = function (this: JQuery): JQuery {\n return atomEachElement(this, (_, el) => bindUnbind(el), { needsCtx: false });\n};\n","import $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/**\n * Ensures an element or jQuery collection is wrapped in a jQuery object.\n */\nexport function wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n/**\n * Sets or removes the 'data-atom-key' attribute on a DOM node or a jQuery collection.\n * This attribute is crucial for tracking which item an element belongs to.\n *\n * @param node - The DOM element, node, or jQuery object.\n * @param key - The key string to set, or null to remove it.\n */\nexport function setAtomKey(node: Element | Node | JQuery, key: string | null): void {\n if (node instanceof Element) {\n if (key === null) node.removeAttribute('data-atom-key');\n else node.setAttribute('data-atom-key', key);\n } else if (!(node as Node).nodeType) {\n // JQuery object\n const elOrJq = node as JQuery;\n for (let i = 0, len = elOrJq.length; i < len; i++) {\n const el = elOrJq[i];\n if (el instanceof Element) {\n if (key === null) el.removeAttribute('data-atom-key');\n else el.setAttribute('data-atom-key', key);\n }\n }\n }\n}\n\n/**\n * Cleans up the registry and effects associated with a tree of DOM nodes.\n *\n * @param node - The root element or a jQuery collection potentially containing multiple roots.\n */\nexport function cleanupNodes(node: Element | JQuery): void {\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n for (let j = 0, nLen = (node as JQuery).length; j < nLen; j++) {\n const el = (node as JQuery)[j];\n if (el instanceof Element) registry.cleanupTree(el);\n }\n }\n}\n","import { LOG_PREFIXES } from '@/constants';\nimport type { EffectObject, ListKey } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { setAtomKey } from './utils';\n\n/**\n * ListContext manages the state of a single atomList instance.\n * It tracks current keys, items, and DOM nodes to perform efficient reconciliation.\n * It also handles asynchronous removal of items and maintains reusable buffers.\n */\nexport class ListContext<T> {\n /** Keys of the items currently in the DOM. */\n oldKeys: ListKey[] = [];\n /** Actual items currently in the DOM. */\n oldItems: T[] = [];\n /** DOM elements or collections corresponding to the items. */\n oldNodes: (Element | JQuery | undefined)[] = [];\n\n /** Keys that are currently in the process of being removed (e.g., during an animation). */\n readonly removingKeys = new Set<ListKey>();\n /** The element displayed when the list is empty. */\n $emptyEl: JQuery | null = null;\n /** Mapping from key to its current index in the oldKeys/oldItems arrays. */\n readonly keyToIndex = new Map<ListKey, number>();\n /** The reactive effect managing this list. */\n fx?: EffectObject;\n\n /** Pre-allocated buffer for storing item states during diffing. */\n statesBuffer = new Uint8Array(256);\n /** Pre-allocated buffer for storing item indices during diffing. */\n indicesBuffer = new Int32Array(256);\n\n constructor(\n public readonly $container: JQuery,\n /** @internal */\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n /**\n * Schedules the removal of an element, optionally waiting for a promise returned by onRemove.\n *\n * @param k - The key of the item being removed.\n * @param $el - The jQuery collection representing the item's DOM nodes.\n */\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n if (this.fx?.isDisposed) return;\n // Race condition check: If the element has been re-added to the list\n // (indicated by having a data-atom-key again), we must NOT remove it.\n if ($el[0] instanceof Element && $el[0].hasAttribute('data-atom-key')) return;\n\n if ($el[0]?.isConnected) $el.remove();\n this.removingKeys.delete(k);\n debug.log(LOG_PREFIXES.LIST, `${this.containerSelector} removed item:`, k);\n };\n\n const res = this.onRemove?.($el);\n if (res instanceof Promise) res.then(commit, commit);\n else commit();\n }\n\n /**\n * Initiates the removal process for an item.\n *\n * @param k - The key of the item.\n * @param $el - The jQuery collection of the item.\n */\n removeItem(k: ListKey, $el: JQuery): void {\n setAtomKey($el, null); // Clear the key to allow re-addition detection\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n /**\n * Resets the context and cleans up resources.\n */\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys.length = 0;\n this.oldItems.length = 0;\n this.oldNodes.length = 0;\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n this.$container.off('.atomList');\n this.statesBuffer = new Uint8Array(0);\n this.indicesBuffer = new Int32Array(0);\n }\n\n /**\n * Ensures that the internal buffers are large enough for the given size.\n *\n * @param size - The required capacity of the buffers.\n */\n ensureBuffers(size: number): void {\n if (this.statesBuffer.length < size) {\n this.statesBuffer = new Uint8Array(Math.max(size, this.statesBuffer.length * 2));\n }\n if (this.indicesBuffer.length < size) {\n this.indicesBuffer = new Int32Array(Math.max(size, this.indicesBuffer.length * 2));\n }\n }\n}\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { ListKey, ListKeyFn, ListOptions } from '@/types';\nimport { shallowEqual } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport type { ListContext } from './context';\nimport type { PreparedDiff } from './types';\n\n/**\n * Performs a reconciliation between the current items in the DOM and the new source items.\n * Uses prefix/suffix trimming and a keyed index map for efficient updates.\n *\n * @param ctx - The list context.\n * @param items - The new array of items.\n * @param itemCount - Number of items in the new array.\n * @param getKey - Function to extract a key from an item.\n * @param update - Optional update hook to prevent full re-renders.\n * @param isEqual - Optional equality check function.\n * @param pools - Object containing resource pools for memory management.\n * @returns A PreparedDiff object containing instructions for the DOM update.\n */\nexport function buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual'],\n pools: {\n map: { acquire: () => Map<ListKey, number>; release: (m: Map<ListKey, number>) => void };\n set: { acquire: () => Set<ListKey>; release: (s: Set<ListKey>) => void };\n array: { acquire: () => unknown[]; release: (a: unknown[]) => void };\n }\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n\n let startIndex = 0,\n oldEndIndex = oldLen - 1,\n newEndIndex = itemCount - 1;\n\n const eq = isEqual || shallowEqual;\n\n // 1. Prefix trimming: Skip items at the beginning that are identical\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!;\n const k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k || !eq(oldItems[startIndex]!, item) || !oldNodes[startIndex]) {\n break;\n }\n keyToIndex.set(k, startIndex++);\n }\n\n // 2. Suffix trimming: Skip identical items at the end\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!;\n const k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k || !eq(oldItems[oldEndIndex]!, item) || !oldNodes[oldEndIndex]) {\n break;\n }\n keyToIndex.set(k, newEndIndex--);\n oldEndIndex--;\n }\n\n // 3. Middle range: Reconcile everything between trimmed prefix and suffix\n const oldIndexMap = pools.map.acquire();\n for (let i = startIndex; i <= oldEndIndex; i++) oldIndexMap.set(oldKeys[i]!, i);\n\n const newKeySet = pools.set.acquire();\n ctx.ensureBuffers(itemCount);\n\n const newKeys = pools.array.acquire() as ListKey[];\n newKeys.length = itemCount;\n const newItems = pools.array.acquire() as T[];\n newItems.length = itemCount;\n const newNodes = pools.array.acquire() as (Element | JQuery | undefined)[];\n newNodes.length = itemCount;\n\n // Track item states:\n // 0: Exists (maybe update)\n // 1: New (create)\n // 2: Force Replace (key exists but content changed significantly/no update fn)\n // 3: Unchanged (trimmed)\n const newStates = ctx.statesBuffer,\n newIndices = ctx.indicesBuffer;\n\n // Items that need to be rendered (either brand new or forced replacement)\n const trKeys = pools.array.acquire() as ListKey[],\n trItems = pools.array.acquire() as T[],\n trIdxs = pools.array.acquire() as number[];\n\n // Fill in prefix (trimmed)\n for (let i = 0; i < startIndex; i++) {\n const k = oldKeys[i]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = 3;\n newIndices[i] = i;\n newKeySet.add(k);\n }\n // Fill in suffix (trimmed)\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n const k = oldKeys[j]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = 3;\n newIndices[i] = j;\n newKeySet.add(k);\n }\n\n // Iterate middle section\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!,\n k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i, ctx.containerSelector));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const oldIdx = oldIndexMap.get(k);\n if (oldIdx === undefined) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newIndices[i] = -1;\n newStates[i] = 1; // Mark as NEW\n continue;\n }\n\n const oldItem = oldItems[oldIdx]!;\n newNodes[i] = oldNodes[oldIdx]!;\n\n if (\n !update &&\n oldItem !== item &&\n !(isEqual ? isEqual(oldItem, item) : shallowEqual(oldItem, item))\n ) {\n trKeys.push(k);\n trItems.push(item);\n trIdxs.push(i);\n newStates[i] = 2; // Mark as FORCE REPLACE\n } else {\n newStates[i] = 0; // Mark as EXISTING\n }\n // If the key is currently being removed (ongoing transition),\n // treat it as conceptually fresh for placement logic.\n newIndices[i] = removingKeys.has(k) ? -1 : oldIdx;\n }\n\n pools.map.release(oldIndexMap);\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n trKeys,\n trItems,\n trIdxs,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n","import $ from 'jquery';\nimport { LOG_PREFIXES } from '@/constants';\nimport type { ListOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { sanitizeHtml } from '@/utils/sanitize';\nimport type { ListContext } from './context';\nimport type { PlaceCallbacks, PreparedDiff } from './types';\nimport { cleanupNodes, setAtomKey, wrap } from './utils';\n\nlet listBatchIdCounter = 0;\n\n/**\n * Helper to insert an element or a jQuery collection before a specific node.\n * Handles both single DOM elements and multi-root jQuery collections.\n *\n * @param elOrJq - The element(s) to insert.\n * @param nextNode - The reference node to insert before.\n * @param container - The parent container.\n */\nexport function insertOrAppend(\n elOrJq: Element | JQuery | undefined,\n nextNode: Node | null,\n container: Element\n): void {\n if (!elOrJq) return;\n if (elOrJq instanceof Element) {\n container.insertBefore(elOrJq, nextNode);\n return;\n }\n const len = elOrJq.length;\n for (let i = 0; i < len; i++) {\n const el = elOrJq[i];\n if (el) {\n container.insertBefore(el, nextNode);\n }\n }\n}\n\n/**\n * Handles the logic when the list becomes empty.\n * Manages the removal of old items and the display of the 'empty' placeholder.\n *\n * @param ctx - The list context.\n * @param itemCount - Current number of items.\n * @param $container - The jQuery container.\n * @param empty - The empty state configuration.\n * @param arrayPool - Resource pool for releasing arrays.\n */\nexport function handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty'],\n arrayPool: { release: (arr: unknown[]) => void }\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n for (let i = 0, len = oldKeys.length; i < len; i++) ctx.removingKeys.delete(oldKeys[i]!);\n $container.empty();\n } else {\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!;\n if (oldNodes[i]) ctx.removeItem(k, wrap(oldNodes[i] as Element | JQuery<Element>));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n ctx.$emptyEl = (typeof empty === 'string'\n ? $(sanitizeHtml(empty))\n : $(empty as Element | JQuery)) as unknown as JQuery;\n ctx.$emptyEl.appendTo($container);\n }\n\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes as unknown[]);\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\n/**\n * Renders the items that need creation or replacement.\n * Implements batch sanitization and optionally 'initial' optimization using innerHTML.\n *\n * @param diff - The prepared diff.\n * @param options - The list options.\n * @param isInitial - Whether this is the very first render of the list.\n * @returns An array of sanitized HTML strings if initial optimization is possible, null otherwise.\n */\nexport function renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { trKeys, trItems, trIdxs, newNodes, newStates } = diff;\n const renderCount = trKeys.length;\n const renderResults: (string | Element | DocumentFragment | JQuery)[] = new Array(renderCount);\n const htmlParts: string[] = [];\n let stringCount = 0;\n\n for (let t = 0; t < renderCount; t++) {\n const raw = options.render(trItems[t]!, trIdxs[t]!);\n renderResults[t] = raw;\n if (typeof raw === 'string') {\n htmlParts.push(raw);\n stringCount++;\n }\n }\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) {\n if (htmlParts.length === 1) sanitized = [sanitizeHtml(htmlParts[0]!)];\n else {\n const sep = `<template data-atom-sep=\"${(listBatchIdCounter++).toString(36)}\"></template>`;\n sanitized = sanitizeHtml(htmlParts.join(sep)).split(sep);\n }\n }\n\n if (\n isInitial &&\n sanitized &&\n stringCount === renderCount &&\n !options.bind &&\n !options.onAdd &&\n !options.onRemove &&\n !options.events\n ) {\n // ensure each rendered string results in a single node\n if ($.parseHTML(sanitized.join('')).length === renderCount) {\n return sanitized;\n }\n }\n\n let fragIdx = 0;\n for (let t = 0; t < renderCount; t++) {\n const raw = renderResults[t]!;\n const $el = (typeof raw === 'string'\n ? $($.parseHTML(sanitized![fragIdx++]!))\n : $(raw as Element | DocumentFragment | JQuery)) as unknown as JQuery;\n const targetIdx = trIdxs[t]!,\n keyStr = String(trKeys[t]!);\n\n setAtomKey($el, keyStr);\n\n if (newStates[targetIdx] === 2 && newNodes[targetIdx]) {\n const node = newNodes[targetIdx]!;\n cleanupNodes(node as Element | JQuery);\n const $old = wrap(node as Element | JQuery<Element>);\n $old.first().before($el);\n $old.remove();\n }\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n return null;\n}\n\n/**\n * Identifies and removes items that are no longer present in the list.\n */\nexport function cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n // If key not in new set and node exists, trigger removal\n if (!newKeySet.has(k) && ctx.oldNodes[i])\n ctx.removeItem(k, wrap(ctx.oldNodes[i] as Element | JQuery<Element>));\n }\n}\n\n/**\n * Places the rendered/updated items into the DOM.\n * Optimizes for both the 'all-new' case and the 'incremental update' case.\n *\n * @param ctx - The list context.\n * @param diff - The prepared diff.\n * @param rawContainer - The raw DOM container element.\n * @param callbacks - Lifecycle hooks.\n * @param innerHtmlFragments - Optional pre-rendered HTML fragments for innerHTML optimization.\n */\nexport function placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n rawContainer: Element,\n callbacks: PlaceCallbacks<T>,\n innerHtmlFragments: string[] | null\n): void {\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const itemCount = newKeys.length;\n\n if (innerHtmlFragments !== null) {\n // Fast-path: If rendering the whole list for the first time and no hooks are needed,\n // we can use innerHTML for maximum performance.\n rawContainer.innerHTML = innerHtmlFragments.join('');\n let el = rawContainer.firstElementChild;\n for (let i = 0; i < itemCount; i++) {\n if (!el) break;\n el.setAttribute('data-atom-key', String(newKeys[i]));\n newNodes[i] = el;\n newStates[i] = 0;\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling;\n }\n return;\n }\n\n if (ctx.oldKeys.length === 0 && ctx.removingKeys.size === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < itemCount; i++) {\n const node = newNodes[i];\n if (!node) continue;\n if (node instanceof Element) frag.appendChild(node);\n else for (let j = 0; j < (node as JQuery).length; j++) frag.appendChild((node as JQuery)[j]!);\n }\n rawContainer.innerHTML = '';\n rawContainer.appendChild(frag);\n } else {\n let nextNode: Node | null = null,\n min = 2147483647;\n for (let i = itemCount - 1; i >= 0; i--) {\n const idx = newIndices[i]!;\n const node = newNodes[i];\n if (!node) continue;\n\n if (idx !== -1 && idx < min) {\n min = idx;\n } else {\n insertOrAppend(node as Element | JQuery, nextNode, rawContainer);\n }\n nextNode = node instanceof Element ? node : ((node as JQuery)[0] ?? null);\n }\n }\n\n for (let i = 0; i < itemCount; i++) {\n const state = newStates[i]!;\n if (state !== 3) {\n const node = newNodes[i];\n if (!node) continue;\n const $el = wrap(node as Element | JQuery<Element>),\n item = newItems[i]!;\n if (state === 0) callbacks.update?.($el, item, i);\n else callbacks.bind?.($el, item, i);\n if (state === 1) {\n callbacks.onAdd?.($el);\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', item);\n }\n }\n }\n}\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport { ArrayPool, ObjectPool } from '@/utils/pool';\nimport { ListContext } from './context';\nimport { buildIndices } from './diff';\nimport { cleanupRemoved, handleEmpty, placeItems, renderItems } from './dom';\nimport type { PlaceCallbacks } from './types';\n\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\n\n/**\n * Pool for reusing Map objects to minimize GC pressure during diffing.\n */\nconst mapPool = new ObjectPool<Map<ListKey, number>>(\n () => new Map(),\n (m) => m.clear()\n);\n\n/**\n * Pool for reusing Set objects during diffing.\n */\nconst setPool = new ObjectPool<Set<ListKey>>(\n () => new Set(),\n (s) => s.clear()\n);\n\n/**\n * Pool for reusing arrays during diffing.\n */\nconst arrayPool = new ArrayPool<unknown>(100, 1024);\n\nconst pools = {\n map: mapPool,\n set: setPool,\n array: arrayPool,\n};\n\n/**\n * atomList binding for jQuery.\n * Efficiently renders and reconciles a list of items based on an Atom source.\n *\n * @param source - The ReadonlyAtom containing the array of items.\n * @param options - Configuration for rendering, keys, and lifecycle hooks.\n * @returns The original jQuery collection for chaining.\n */\nfunction atomList<T>(this: JQuery, source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const getKey: ListKeyFn<T> =\n typeof options.key === 'function'\n ? options.key\n : (item: T) => item[options.key as keyof T] as unknown as ListKey;\n\n const callbacks: PlaceCallbacks<T> = {\n bind: options.bind,\n update: options.update,\n onAdd: options.onAdd,\n onRemove: options.onRemove,\n events: options.events,\n };\n\n // Each element in the jQuery collection can host a separate list instance.\n for (let cIdx = 0, cLen = this.length; cIdx < cLen; cIdx++) {\n const raw = this[cIdx]!,\n $c = $(raw);\n\n // Clean up existing instance if any\n $c.off('.atomList');\n const old = listInstances.get(raw);\n if (old) {\n old.fx.dispose();\n old.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(raw), options.onRemove);\n\n // Create a reactive effect that automatically re-runs when 'source' changes\n const fx = effect(() => {\n const items = source.value,\n len = items.length;\n\n // Reconcilation is performance critical, use untracked to avoid\n // accidental dependencies inside the complex logic.\n untracked(() => {\n // 1. Handle empty state\n handleEmpty(ctx, len, $c, options.empty, arrayPool);\n if (len === 0) return;\n\n debug.log(LOG_PREFIXES.LIST, `${ctx.containerSelector} updating with ${len} items`);\n\n // 2. Build diff information (reconciliation)\n const diff = buildIndices(ctx, items, len, getKey, options.update, options.isEqual, pools);\n\n // 3. Render new items (or update existing ones if strings provided)\n const frag = renderItems(diff, options, ctx.oldKeys.length === 0);\n\n // 4. Mark removed items for deletion (handles async transitions)\n cleanupRemoved(ctx, diff);\n\n // 5. Place nodes in the DOM and call lifecycle hooks\n placeItems(ctx, diff, raw, callbacks, frag);\n\n // Update event mapping if needed\n if (options.events) {\n for (let i = diff.startIndex; i <= diff.oldEndIndex; i++) {\n if (!diff.newKeySet.has(ctx.oldKeys[i]!)) ctx.keyToIndex.delete(ctx.oldKeys[i]!);\n }\n }\n\n // Release old memory back to pools\n arrayPool.release(ctx.oldKeys);\n arrayPool.release(ctx.oldItems);\n arrayPool.release(ctx.oldNodes as unknown[]);\n\n // Sync context with new state\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n\n // Release diff-specific structures\n setPool.release(diff.newKeySet);\n arrayPool.release(diff.trKeys);\n arrayPool.release(diff.trItems);\n arrayPool.release(diff.trIdxs);\n });\n });\n\n ctx.fx = fx;\n\n // Event delegation support\n if (options.events) {\n for (const ek in options.events) {\n if (!hasOwn.call(options.events, ek)) continue;\n const s = ek.indexOf(' '),\n type = s === -1 ? ek : ek.slice(0, s),\n sel = s === -1 ? '> *' : ek.slice(s + 1).trim();\n const handler = options.events[ek]!;\n\n $c.on(`${type}.atomList`, sel, function (this: Element, e: JQuery.TriggeredEvent) {\n // Use data-atom-key to find the corresponding item in the context\n const itemEl = (e.target as Element).closest?.('[data-atom-key]') as HTMLElement | null;\n const rk = itemEl?.getAttribute('data-atom-key');\n if (rk === null || rk === undefined) return;\n\n let k: ListKey = rk;\n if (!ctx.keyToIndex.has(rk)) {\n const nk = Number(rk); // Try converting to number for key lookup\n if (!Number.isNaN(nk) && ctx.keyToIndex.has(nk)) k = nk;\n }\n const idx = ctx.keyToIndex.get(k);\n if (idx !== undefined) handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n });\n }\n }\n\n registry.trackEffect(raw, fx);\n listInstances.set(raw, { fx, ctx });\n registry.trackCleanup(raw, () => {\n ctx.dispose();\n listInstances.delete(raw);\n });\n }\n return this;\n}\n\n$.fn.atomList = atomList;\n","import { batch, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { bindUnbind } from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { atomEachElement } from '@/core/dom';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\nimport { debug } from '@/utils/debug';\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, which is why the cast is explicit\n * rather than implicit.\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const p = (props ?? EMPTY_PROPS) as P;\n const compName = component.name || 'Component';\n\n return atomEachElement(this, (_, el) => {\n registry.cleanupTree(el);\n try {\n // Untracked + Batched execution:\n // prevents component initialization from leaking into parent effects\n // and ensures multiple initial state updates only trigger one flush.\n const teardown = untracked(() => batch(() => component($(el), p)));\n if (typeof teardown === 'function') {\n registry.setComponentCleanup(el, teardown);\n }\n } catch (err) {\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.ERROR(compName), err);\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 (this: JQuery): JQuery {\n return atomEachElement(this, (_, el) => bindUnbind(el));\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 { registry } from '@/core/registry';\nimport type { RouteConfig, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n// --- Helper: Safe History API Wrappers ---\n\n/**\n * Safely executes history.pushState with a fallback for restricted environments.\n * Prevents crashes in 'file://' protocol or security-restricted contexts.\n *\n * @param data State data to associate with the new history entry\n * @param url The new URL to display in the address bar\n */\nfunction safePushState(data: unknown, url: string | URL | null): void {\n try {\n history.pushState(data, '', url);\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 }\n}\n\n/**\n * Solid Implementation of the SPA Router.\n * Supports both standard History API and Hash-based routing.\n * Integrates with atom-effect for reactive route and query parameter tracking.\n */\nclass RouterImpl implements Router {\n /** Reactive atom holding the currently active route name */\n public currentRoute: ReadonlyAtom<string>;\n /** Reactive atom holding the current URL query parameters as an object */\n public queryParams: ReadonlyAtom<Record<string, string>>;\n\n private config: Required<RouteConfig>;\n private readonly isHistoryMode: boolean;\n private readonly basePath: string;\n private readonly activeClass: string;\n\n private isDestroyed = false;\n private previousRoute = '';\n private previousUrl: string;\n /** Global cleanup functions for the router instance */\n private cleanups: Array<() => void> = [];\n /** The root element where routes are rendered */\n private $target: JQuery;\n private currentRouteAtom: WritableAtom<string>;\n private queryParamsAtom: WritableAtom<Record<string, string>>;\n /** Cache for HTMLTemplateElements to avoid repeated DOM lookups */\n private templateCache = new Map<string, HTMLTemplateElement>();\n /** Cleanup functions specific to the currently rendered route (disposed on route change) */\n private routeCleanups: Array<() => void> = [];\n /** Tracker for query string changes to prevent redundant updates */\n private lastRawQuery = '';\n private cachedParams: Record<string, string> = {};\n\n /**\n * Parses a raw query string into a key-value object.\n */\n private parseQueryParams(raw: string): Record<string, string> {\n const res: Record<string, string> = {};\n if (raw) {\n new URLSearchParams(raw).forEach((v, k) => {\n res[k] = v;\n });\n }\n return res;\n }\n\n constructor(config: RouteConfig) {\n // Fill in defaults for missing configuration options\n this.config = {\n mode: ROUTE_DEFAULTS.mode,\n basePath: ROUTE_DEFAULTS.basePath,\n autoBindLinks: ROUTE_DEFAULTS.autoBindLinks,\n activeClass: ROUTE_DEFAULTS.activeClass,\n notFound: config.notFound || '',\n beforeTransition: config.beforeTransition || (() => {}),\n afterTransition: config.afterTransition || (() => {}),\n ...config,\n } as Required<RouteConfig>;\n\n this.isHistoryMode = this.config.mode === 'history';\n // Normalize base path by removing trailing slash\n this.basePath = this.config.basePath.replace(/\\/$/, '');\n this.activeClass = this.config.activeClass;\n\n this.$target = $(this.config.target);\n // Initialize previous URL stack based on mode\n this.previousUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n\n // Initialize reactive atoms with current browser state\n this.currentRouteAtom = createAtom(this.getRouteName());\n this.currentRoute = this.currentRouteAtom;\n this.queryParamsAtom = createAtom(this.getQueryParams());\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n this.init();\n }\n\n /**\n * Sets up event listeners and core reactive effects.\n */\n private init() {\n // Listen for browser navigation (back/forward)\n const event = this.isHistoryMode ? 'popstate' : 'hashchange';\n const handler = this.handleUrlChange.bind(this);\n window.addEventListener(event, handler);\n this.cleanups.push(() => window.removeEventListener(event, handler));\n\n // Reactive effect that handles DOM rendering when the current route atom changes\n const renderEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n\n // Dispose old route-specific effects before rendering the new one\n untracked(() => {\n for (const fn of this.routeCleanups) {\n try {\n fn();\n } catch {}\n }\n this.routeCleanups.length = 0;\n });\n\n this.renderRoute(routeName);\n });\n this.cleanups.push(() => renderEffect.dispose());\n\n // Setup automatic link binding for [data-route] elements\n this.setupAutoBindLinks();\n\n // Register with global registry if target exists for auto-destruction\n if (this.$target[0]) {\n registry.trackCleanup(this.$target[0], () => this.destroy());\n }\n }\n\n /**\n * Determines the current route name from the URL based on the routing mode.\n */\n private getRouteName(): string {\n const { default: defaultRoute } = this.config;\n if (this.isHistoryMode) {\n const base = this.basePath;\n let path = location.pathname;\n // Strip base path from the URL to get the logical route\n if (base && (path === base || path.startsWith(`${base}/`))) {\n path = path.substring(base.length);\n }\n return path.replace(/^\\/+/, '') || defaultRoute!;\n }\n const hash = location.hash;\n const { route } = this.splitPath(hash.startsWith('#') ? hash.substring(1) : hash);\n return route || defaultRoute!;\n }\n\n /**\n * Extracts and parses query parameters from the browser URL.\n * Includes primitive caching to skip redundant parsing.\n */\n private getQueryParams(): Record<string, string> {\n const raw = this.getCurrentRawQuery();\n // Optimization: Skip parsing if the raw query string hasn't changed\n if (raw === this.lastRawQuery) return this.cachedParams;\n this.lastRawQuery = raw;\n\n const res = this.parseQueryParams(raw);\n // Deep equality check to prevent downstream reactive triggers if values are identical\n if (this.areParamsEqual(res, this.cachedParams)) return this.cachedParams;\n\n // Validate URI encoding to catch malformed query components\n if (raw.indexOf('%') !== -1) {\n try {\n decodeURIComponent(raw);\n } catch {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n }\n\n this.cachedParams = res;\n return res;\n }\n\n /**\n * Helper to get the raw query string regardless of routing mode.\n */\n private getCurrentRawQuery(): string {\n if (this.isHistoryMode) return location.search.substring(1);\n const hash = location.hash;\n const queryIndex = hash.indexOf('?');\n return queryIndex !== -1 ? hash.substring(queryIndex + 1) : '';\n }\n\n /**\n * Performs shallow comparison of two query parameter objects.\n */\n private areParamsEqual(a: Record<string, string>, b: Record<string, string>): boolean {\n const keysA = Object.keys(a);\n if (keysA.length !== Object.keys(b).length) return false;\n for (const k of keysA) {\n if (a[k] !== b[k]) return false;\n }\n return true;\n }\n\n /**\n * Splits a path string into route and query components.\n * @param path Full string to split (e.g., \"products/list?sort=asc\")\n */\n private splitPath(path: string): { route: string; query: string | undefined } {\n const queryIndex = path.indexOf('?');\n const route = queryIndex !== -1 ? path.slice(0, queryIndex) : path;\n const query = queryIndex !== -1 ? path.slice(queryIndex + 1) : undefined;\n return {\n route: route.replace(/^\\/+/, ''),\n query,\n };\n }\n\n /**\n * Updates the browser URL to match the given route name.\n * @param name Internal route path (e.g., \"login\")\n */\n private setUrl(name: string): void {\n const { route, query } = this.splitPath(name);\n const fullPath = query ? `${route}?${query}` : route;\n const url = this.isHistoryMode ? `${this.basePath}/${fullPath}` : `#${fullPath}`;\n\n if (this.isHistoryMode) {\n safePushState(null, url);\n } else {\n location.hash = url;\n }\n this.previousUrl = this.isHistoryMode ? url : location.hash;\n }\n\n /**\n * Reverts the browser URL to the last known successful state (used for navigation guards).\n */\n private restoreUrl(): void {\n try {\n if (this.isHistoryMode) {\n history.replaceState(null, '', this.previousUrl);\n } else {\n location.hash = this.previousUrl;\n }\n } catch (e) {\n debug.warn(LOG_PREFIXES.ROUTE, 'Restore URL failed', e);\n }\n }\n\n /**\n * Renders the UI content associated with a route name.\n * Handles lifecycle hooks (beforeTransition, onEnter, onMount, afterTransition).\n * Supports both function-based rendering and HTML template cloning.\n *\n * @param name The route name to render\n */\n private renderRoute(name: string): void {\n if (this.isDestroyed || !this.$target[0]) return;\n\n const { routes, notFound, beforeTransition, afterTransition } = this.config;\n // Fallback to 'notFound' route if the requested route doesn't exist\n const cfg = routes[name] ?? (notFound ? routes[notFound] : undefined);\n\n if (!cfg) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(name));\n return;\n }\n\n const params = this.getQueryParams();\n const from = this.previousRoute;\n\n // Trigger global hook before transition starts\n if (beforeTransition) untracked(() => beforeTransition(from, name));\n\n // Flush current view\n this.$target.empty();\n\n let routeParams = params;\n // Process route-level enter guard and parameter resolution\n if (cfg.onEnter) {\n const res = untracked(() => cfg.onEnter!(params, this));\n if (res) routeParams = { ...params, ...res };\n }\n\n // Helper to register per-route cleanup logic (e.g., event listeners or timers)\n const onUnmount = (fn: () => void) => this.routeCleanups.push(fn);\n\n if (cfg.render) {\n // Logic defined in code (custom composition)\n cfg.render(this.$target[0], name, routeParams, onUnmount, this);\n } else if (cfg.template) {\n // Logic defined in HTML <template> tags\n let tmpl = this.templateCache.get(cfg.template);\n if (!tmpl) {\n const el = document.querySelector(cfg.template);\n if (el instanceof HTMLTemplateElement) {\n tmpl = el;\n this.templateCache.set(cfg.template, tmpl);\n } else {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.TEMPLATE_NOT_FOUND(cfg.template));\n return;\n }\n }\n this.$target.append(tmpl.content.cloneNode(true) as DocumentFragment);\n // Run optional mount hook for template-based views\n if (cfg.onMount) {\n cfg.onMount(this.$target.children(), onUnmount, this);\n }\n }\n\n // Trigger global hook after successful transition\n if (afterTransition) untracked(() => afterTransition(from, name));\n this.previousRoute = name;\n }\n\n /**\n * Internal listener for URL changes (back/forward or external hash modification).\n * Executes the onLeave guard before proceeding with navigation.\n */\n private handleUrlChange(): void {\n if (this.isDestroyed) return;\n\n const currentUrl = this.isHistoryMode ? location.pathname + location.search : location.hash;\n // If the URL actually hasn't changed, do nothing\n if (currentUrl === this.previousUrl) return;\n\n const nextRoute = this.getRouteName();\n const oldRoute = this.currentRouteAtom.peek();\n\n if (oldRoute !== nextRoute) {\n // Execute the 'onLeave' guard for the current route\n if (untracked(() => this.config.routes[oldRoute]?.onLeave?.(this)) === false) {\n // If the guard returns false, cancel navigation and revert the URL\n this.restoreUrl();\n return;\n }\n this.currentRouteAtom.value = nextRoute;\n }\n\n // Always update query params to match the new URL\n this.queryParamsAtom.value = this.getQueryParams();\n this.previousUrl = currentUrl;\n }\n\n /**\n * Sets up automatic delegation for all links marked with [data-route].\n * Also initializes a reactive link highlighter for \"active\" states.\n */\n private setupAutoBindLinks(): void {\n if (!this.config.autoBindLinks) return;\n\n // Handle clicks on [data-route] elements globally via delegation\n const onClick = (e: JQuery.TriggeredEvent) => {\n e.preventDefault();\n const r = (e.currentTarget as HTMLElement).dataset.route;\n if (r != null) this.navigate(r);\n };\n $(document).on('click', '[data-route]', onClick);\n this.cleanups.push(() => $(document).off('click', '[data-route]', onClick));\n\n // Reactive effect to toggle active classes and ARIA attributes on relevant links\n let previousActiveNodes: HTMLElement[] = [];\n const activeLinkEffect = effect(() => {\n const routeName = this.currentRouteAtom.value;\n const activeClass = this.activeClass;\n\n untracked(() => {\n // Clear previous state to ensure only the currently active route is highlighted\n for (const el of previousActiveNodes) {\n el.classList.remove(activeClass);\n el.removeAttribute('aria-current');\n }\n\n try {\n const selector = `[data-route=\"${routeName.replace(/\"/g, '\\\\\"')}\"]`;\n const nodes = Array.from(document.querySelectorAll<HTMLElement>(selector));\n for (const el of nodes) {\n el.classList.add(activeClass);\n el.setAttribute('aria-current', 'page');\n }\n previousActiveNodes = nodes;\n } catch {\n previousActiveNodes = [];\n }\n });\n });\n\n this.cleanups.push(() => {\n activeLinkEffect.dispose();\n previousActiveNodes.length = 0;\n });\n }\n\n /**\n * Programmatically navigate to a specified route.\n * Checks the 'onLeave' guard before performing the transition.\n *\n * @param name Route path or full URL (e.g., \"products/1\" or \"info?tab=desc\")\n */\n public navigate(name: string): void {\n if (this.isDestroyed) return;\n\n const old = this.currentRouteAtom.peek();\n // Run exit guard for current route\n if (this.config.routes[old]?.onLeave?.(this) === false) return;\n\n const { route: routePart, query: queryPart } = this.splitPath(name);\n const resolvedRoute = routePart || this.config.default || '';\n if (!resolvedRoute) return;\n\n // Batch atom updates to prevent flickering or multiple partial renders\n $.batch(() => {\n this.setUrl(name);\n\n const nextParams = queryPart ? this.parseQueryParams(queryPart) : {};\n if (!this.areParamsEqual(nextParams, this.queryParamsAtom.peek())) {\n this.queryParamsAtom.value = nextParams;\n }\n this.currentRouteAtom.value = resolvedRoute;\n });\n }\n\n /**\n * Shuts down the router, clearing all event listeners, effects, and caches.\n */\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n\n for (const fn of this.cleanups) {\n try {\n fn();\n } catch {}\n }\n this.cleanups.length = 0;\n this.templateCache.clear();\n }\n}\n\n/**\n * Factory function to create a new SPA router instance with reactive state management.\n *\n * @param config Configuration for the internal routing engine and route mapping.\n * @returns A Router instance for controlling navigation and tracking state.\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n// Extend jQuery static namespace for easy global access\n$.extend({\n route,\n});\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n// ============================================================================\n// atomFetch\n// ============================================================================\n\n/**\n * Context for a reactive fetch operation.\n * Manages the lifecycle of a single $.ajax request, including automatic\n * cancellation (via AbortController) and reactive URL/option resolution.\n */\nclass FetchContext<T> {\n private abortController: AbortController | null = null;\n private readonly staticOptions: JQuery.AjaxSettings;\n private readonly ajaxOptionsFn: (() => JQuery.AjaxSettings) | undefined;\n private readonly getUrl: () => string;\n\n /**\n * Optimization: If true, the URL is a static string and doesn't need to be\n * re-evaluated within a reactive scope.\n */\n private readonly isStaticUrl: boolean;\n private readonly staticUrl: string | undefined;\n\n private readonly transformFn: ((val: unknown) => T) | undefined;\n private readonly onErrorFn: ((err: unknown) => void) | undefined;\n\n constructor(urlOrFn: string | (() => string), options: FetchOptions<T>) {\n const isStatic = typeof urlOrFn === 'string';\n this.isStaticUrl = isStatic;\n if (isStatic) {\n this.staticUrl = urlOrFn as string;\n this.getUrl = () => this.staticUrl!;\n } else {\n this.getUrl = urlOrFn as () => string;\n }\n\n this.ajaxOptionsFn =\n typeof options.ajaxOptions === 'function' ? options.ajaxOptions : undefined;\n\n const baseAjax = typeof options.ajaxOptions === 'object' ? options.ajaxOptions : {};\n this.staticOptions = {\n ...baseAjax,\n headers: { ...(baseAjax as JQuery.AjaxSettings)?.headers, ...options.headers },\n };\n if (options.method) {\n this.staticOptions.method = options.method;\n }\n\n this.transformFn = options.transform;\n this.onErrorFn = options.onError;\n }\n\n public abort(): void {\n this.abortController?.abort();\n }\n\n private handleError(err: unknown): never {\n let final: Error;\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const x = err as JQuery.jqXHR;\n final = new Error(`Network Error: ${x.statusText || 'Unknown'} (${x.status})`);\n (final as FetchError).jqXHR = x;\n } else {\n final = err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n }\n\n if (this.onErrorFn) {\n try {\n this.onErrorFn(final);\n } catch {\n // Suppress errors in error callback\n }\n }\n throw final;\n }\n\n public execute = async (): Promise<T> => {\n this.abort();\n const controller = new AbortController();\n this.abortController = controller;\n const { signal } = controller;\n\n let onAbort: (() => void) | undefined;\n\n try {\n const settings = this.prepareSettings();\n const xhr = $.ajax(settings);\n\n // Link AbortSignal to jqXHR\n onAbort = () => xhr.abort();\n signal.addEventListener('abort', onAbort);\n if (signal.aborted) xhr.abort();\n\n const raw = await xhr;\n return this.transformFn ? this.transformFn(raw) : (raw as T);\n } catch (err) {\n if (signal.aborted) throw this.createAbortError();\n return this.handleError(err);\n } finally {\n if (onAbort) signal.removeEventListener('abort', onAbort);\n if (this.abortController === controller) {\n this.abortController = null;\n }\n }\n };\n\n private prepareSettings(): JQuery.AjaxSettings {\n const dynamicOptions = this.ajaxOptionsFn?.() ?? {};\n return {\n ...this.staticOptions,\n ...dynamicOptions,\n headers: { ...this.staticOptions.headers, ...dynamicOptions.headers },\n url: this.isStaticUrl ? this.staticUrl : this.getUrl(),\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n }\n\n private createAbortError(): Error {\n const e = new Error('AbortError');\n e.name = 'AbortError';\n return e;\n }\n}\n\n/**\n * Creates a declarative reactive AJAX primitive.\n * Wraps core's async `computed` with jQuery's `$.ajax`.\n *\n * Features:\n * - Auto-Cancellation: Aborts pending requests when dependencies change.\n * - Reactive URL: Re-fetches automatically if `urlOrFn` depends on atoms.\n * - Error Isolation: Network errors are captured in .hasError/.lastError.\n */\n$.extend({\n atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const ctx = new FetchContext<T>(urlOrFn, options);\n const atomVal = computed(ctx.execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n });\n\n const originalDispose = atomVal.dispose.bind(atomVal);\n atomVal.dispose = () => {\n ctx.abort();\n originalDispose();\n };\n\n return Object.assign(atomVal, {\n abort: () => ctx.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\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';\nimport '@/core/namespace'; // $.atom, $.computed, etc.\nimport '@/bindings/chainable'; // $.fn.atomText, etc.\nimport '@/bindings/list'; // $.fn.atomList\nimport '@/bindings/mount'; // $.fn.atomMount\nimport '@/features/route'; // $.route\nimport '@/features/fetch'; // $.atomFetch\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n// Global initialization on DOM ready.\n$(() => {\n enablejQueryOverrides();\n if (document.body) {\n enableAutoCleanup(document.body);\n }\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { nextTick } from '@/core/namespace';\nexport type {\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchOptions,\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n RenderRoute,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n TemplateRoute,\n ValOptions,\n WritableAtom,\n} from '@/types';\nexport { isReactive } from '@/utils';\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\nexport default $;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["$"],"sources":["../../core/dist/index.mjs","../src/constants.ts","../src/utils/index.ts","../src/utils/debug.ts","../src/core/namespace.ts","../src/core/registry.ts","../src/core/jquery-patch.ts","../src/types.ts","../src/bindings/input-binding.ts","../src/core/effect-factory.ts","../src/utils/sanitize.ts","../src/bindings/unified.ts","../src/bindings/form.ts","../src/core/dom.ts","../src/bindings/chainable.ts","../src/bindings/list/utils.ts","../src/bindings/list/context.ts","../src/bindings/list/types.ts","../src/bindings/list/diff.ts","../src/bindings/list/dom.ts","../src/bindings/list/index.ts","../src/bindings/mount.ts","../src/features/route.ts","../src/features/fetch.ts","../src/features/nav.ts","../src/index.ts"],"sourcesContent":["var h = {\n DISPOSED: 1,\n IS_COMPUTED: 2,\n DIRTY: 256,\n RECOMPUTING: 512,\n HAS_ERROR: 1024,\n FORCE_COMPUTE: 2048,\n IDLE: 65536,\n PENDING: 131072,\n RESOLVED: 262144,\n REJECTED: 524288,\n ATOM_SYNC: 16777216,\n ATOM_NOTIFICATION_SCHEDULED: 33554432,\n EFFECT_EXECUTING: 268435456\n}, yt = Object.freeze({\n ASYNC_STATE: h.IDLE | h.PENDING | h.RESOLVED | h.REJECTED,\n COMPUTED_DIRTY_MASK: h.DIRTY | h.RECOMPUTING | h.FORCE_COMPUTE\n}), P = Object.freeze({\n IDLE: \"idle\",\n PENDING: \"pending\",\n RESOLVED: \"resolved\",\n REJECTED: \"rejected\"\n}), S = Object.freeze({\n DISPOSED: h.DISPOSED,\n EXECUTING: h.EFFECT_EXECUTING\n}), $ = Object.freeze({\n DISPOSED: h.DISPOSED,\n IS_COMPUTED: h.IS_COMPUTED,\n DIRTY: h.DIRTY,\n IDLE: h.IDLE,\n PENDING: h.PENDING,\n RESOLVED: h.RESOLVED,\n REJECTED: h.REJECTED,\n RECOMPUTING: h.RECOMPUTING,\n HAS_ERROR: h.HAS_ERROR,\n FORCE_COMPUTE: h.FORCE_COMPUTE\n}), C = Object.freeze({\n DISPOSED: h.DISPOSED,\n SYNC: h.ATOM_SYNC,\n NOTIFICATION_SCHEDULED: h.ATOM_NOTIFICATION_SCHEDULED\n}), g = Object.freeze({\n MAX_EXECUTIONS_PER_SECOND: 1e3,\n MAX_EXECUTIONS_PER_EFFECT: 100,\n MAX_EXECUTIONS_PER_FLUSH: 1e4,\n MAX_FLUSH_ITERATIONS: 1e3,\n MIN_FLUSH_ITERATIONS: 10,\n BATCH_QUEUE_SHRINK_THRESHOLD: 1e3\n}), H = 1073741823, W = Object.freeze({\n WARN_INFINITE_LOOP: !0,\n EFFECT_FREQUENCY_WINDOW: 1e3,\n LOOP_THRESHOLD: 100\n}), Et = Object.freeze({ MAX_PROMISE_ID: H }), U = Object.freeze({\n UNINITIALIZED: -1,\n MIN: 1\n}), ht = !1;\ntry {\n ht = !!(typeof globalThis < \"u\" && globalThis.__ATOM_DEBUG__ || typeof sessionStorage < \"u\" && sessionStorage.getItem(\"__ATOM_DEBUG__\") === \"true\");\n} catch {\n}\nvar f = (typeof process < \"u\" && process.env, typeof __DEV__ < \"u\" && !!__DEV__ || ht), it = Object.freeze([]), y = class j extends Error {\n constructor(e, s = null, i = !0, n) {\n super(e), this.cause = s, this.recoverable = i, this.code = n, this.name = \"AtomError\", Error.captureStackTrace && Error.captureStackTrace(this, this.constructor);\n }\n getChain() {\n const e = this.cause;\n if (e == null) return [this];\n const s = [this];\n let i = e, n = null;\n for (; i != null && (s.push(i), !(i === this || n?.has(i))); ) {\n if (i instanceof j) i = i.cause;\n else if (i instanceof Error) i = i.cause;\n else break;\n s.length > 3 && (n === null ? n = new Set(s) : n.add(i));\n }\n return s;\n }\n toJSON(e) {\n const s = e ?? /* @__PURE__ */ new Set();\n if (s.has(this)) return {\n name: this.name,\n message: \"[Circular Reference]\",\n recoverable: this.recoverable,\n code: this.code\n };\n s.add(this);\n let i = this.cause;\n return i instanceof j ? i = i.toJSON(s) : i instanceof Error && (i = {\n name: i.name,\n message: i.message,\n stack: i.stack,\n cause: i.cause\n }), {\n name: this.name,\n message: this.message,\n code: this.code,\n recoverable: this.recoverable,\n stack: this.stack,\n cause: i\n };\n }\n static format(e, s, i) {\n return `${e} (${s}): ${i}`;\n }\n}, w = class extends y {\n constructor(...t) {\n super(...t), this.name = \"ComputedError\";\n }\n}, N = class extends y {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"EffectError\";\n }\n}, x = class extends y {\n constructor(t, e = null, s = !1, i) {\n super(t, e, s, i), this.name = \"SchedulerError\";\n }\n}, l = {\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_SUBSCRIBER_MUST_BE_FUNCTION: \"Subscriber must be a function or Subscriber object\",\n ATOM_INDIVIDUAL_SUBSCRIBER_FAILED: \"Subscriber execution failed\",\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_FLUSH_OVERFLOW: (t, e) => `Maximum flush iterations (${t}) exceeded. ${e} jobs dropped. Possible infinite loop.`,\n CALLBACK_ERROR_IN_ERROR_HANDLER: \"Exception encountered in onError handler\",\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 BATCH_CALLBACK_MUST_BE_FUNCTION: \"Batch callback must be a function\"\n};\nfunction A(t, e, s) {\n return t instanceof y ? new e(`${t.name} (${s}): ${t.message}`, t, t.recoverable, t.code) : t instanceof Error ? new e(`${t.name || \"Error\"} (${s}): ${t.message}`, t) : new e(`Unexpected error (${s}): ${String(t)}`, t);\n}\nvar nt = /* @__PURE__ */ Symbol(\"AtomEffect.DebugName\"), dt = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), rt = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), G = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), pt = \"[Atom Effect]\", M = () => {\n}, It = class {\n constructor() {\n this.enabled = !0, this.warnInfiniteLoop = W.WARN_INFINITE_LOOP, this._updateCounts = /* @__PURE__ */ new Map(), this._nodeRegistry = /* @__PURE__ */ new Map(), this._threshold = W.LOOP_THRESHOLD, this._cleanupScheduled = !1, this.warn = (t, e) => {\n this.enabled && t && console.warn(`${pt} ${e}`);\n }, this.registerNode = (t) => {\n this._nodeRegistry.set(t.id, new WeakRef(t));\n }, this.attachDebugInfo = (t, e, s, i) => {\n if (!this.enabled) return;\n const n = t;\n n[nt] = i ?? `${e}_${s}`, n[dt] = s, n[rt] = e, this.registerNode(t);\n }, this.trackUpdate = (t, e) => {\n if (!this.enabled || !this.warnInfiniteLoop) return;\n const s = this._updateCounts, i = (s.get(t) ?? 0) + 1;\n i > this._threshold ? this.warn(!0, `Infinite loop detected for ${e ?? `dependency ${t}`}. Over ${this._threshold} updates in a single execution scope.`) : s.set(t, i), this._cleanupScheduled || (this._cleanupScheduled = !0, queueMicrotask(() => {\n this._updateCounts.clear(), this._cleanupScheduled = !1;\n }));\n }, this.dumpGraph = () => {\n const t = [];\n for (const [e, s] of this._nodeRegistry) {\n const i = s.deref();\n i ? t.push({\n id: e,\n name: this.getDebugName(i),\n type: this.getDebugType(i),\n updateCount: this._updateCounts.get(e) ?? 0\n }) : (this._nodeRegistry.delete(e), this._updateCounts.delete(e));\n }\n return t;\n }, this.getDebugName = (t) => {\n if (t != null)\n return t[nt];\n }, this.getDebugType = (t) => {\n if (t != null)\n return t[rt];\n };\n }\n}, Ct = {\n enabled: !1,\n warnInfiniteLoop: !1,\n warn: M,\n registerNode: M,\n attachDebugInfo: M,\n trackUpdate: M,\n dumpGraph: () => [],\n getDebugName: () => {\n },\n getDebugType: () => {\n }\n}, d = f ? new It() : Ct, Dt = 1, gt = () => Dt++ | 0, lt = class {\n constructor() {\n this._count = 0, this._actualCount = 0, this._s0 = null, this._s1 = null, this._s2 = null, this._s3 = null, this._overflow = null, this._freeIndices = null;\n }\n _rawWrite(t, e) {\n if (t < 4) t === 0 ? this._s0 = e : t === 1 ? this._s1 = e : t === 2 ? this._s2 = e : this._s3 = e;\n else {\n this._overflow === null && (this._overflow = []);\n const s = this._overflow;\n s[t - 4] = e;\n }\n }\n _rawAdd(t) {\n if (this._s0 === null)\n return this._s0 = t, 0;\n if (this._s1 === null)\n return this._s1 = t, 1;\n if (this._s2 === null)\n return this._s2 = t, 2;\n if (this._s3 === null)\n return this._s3 = t, 3;\n this._overflow === null && (this._overflow = []);\n const e = this._overflow, s = this._freeIndices;\n if (s !== null && s.length > 0) {\n const i = s.pop();\n return e[i] = t, i + 4;\n }\n return e.push(t), 3 + e.length;\n }\n _rawSwap(t, e) {\n if (t === e) return;\n const s = this.getAt(t), i = this.getAt(e);\n this._rawWrite(t, i), this._rawWrite(e, s);\n }\n get size() {\n return this._actualCount;\n }\n get physicalSize() {\n return this._count;\n }\n getAt(t) {\n if (t < 4)\n return t === 0 ? this._s0 : t === 1 ? this._s1 : t === 2 ? this._s2 : t === 3 ? this._s3 : null;\n const e = this._overflow;\n return e === null ? null : e[t - 4] ?? null;\n }\n setAt(t, e) {\n const s = this.getAt(t);\n s !== e && (this._rawWrite(t, e), s === null ? this._actualCount++ : e === null && this._actualCount--, e !== null ? t >= this._count && (this._count = t + 1) : this._shrinkPhysicalSizeFrom(t));\n }\n _shrinkPhysicalSizeFrom(t) {\n if (t === this._count - 1) {\n if (this._count--, this._count > 4) {\n const e = this._overflow;\n for (; this._count > 4 && e[this._count - 5] === null; ) this._count--;\n }\n this._count === 4 && this._s3 === null && (this._count = 3, this._s2 === null && (this._count = 2, this._s1 === null && (this._count = 1, this._s0 === null && (this._count = 0))));\n }\n }\n truncateFrom(t) {\n t <= 3 && (t <= 3 && this._s3 !== null && (this._onItemRemoved(this._s3), this._s3 = null, this._actualCount--), t <= 2 && this._s2 !== null && (this._onItemRemoved(this._s2), this._s2 = null, this._actualCount--), t <= 1 && this._s1 !== null && (this._onItemRemoved(this._s1), this._s1 = null, this._actualCount--), t <= 0 && this._s0 !== null && (this._onItemRemoved(this._s0), this._s0 = null, this._actualCount--));\n const e = this._overflow;\n if (e !== null) {\n const s = t > 4 ? t - 4 : 0, i = e.length;\n for (let n = s; n < i; n++) {\n const r = e[n];\n r != null && (this._onItemRemoved(r), e[n] = null, this._actualCount--);\n }\n t <= 4 ? this._overflow = null : e.length = t - 4;\n }\n this._count = t, this._actualCount < 0 && (this._actualCount = 0), this._freeIndices = null;\n }\n _onItemRemoved(t) {\n }\n add(t) {\n const e = this._rawAdd(t);\n return e >= this._count && (this._count = e + 1), this._actualCount++, e;\n }\n remove(t) {\n let e = -1;\n if (this._s0 === t) e = 0;\n else if (this._s1 === t) e = 1;\n else if (this._s2 === t) e = 2;\n else if (this._s3 === t) e = 3;\n else {\n const s = this._overflow;\n s !== null && (e = s.indexOf(t), e !== -1 && (e += 4));\n }\n return e !== -1 ? (this._rawWrite(e, null), this._shrinkPhysicalSizeFrom(e), this._actualCount--, e >= 4 && (this._freeIndices === null && (this._freeIndices = []), this._freeIndices.push(e - 4)), !0) : !1;\n }\n has(t) {\n if (this._actualCount === 0) return !1;\n if (this._s0 === t || this._s1 === t || this._s2 === t || this._s3 === t) return !0;\n const e = this._overflow;\n return e !== null ? e.indexOf(t) !== -1 : !1;\n }\n forEach(t) {\n const e = this._actualCount;\n if (e === 0) return;\n if (e === this._count) {\n if (t(this._s0), e > 1 && (t(this._s1), e > 2 && (t(this._s2), e > 3 && (t(this._s3), e > 4)))) {\n const n = this._overflow;\n for (let r = 0, o = n.length; r < o; r++) t(n[r]);\n }\n return;\n }\n let s = 0;\n if (this._s0 !== null && (t(this._s0), ++s >= e) || this._s1 !== null && (t(this._s1), ++s >= e) || this._s2 !== null && (t(this._s2), ++s >= e) || this._s3 !== null && (t(this._s3), ++s >= e))\n return;\n const i = this._overflow;\n if (i !== null) for (let n = 0, r = i.length; n < r; n++) {\n const o = i[n];\n if (o != null && (t(o), ++s >= e))\n return;\n }\n }\n compact() {\n const t = this._actualCount;\n if (t === this._count) return;\n if (t === 0) {\n this.clear();\n return;\n }\n let e = 0;\n const s = this._count;\n for (let i = 0; i < s; i++) {\n const n = this.getAt(i);\n if (n !== null && (i !== e && (this._rawWrite(e, n), this._rawWrite(i, null)), e++, e === t))\n break;\n }\n this._count = t, this._overflow !== null && (e <= 4 ? this._overflow = null : this._overflow.length = e - 4), this._freeIndices = null;\n }\n clear() {\n this._s0 = this._s1 = this._s2 = this._s3 = null, this._count = 0, this._actualCount = 0, this._overflow = null, this._freeIndices = null;\n }\n dispose() {\n this.clear();\n }\n}, ct = class extends lt {\n constructor(...t) {\n super(...t), this._map = null, this._SCAN_THRESHOLD = 32, this.hasComputeds = !1;\n }\n prepareTracking() {\n this.hasComputeds = !1;\n }\n _onItemRemoved(t) {\n t.unsub?.();\n }\n setAt(t, e) {\n const s = this.getAt(t);\n super.setAt(t, e), this._map !== null && (s !== null && this._map.delete(s.node), e !== null && this._map.set(e.node, t));\n }\n claimExisting(t, e) {\n const s = this._count;\n if (s <= e) return !1;\n let i = null;\n if (e < 4 ? e === 0 ? i = this._s0 : e === 1 ? i = this._s1 : e === 2 ? i = this._s2 : i = this._s3 : i = this._overflow[e - 4] ?? null, i && i.node === t && i.unsub)\n return i.version = t.version, !0;\n if (this._map !== null || s - e > this._SCAN_THRESHOLD) return this._claimViaMap(t, e);\n let n = -1, r = null, o = e + 1;\n for (; o < 4 && o < s; o++) {\n const u = o === 1 ? this._s1 : o === 2 ? this._s2 : this._s3;\n if (u && u.node === t && u.unsub) {\n n = o, r = u;\n break;\n }\n }\n if (n === -1 && o < s) {\n const u = this._overflow;\n for (let c = o - 4, I = s - 4; c < I; c++) {\n const E = u[c];\n if (E && E.node === t && E.unsub) {\n n = c + 4, r = E;\n break;\n }\n }\n }\n return n !== -1 ? (r.version = t.version, this._rawWrite(e, r), this._rawWrite(n, i), !0) : !1;\n }\n _claimViaMap(t, e) {\n this._map === null && (this._map = this._initMap());\n const s = this._map, i = s.get(t);\n if (i === void 0 || i < e) return !1;\n const n = this.getAt(i);\n if (n === null || !n.unsub) return !1;\n if (n.version = t.version, i !== e) {\n const r = this.getAt(e);\n this._rawSwap(i, e), s.set(t, e), r?.unsub && s.set(r.node, i);\n }\n return !0;\n }\n _initMap() {\n const t = /* @__PURE__ */ new Map();\n this._s0?.unsub && t.set(this._s0.node, 0), this._s1?.unsub && t.set(this._s1.node, 1), this._s2?.unsub && t.set(this._s2.node, 2), this._s3?.unsub && t.set(this._s3.node, 3);\n const e = this._overflow;\n if (e !== null) for (let s = 0, i = e.length; s < i; s++) {\n const n = e[s];\n n?.unsub && t.set(n.node, s + 4);\n }\n return t;\n }\n insertNew(t, e) {\n let s = null;\n if (t < 4) t === 0 ? (s = this._s0, this._s0 = e) : t === 1 ? (s = this._s1, this._s1 = e) : t === 2 ? (s = this._s2, this._s2 = e) : (s = this._s3, this._s3 = e);\n else {\n this._overflow === null && (this._overflow = []);\n const i = this._overflow;\n s = i[t - 4] ?? null, i[t - 4] = e;\n }\n if (s !== null) {\n const i = this._rawAdd(s);\n i >= this._count && (this._count = i + 1), this._map !== null && s.unsub && this._map.set(s.node, i);\n }\n t >= this._count && (this._count = t + 1), this._actualCount++, this._map !== null && e.unsub && this._map.set(e.node, t);\n }\n add(t) {\n const e = super.add(t);\n return this._map !== null && t.unsub && this._map.set(t.node, e), e;\n }\n remove(t) {\n throw new Error(\"remove() prohibited\");\n }\n compact() {\n }\n truncateFrom(t) {\n super.truncateFrom(t), this._map !== null && (this._map = null);\n }\n disposeAll() {\n this.truncateFrom(0), this.hasComputeds = !1;\n }\n}, L = /* @__PURE__ */ Symbol.for(\"atom-effect/brand\"), p = {\n Atom: 1,\n Writable: 2,\n Computed: 4,\n Effect: 8\n};\nfunction J(t, e) {\n return !t || typeof t != \"object\" && typeof t != \"function\" ? !1 : !!(t[L] & e);\n}\nfunction wt(t) {\n return J(t, p.Atom);\n}\nfunction Rt(t) {\n return J(t, p.Computed);\n}\nfunction Ft(t) {\n return J(t, p.Effect);\n}\nfunction Z(t) {\n return t instanceof Promise ? !0 : t === null || typeof t != \"object\" ? !1 : typeof t.then == \"function\";\n}\nvar q = class {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}, St = class {\n constructor(t = void 0, e = void 0) {\n this.fn = t, this.sub = e;\n }\n notify(t, e) {\n const s = this.fn, i = this.sub;\n if (s === void 0 && i === void 0) return;\n const n = _, r = n.current;\n if (r === null) {\n s !== void 0 && s(t, e), i !== void 0 && i.execute();\n return;\n }\n n.current = null;\n try {\n s !== void 0 && s(t, e), i !== void 0 && i.execute();\n } finally {\n n.current = r;\n }\n }\n}, vt = class {\n constructor() {\n this.current = null;\n }\n run(t, e) {\n if (this.current === t) return e();\n const s = this.current;\n this.current = t;\n try {\n if (!f) return e();\n const i = e();\n return d.warn(Z(i), 'Detected Promise returned within tracking context. Dependencies accessed after \"await\" will NOT be tracked. Consider using synchronous tracking before the async boundary.'), i;\n } finally {\n this.current = s;\n }\n }\n}, _ = new vt();\nfunction X(t) {\n const e = _, s = e.current;\n if (s === null) return t();\n e.current = null;\n try {\n return t();\n } finally {\n e.current = s;\n }\n}\nvar tt = class {\n constructor() {\n this.flags = 0, this.version = 0, this._lastSeenEpoch = U.UNINITIALIZED, this._notifying = 0, this._hotIndex = -1, this.id = gt() & H, this._nextEpoch = void 0, this._slots = null, this._deps = null;\n }\n get isDisposed() {\n return (this.flags & $.DISPOSED) !== 0;\n }\n get isComputed() {\n return (this.flags & $.IS_COMPUTED) !== 0;\n }\n get hasError() {\n return !1;\n }\n subscribe(t) {\n const e = typeof t == \"function\";\n if (!e && (t === null || typeof t.execute != \"function\")) throw A(/* @__PURE__ */ new TypeError(\"Invalid subscriber\"), y, l.ATOM_SUBSCRIBER_MUST_BE_FUNCTION);\n let s = this._slots;\n if (s === null && (s = new lt(), this._slots = s), s.size > 0) {\n let n = !1;\n if (s._s0 !== null && (s._s0.fn === t || s._s0.sub === t) || s._s1 !== null && (s._s1.fn === t || s._s1.sub === t) || s._s2 !== null && (s._s2.fn === t || s._s2.sub === t) || s._s3 !== null && (s._s3.fn === t || s._s3.sub === t)) n = !0;\n else {\n const r = s._overflow;\n if (r !== null) {\n const o = r.length;\n if (e) for (let u = 0; u < o; u++) {\n const c = r[u];\n if (c !== null && c?.fn === t) {\n n = !0;\n break;\n }\n }\n else for (let u = 0; u < o; u++) {\n const c = r[u];\n if (c !== null && c?.sub === t) {\n n = !0;\n break;\n }\n }\n }\n }\n if (n)\n return f && console.warn(`[atom-effect] Duplicate subscription ignored on node ${this.id}`), () => {\n };\n }\n const i = new St(e ? t : void 0, e ? void 0 : t);\n return s.add(i), () => this._unsubscribe(i);\n }\n _unsubscribe(t) {\n const e = this._slots;\n e !== null && (e.remove(t), this._notifying === 0 && e.compact());\n }\n subscriberCount() {\n const t = this._slots;\n return t === null ? 0 : t.size;\n }\n _notifySubscribers(t, e) {\n const s = this._slots;\n if (!(s === null || s.size === 0)) {\n this._notifying++;\n try {\n if (s._s0 !== null) try {\n s._s0.notify(t, e);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (s._s1 !== null) try {\n s._s1.notify(t, e);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (s._s2 !== null) try {\n s._s2.notify(t, e);\n } catch (n) {\n this._logNotifyError(n);\n }\n if (s._s3 !== null) try {\n s._s3.notify(t, e);\n } catch (n) {\n this._logNotifyError(n);\n }\n const i = s._overflow;\n if (i !== null) for (let n = 0, r = i.length; n < r; n++) {\n const o = i[n];\n if (o !== null) try {\n o?.notify(t, e);\n } catch (u) {\n this._logNotifyError(u);\n }\n }\n } finally {\n --this._notifying === 0 && s.compact();\n }\n }\n }\n _logNotifyError(t) {\n console.error(A(t, y, l.ATOM_INDIVIDUAL_SUBSCRIBER_FAILED));\n }\n _isDirty() {\n const t = this._deps;\n if (t === null || t.size === 0) return !1;\n const e = this._hotIndex;\n if (e !== -1) {\n const s = t.getAt(e);\n if (s !== null && s.node.version !== s.version) return !0;\n }\n return this._deepDirtyCheck();\n }\n}, Q = 0;\nfunction et() {\n const t = Q + 1 & H;\n return Q = t === 0 ? 1 : t, Q;\n}\nfunction K(t) {\n const e = t + 1 & H;\n return e === 0 ? 1 : e;\n}\nvar st = 0, B = !1, _t = 0;\nfunction Tt() {\n return _t;\n}\nfunction ot() {\n return B ? (f && console.warn(\"startFlush() called during flush - ignored\"), !1) : (B = !0, _t = et(), st = 0, !0);\n}\nfunction ut() {\n B = !1;\n}\nfunction mt() {\n if (!B) return 0;\n const t = ++st;\n if (t <= g.MAX_EXECUTIONS_PER_FLUSH) return t;\n throw new Error(`[atom-effect] Infinite loop detected: flush execution count exceeded ${g.MAX_EXECUTIONS_PER_FLUSH}`);\n}\nvar Ot = class {\n constructor() {\n this._bufferIndex = 0, this._size = 0, this._epoch = 0, this._batchDepth = 0, this._batchQueueSize = 0, this._maxFlushIterations = g.MAX_FLUSH_ITERATIONS, this._isProcessing = !1, this._isFlushingSync = !1, this._buffer0 = [], this._buffer1 = [], this._batchQueue = [], this.onOverflow = null, this._boundRunLoop = this._runLoop.bind(this);\n }\n get queueSize() {\n return this._size + this._batchQueueSize;\n }\n get isBatching() {\n return this._batchDepth > 0;\n }\n schedule(t) {\n if (f && typeof t != \"function\" && (!t || typeof t.execute != \"function\"))\n throw new x(l.SCHEDULER_CALLBACK_MUST_BE_FUNCTION);\n const e = this._epoch;\n if (t._nextEpoch === e) return;\n if (t._nextEpoch = e, this._batchDepth > 0 || this._isFlushingSync) {\n this._batchQueue[this._batchQueueSize++] = t;\n return;\n }\n const s = this._bufferIndex === 0 ? this._buffer0 : this._buffer1;\n s[this._size++] = t, this._isProcessing || this._flush();\n }\n _flush() {\n this._isProcessing || this._size === 0 && this._batchQueueSize === 0 || (this._isProcessing = !0, queueMicrotask(this._boundRunLoop));\n }\n _runLoop() {\n try {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = ot();\n this._drainQueue(), t && ut();\n } finally {\n this._isProcessing = !1;\n }\n }\n _flushSync() {\n if (this._size === 0 && this._batchQueueSize === 0) return;\n const t = this._isFlushingSync;\n this._isFlushingSync = !0;\n const e = ot();\n try {\n this._mergeBatchQueue(), this._drainQueue();\n } finally {\n this._isFlushingSync = t, e && ut();\n }\n }\n _mergeBatchQueue() {\n const t = this._batchQueueSize;\n if (t === 0) return;\n const e = ++this._epoch | 0, s = this._batchQueue, i = this._bufferIndex === 0 ? this._buffer0 : this._buffer1;\n let n = this._size;\n for (let r = 0; r < t; r++) {\n const o = s[r];\n o._nextEpoch !== e && (o._nextEpoch = e, i[n++] = o), s[r] = void 0;\n }\n this._size = n, this._batchQueueSize = 0, s.length > g.BATCH_QUEUE_SHRINK_THRESHOLD && (s.length = 0);\n }\n _drainQueue() {\n let t = 0;\n for (; this._size > 0 || this._batchQueueSize > 0; ) {\n if (++t > this._maxFlushIterations) {\n this._handleFlushOverflow();\n return;\n }\n this._batchQueueSize > 0 && this._mergeBatchQueue(), this._size > 0 && this._processQueue();\n }\n }\n _processQueue() {\n const t = this._bufferIndex, e = t === 0 ? this._buffer0 : this._buffer1, s = this._size;\n this._bufferIndex = t ^ 1, this._size = 0, this._epoch = this._epoch + 1 | 0;\n for (let i = 0; i < s; i++) {\n const n = e[i];\n e[i] = void 0;\n try {\n typeof n == \"function\" ? n() : n.execute();\n } catch (r) {\n console.error(new x(\"Error occurred during scheduler execution\", r));\n }\n }\n }\n _handleFlushOverflow() {\n const t = this._size + this._batchQueueSize;\n console.error(new x(l.SCHEDULER_FLUSH_OVERFLOW(this._maxFlushIterations, t))), this._size = 0, this._buffer0.length = 0, this._buffer1.length = 0, this._batchQueueSize = 0, this._batchQueue.length = 0;\n const e = this.onOverflow;\n if (e) try {\n e(t);\n } catch {\n }\n }\n startBatch() {\n this._batchDepth++;\n }\n endBatch() {\n if (this._batchDepth === 0) {\n f && console.warn(l.SCHEDULER_END_BATCH_WITHOUT_START);\n return;\n }\n --this._batchDepth === 0 && (this._isFlushingSync || this._flushSync());\n }\n setMaxFlushIterations(t) {\n if (t < g.MIN_FLUSH_ITERATIONS) throw new x(`Max iterations must be at least ${g.MIN_FLUSH_ITERATIONS}`);\n this._maxFlushIterations = t;\n }\n}, T = new Ot();\nfunction Ut(t) {\n if (f && typeof t != \"function\") throw new TypeError(l.BATCH_CALLBACK_MUST_BE_FUNCTION);\n T.startBatch();\n try {\n return t();\n } finally {\n T.endBatch();\n }\n}\nvar R = null;\nfunction Lt(t) {\n return t ? new Promise((e, s) => {\n T.schedule(() => {\n try {\n t(), e();\n } catch (i) {\n s(i);\n }\n });\n }) : R || (R = new Promise((e) => {\n T.schedule(() => {\n R = null, e();\n });\n }), R);\n}\nvar Nt = class extends tt {\n constructor(t, e) {\n super(), this[L] = p.Atom | p.Writable, this._value = t, this._equal = e.equal ?? Object.is, e.sync && (this.flags |= C.SYNC), f && d.attachDebugInfo(this, \"atom\", this.id, e.name);\n }\n get isNotificationScheduled() {\n return (this.flags & C.NOTIFICATION_SCHEDULED) !== 0;\n }\n get isSync() {\n return (this.flags & C.SYNC) !== 0;\n }\n get value() {\n const t = _.current;\n return t?.addDependency(this), this._value;\n }\n set value(t) {\n const e = this._value;\n if (this._equal(e, t)) return;\n this._value = t, this.version = K(this.version), f && d.trackUpdate(this.id, d.getDebugName(this));\n const s = this.flags, i = C.NOTIFICATION_SCHEDULED;\n if ((s & i) !== 0) return;\n const n = this._slots;\n if (n === null || n.size === 0) return;\n this._pendingOldValue = e;\n const r = s | i;\n if (this.flags = r, (r & C.SYNC) !== 0 && !T.isBatching) {\n this._notifying === 0 && this._flushNotifications();\n return;\n }\n T.schedule(this);\n }\n execute() {\n this._flushNotifications();\n }\n _flushNotifications() {\n const t = C.NOTIFICATION_SCHEDULED, e = C.DISPOSED, s = C.SYNC, i = t | e;\n let n = this.flags;\n for (; (n & i) === t; ) {\n const r = this._pendingOldValue;\n this._pendingOldValue = void 0, this.flags = n &= ~t;\n const o = this._value;\n if (this._equal(o, r) || this._notifySubscribers(o, r), n = this.flags, (n & s) === 0 || T.isBatching) break;\n }\n }\n peek() {\n return this._value;\n }\n dispose() {\n const t = this.flags, e = C.DISPOSED;\n (t & e) === 0 && (this.flags = t | e, this._slots?.clear(), this._value = void 0, this._pendingOldValue = void 0, this._equal = Object.is);\n }\n _deepDirtyCheck() {\n return !1;\n }\n};\nfunction Pt(t, e = {}) {\n return new Nt(t, e);\n}\nvar { IDLE: v, DIRTY: a, PENDING: b, RESOLVED: D, REJECTED: m, HAS_ERROR: V, RECOMPUTING: O, DISPOSED: z, IS_COMPUTED: F, FORCE_COMPUTE: Y } = $, bt = class extends tt {\n constructor(t, e = {}) {\n if (typeof t != \"function\") throw new w(l.COMPUTED_MUST_BE_FUNCTION);\n if (super(), this[L] = p.Atom | p.Computed, this._promiseId = 0, this._trackEpoch = U.UNINITIALIZED, this._trackCount = 0, this._error = null, this._deps = new ct(), this._value = void 0, this.flags = F | a | v, this._equal = e.equal ?? Object.is, this._computation = t, this._defaultValue = \"defaultValue\" in e ? e.defaultValue : G, this._onError = e.onError ?? null, d.attachDebugInfo(this, \"computed\", this.id, e.name), e.lazy === !1) try {\n this._recompute();\n } catch {\n }\n }\n get isDirty() {\n return (this.flags & a) !== 0;\n }\n get isRejected() {\n return (this.flags & m) !== 0;\n }\n get isRecomputing() {\n return (this.flags & O) !== 0;\n }\n get value() {\n const t = _.current;\n t !== null && t.addDependency(this);\n const e = this.flags;\n if ((e & (D | a | v | z | O)) === D) return this._value;\n if ((e & z) !== 0) throw new w(l.COMPUTED_DISPOSED);\n if ((e & O) !== 0) {\n const n = this._defaultValue;\n if (n !== G) return n;\n throw new w(l.COMPUTED_CIRCULAR_DEPENDENCY);\n }\n if ((e & (a | v)) !== 0) {\n const n = this._deps;\n if ((e & (v | Y)) !== 0 || n.size === 0 || this._isDirty() ? this._recompute() : this.flags &= ~a, (this.flags & D) !== 0) return this._value;\n }\n const s = this._defaultValue, i = s !== G;\n if ((this.flags & b) !== 0) {\n if (i) return s;\n throw new w(l.COMPUTED_ASYNC_PENDING_NO_DEFAULT);\n }\n if ((this.flags & m) !== 0) {\n if (i) return s;\n throw this._error;\n }\n return this._value;\n }\n peek() {\n return this._value;\n }\n get state() {\n const t = _.current;\n t !== null && t.addDependency(this);\n const e = this.flags;\n return (e & D) !== 0 ? P.RESOLVED : (e & b) !== 0 ? P.PENDING : (e & m) !== 0 ? P.REJECTED : P.IDLE;\n }\n get hasError() {\n const t = _.current;\n if (t !== null && t.addDependency(this), (this.flags & (m | V)) !== 0) return !0;\n const e = this._deps;\n return e.hasComputeds ? X(() => {\n const s = e.size;\n for (let i = 0; i < s; i++) if (e.getAt(i)?.node.hasError) return !0;\n return !1;\n }) : !1;\n }\n get isValid() {\n return !this.hasError;\n }\n get errors() {\n const t = _.current;\n t !== null && t.addDependency(this);\n const e = this._error, s = this._deps;\n if (!s.hasComputeds)\n return e === null ? it : Object.freeze([e]);\n const i = [];\n return e !== null && i.push(e), X(() => {\n const n = s.size;\n for (let r = 0; r < n; r++) {\n const o = s.getAt(r)?.node;\n o !== void 0 && (o.flags & F) !== 0 && this._accumulateErrors(o, i);\n }\n }), i.length === 0 ? it : Object.freeze(i);\n }\n _accumulateErrors(t, e) {\n const s = t._error;\n s !== null && !e.includes(s) && e.push(s);\n const i = t._deps;\n if (!i.hasComputeds) return;\n const n = i.size;\n for (let r = 0; r < n; r++) {\n const o = i.getAt(r)?.node;\n o !== void 0 && (o.flags & F) !== 0 && this._accumulateErrors(o, e);\n }\n }\n get lastError() {\n const t = _.current;\n return t !== null && t.addDependency(this), this._error;\n }\n get isPending() {\n const t = _.current;\n return t !== null && t.addDependency(this), (this.flags & b) !== 0;\n }\n get isResolved() {\n const t = _.current;\n return t !== null && t.addDependency(this), (this.flags & D) !== 0;\n }\n invalidate() {\n this.flags |= Y, this._markDirty();\n }\n dispose() {\n (this.flags & z) === 0 && (this._deps.disposeAll(), this._slots !== null && this._slots.clear(), this.flags = z | a | v, this._error = null, this._value = void 0, this._hotIndex = -1);\n }\n addDependency(t) {\n const e = this._trackEpoch;\n if (t._lastSeenEpoch === e) return;\n t._lastSeenEpoch = e;\n const s = this._trackCount++, i = this._deps;\n let n = null;\n if (s < 4) s === 0 ? n = i._s0 : s === 1 ? n = i._s1 : s === 2 ? n = i._s2 : n = i._s3;\n else {\n const r = i._overflow;\n r !== null && (n = r[s - 4] ?? null);\n }\n if (n !== null && n.node === t) n.version = t.version;\n else if (!i.claimExisting(t, s)) {\n const r = new q(t, t.version, t.subscribe(this));\n i.insertNew(s, r);\n }\n (t.flags & F) !== 0 && (i.hasComputeds = !0);\n }\n _recompute() {\n if ((this.flags & O) !== 0) return;\n this.flags = (this.flags | O) & ~Y, this._trackEpoch = et(), this._trackCount = 0, this._deps.prepareTracking(), this._hotIndex = -1;\n let t = !1;\n try {\n const e = _.run(this, this._computation);\n this._deps.truncateFrom(this._trackCount), t = !0, Z(e) ? this._handleAsyncComputation(e) : this._finalizeResolution(e);\n } catch (e) {\n if (!t) try {\n this._deps.truncateFrom(this._trackCount);\n } catch (s) {\n f && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", s);\n }\n this._handleError(e, l.COMPUTED_COMPUTATION_FAILED, !0);\n } finally {\n this._trackEpoch = U.UNINITIALIZED, this._trackCount = 0, this.flags &= ~O;\n }\n }\n _handleAsyncComputation(t) {\n this.flags = (this.flags | b) & ~(v | a | D | m), this._notifySubscribers(void 0, void 0), this._promiseId = (this._promiseId + 1) % Et.MAX_PROMISE_ID;\n const e = this._promiseId;\n t.then((s) => {\n if (e === this._promiseId) {\n if (this._isDirty()) return this._markDirty();\n this._finalizeResolution(s), this._notifySubscribers(s, void 0);\n }\n }, (s) => e === this._promiseId && this._handleError(s, l.COMPUTED_ASYNC_COMPUTATION_FAILED));\n }\n _handleError(t, e, s = !1) {\n const i = A(t, w, e);\n if ((!this.isRejected || this._error !== i) && (this.version = K(this.version)), this._error = i, this.flags = this.flags & ~(v | a | b | D) | m | V, this._onError) try {\n this._onError(i);\n } catch (n) {\n console.error(l.CALLBACK_ERROR_IN_ERROR_HANDLER, n);\n }\n if (this._notifySubscribers(void 0, void 0), s) throw i;\n }\n _finalizeResolution(t) {\n const e = this.flags;\n ((e & D) === 0 || !this._equal(this._value, t)) && (this.version = K(this.version)), this._value = t, this._error = null, this.flags = (e | D) & ~(v | a | b | m | V);\n }\n execute() {\n this._markDirty();\n }\n _markDirty() {\n const t = this.flags;\n (t & (O | a)) === 0 && (this.flags = t | a, d.trackUpdate(this.id, d.getDebugName(this)), this._notifySubscribers(void 0, void 0));\n }\n _deepDirtyCheck() {\n const t = this._deps, e = t.size, s = this._hotIndex;\n return X(() => {\n if (s !== -1 && s < e) {\n const i = t.getAt(s);\n if (i !== null && this._checkLinkDirty(i)) return !0;\n }\n for (let i = 0; i < e; i++) {\n if (i === s) continue;\n const n = t.getAt(i);\n if (n !== null && this._checkLinkDirty(n))\n return this._hotIndex = i, !0;\n }\n return this._hotIndex = -1, !1;\n });\n }\n _checkLinkDirty(t) {\n const e = t.node;\n if ((e.flags & F) !== 0) try {\n e.value;\n } catch {\n f && console.warn(`[atom-effect] Dependency #${e.id} threw during check`);\n }\n return e.version !== t.version;\n }\n};\nfunction xt(t, e = {}) {\n return new bt(t, e);\n}\nvar At = class extends tt {\n constructor(t, e = {}) {\n super(), this[L] = p.Effect, this._currentEpoch = U.UNINITIALIZED, this._lastFlushEpoch = U.UNINITIALIZED, this._executionsInEpoch = 0, this._executionCount = 0, this._windowStart = 0, this._windowCount = 0, this._execId = 0, this._trackCount = 0, this._cleanup = null, this._deps = new ct(), this._fn = t, this._onError = e.onError ?? null, this._sync = e.sync ?? !1, this._maxExecutions = e.maxExecutionsPerSecond ?? g.MAX_EXECUTIONS_PER_SECOND, this._maxExecutionsPerFlush = e.maxExecutionsPerFlush ?? g.MAX_EXECUTIONS_PER_EFFECT, this._sync ? this._notifyCallback = () => this.execute() : this._notifyCallback = () => T.schedule(this), d.attachDebugInfo(this, \"effect\", this.id, e.name);\n }\n run() {\n if (this.isDisposed) throw new N(l.EFFECT_DISPOSED);\n this.execute(!0);\n }\n dispose() {\n this.isDisposed || (this.flags |= S.DISPOSED, this._execCleanup(), this._deps?.disposeAll());\n }\n addDependency(t) {\n if ((this.flags & S.EXECUTING) === 0 || t._lastSeenEpoch === this._currentEpoch) return;\n t._lastSeenEpoch = this._currentEpoch;\n const e = this._trackCount++, s = this._deps, i = t.version;\n let n = null;\n if (e < 4) e === 0 ? n = s._s0 : e === 1 ? n = s._s1 : e === 2 ? n = s._s2 : n = s._s3;\n else {\n const r = s._overflow;\n r !== null && (n = r[e - 4] ?? null);\n }\n n !== null && n.node === t ? n.version = i : s.claimExisting(t, e) || this._insertNewDependency(t, e, i), t.isComputed && !s.hasComputeds && (s.hasComputeds = !0);\n }\n _insertNewDependency(t, e, s) {\n let i;\n try {\n i = new q(t, s, t.subscribe(this._notifyCallback));\n } catch (n) {\n const r = A(n, N, l.EFFECT_EXECUTION_FAILED);\n if (console.error(r), this._onError) try {\n this._onError(r);\n } catch {\n }\n i = new q(t, s, void 0);\n }\n this._deps.insertNew(e, i);\n }\n execute(t = !1) {\n const e = this.flags;\n if ((e & (S.DISPOSED | S.EXECUTING)) !== 0) return;\n const s = this._deps;\n if (!t && s.physicalSize > 0 && !this._isDirty()) return;\n this._checkInfiniteLoops(), d.trackUpdate(this.id, d.getDebugName(this)), this.flags = e | S.EXECUTING, this._execCleanup(), this._currentEpoch = et(), this._trackCount = 0, s.prepareTracking(), this._hotIndex = -1;\n let i = !1;\n try {\n const n = _.run(this, this._fn);\n s.truncateFrom(this._trackCount), i = !0, typeof n == \"function\" ? this._cleanup = n : Z(n) ? this._handleAsyncResult(n) : this._cleanup = null;\n } catch (n) {\n if (!i) try {\n s.truncateFrom(this._trackCount);\n } catch (r) {\n f && console.warn(\"[atom-effect] _commitDeps failed during error recovery:\", r);\n }\n this._handleExecutionError(n), this._cleanup = null;\n } finally {\n this.flags &= ~S.EXECUTING;\n }\n }\n _handleAsyncResult(t) {\n const e = ++this._execId;\n t.then((s) => {\n if (e !== this._execId || (this.flags & S.DISPOSED) !== 0) {\n if (typeof s == \"function\") try {\n s();\n } catch (i) {\n this._handleExecutionError(i, l.EFFECT_CLEANUP_FAILED);\n }\n return;\n }\n typeof s == \"function\" && (this._cleanup = s);\n }, (s) => e === this._execId && this._handleExecutionError(s));\n }\n _isDirty() {\n const t = this._deps, e = t.size;\n if (e === 0) return !1;\n const s = this._hotIndex;\n if (s !== -1 && s < e) {\n const i = t.getAt(s);\n if (i !== null) {\n const n = i.node;\n if (!n.isComputed && n.version !== i.version) return !0;\n }\n }\n return this._deepDirtyCheck();\n }\n _deepDirtyCheck() {\n const t = this._deps, e = t.size, s = this._hotIndex, i = _.current;\n _.current = null;\n try {\n for (let n = 0; n < e; n++) {\n if (n === s) continue;\n const r = t.getAt(n);\n if (r === null) continue;\n const o = r.node;\n if (o.isComputed) try {\n o.value;\n } catch {\n f && console.warn(`[atom-effect] Dependency #${o.id} error in check`);\n }\n if (o.version !== r.version)\n return this._hotIndex = n, !0;\n }\n return this._hotIndex = -1, !1;\n } finally {\n _.current = i;\n }\n }\n _execCleanup() {\n const t = this._cleanup;\n if (t != null) {\n this._cleanup = null;\n try {\n t();\n } catch (e) {\n this._handleExecutionError(e, l.EFFECT_CLEANUP_FAILED);\n }\n }\n }\n _checkInfiniteLoops() {\n const t = Tt();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), mt() > g.MAX_EXECUTIONS_PER_FLUSH && this._throwInfiniteLoopError(\"global\"), this._executionCount++, f && this._checkFrequencyLimit();\n }\n _checkFrequencyLimit() {\n if (!Number.isFinite(this._maxExecutions)) return;\n const t = Date.now();\n if (t - this._windowStart >= W.EFFECT_FREQUENCY_WINDOW) {\n this._windowStart = t, this._windowCount = 1;\n return;\n }\n if (++this._windowCount > this._maxExecutions) {\n const e = new N(l.EFFECT_FREQUENCY_LIMIT_EXCEEDED);\n throw this.dispose(), this._handleExecutionError(e), e;\n }\n }\n get executionCount() {\n return this._executionCount;\n }\n get isExecuting() {\n return (this.flags & S.EXECUTING) !== 0;\n }\n _throwInfiniteLoopError(t) {\n const e = new N(`Infinite loop detected (${t}): effect executed ${this._executionsInEpoch} times in current flush. Total executions in flush: ${st}`);\n throw this.dispose(), console.error(e), e;\n }\n _handleExecutionError(t, e = l.EFFECT_EXECUTION_FAILED) {\n const s = A(t, N, e);\n if (console.error(s), this._onError) try {\n this._onError(s);\n } catch (i) {\n console.error(A(i, N, l.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Mt(t, e = {}) {\n if (typeof t != \"function\") throw new N(l.EFFECT_MUST_BE_FUNCTION);\n const s = new At(t, e);\n return s.execute(), s;\n}\nfunction ft(t, e, s, i) {\n if (s === e.length) return i;\n const n = e[s];\n if (n === \"__proto__\" || n === \"constructor\" || n === \"prototype\") return t;\n const r = t != null && typeof t == \"object\" ? t : {}, o = r[n], u = ft(o, e, s + 1, i);\n if (Object.is(o, u)) return t;\n if (Array.isArray(r)) {\n const I = r.slice(), E = +n;\n return n.trim() !== \"\" && E >= 0 && E % 1 === 0 ? I[E] = u : I[n] = u, I;\n }\n const c = { ...r };\n return c[n] = u, c;\n}\nfunction k(t, e) {\n let s = t;\n const i = e.length;\n for (let n = 0; n < i; n++) {\n if (s == null) return;\n const r = e[n];\n if (r === \"__proto__\" || r === \"constructor\" || r === \"prototype\") return;\n s = s[r];\n }\n return s;\n}\nfunction at(t, e) {\n const s = e.includes(\".\") ? e.split(\".\") : [e], i = /* @__PURE__ */ new Set();\n return {\n get value() {\n return k(t.value, s);\n },\n set value(r) {\n const o = t.peek(), u = ft(o, s, 0, r);\n u !== o && (t.value = u);\n },\n peek: () => k(t.peek(), s),\n subscribe(r) {\n let o = k(t.peek(), s);\n const u = t.subscribe((c) => {\n const I = k(c, s);\n if (!Object.is(I, o)) {\n const E = o;\n o = I, r(I, E);\n }\n });\n return i.add(u), () => {\n u(), i.delete(u);\n };\n },\n subscriberCount: () => i.size,\n dispose: () => {\n i.forEach((r) => r()), i.clear();\n },\n [L]: p.Atom | p.Writable\n };\n}\nvar zt = (t, e) => at(t, e), kt = (t) => (e) => at(t, e);\nexport {\n P as AsyncState,\n y as AtomError,\n w as ComputedError,\n W as DEBUG_CONFIG,\n N as EffectError,\n g as SCHEDULER_CONFIG,\n x as SchedulerError,\n Lt as aeNextTick,\n Pt as atom,\n at as atomLens,\n Ut as batch,\n zt as composeLens,\n xt as computed,\n Mt as effect,\n k as getPathValue,\n T as globalScheduler,\n wt as isAtom,\n Rt as isComputed,\n Ft as isEffect,\n kt as lensFor,\n d as runtimeDebug,\n ft as setDeepValue,\n X as untracked\n};\n\n//# sourceMappingURL=index.mjs.map","/**\n * Subsystem Definitions: Grouping prefixes, defaults, and error messages\n * into cohesive logical units according to Rob Pike's Rule 5.\n */\n\nexport const SYSTEM_CORE = {\n ERRORS: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n\nexport const SYSTEM_ROUTE = {\n PREFIX: '[atom-route]',\n DEFAULTS: Object.freeze({\n mode: 'hash',\n basePath: '',\n autoBindLinks: false,\n activeClass: 'active',\n } as const),\n ERRORS: {\n NOT_FOUND: (n: string) => `Route \"${n}\" not found`,\n TEMPLATE_NOT_FOUND: (s: string) => `Template \"${s}\" not found`,\n TARGET_NOT_FOUND: (s: string) => `Target \"${s}\" not found`,\n MALFORMED_URI: (r: string) => `Malformed URI: ${r}`,\n },\n} as const;\n\nexport const SYSTEM_BINDING = {\n PREFIX: '[atom-binding]',\n INPUT_DEFAULTS: Object.freeze({ EVENT: 'input', DEBOUNCE: 0 } as const),\n VALID_INPUT_TAGS: ['input', 'select', 'textarea'] as const,\n ERRORS: {\n INVALID_INPUT_ELEMENT: (t: string) => `Invalid element <${t}> for val.`,\n MISSING_SOURCE: (m: string) => `[${m}] source required.`,\n MISSING_CONDITION: (m: string) => `[${m}] condition required.`,\n UPDATER_ERROR: (d: string, s?: boolean) => `Updater failed: \"${d}\"${s ? ' (static)' : ''}`,\n CLEANUP_ERROR: (i?: string) => `Binding cleanup error${i ? `: ${i}` : ''}`,\n PARSE_ERROR: (d?: string) => `Parse error${d ? `: ${d}` : ''}`,\n },\n} as const;\n\nexport const SYSTEM_SECURITY = {\n DANGEROUS_PROPS: [\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n ] as const,\n URL_PROPS: [\n 'src',\n 'href',\n 'action',\n 'formaction',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'xlink:href',\n ] as const,\n DANGEROUS_PROTOCOL_PATTERN: '(?:javascript|vbscript)',\n ERRORS: {\n UNSAFE_CONTENT: () => 'Unsafe content neutralized.',\n BLOCKED_CSS_VALUE: (p: string) => `Blocked CSS: \"${p}\".`,\n BLOCKED_EVENT_HANDLER: (n: string) => `Blocked handler: \"${n}\".`,\n BLOCKED_PROTOCOL: (n: string) => `Blocked protocol: \"${n}\".`,\n BLOCKED_PROP: (n: string) => `Blocked prop: \"${n}\".`,\n },\n} as const;\n\nexport const SYSTEM_LIST = {\n PREFIX: '[atom-list]',\n ERRORS: {\n DUPLICATE_KEY: (k: string | number, i: number) => `Duplicate key \"${k}\" at index ${i}.`,\n },\n} as const;\n\nexport const SYSTEM_MOUNT = {\n PREFIX: '[atom-mount]',\n ERRORS: {\n ERROR: (n?: string) => `Mount error${n ? ` in <${n}>` : ''}`,\n CLEANUP_ERROR: (n?: string) => `Cleanup error${n ? ` in <${n}>` : ''}`,\n },\n} as const;\n\nexport const SYSTEM_DEBUG = {\n DEFAULTS: Object.freeze({ HIGHLIGHT_DURATION_MS: 500 } as const),\n} as const;\n\n/**\n * Legacy Exports: Proxies for backward compatibility.\n * These ensure that existing code continues to work while the project\n * transitions to the subsystem-based organization.\n */\n\nexport const LOG_PREFIXES = {\n ROUTE: SYSTEM_ROUTE.PREFIX,\n BINDING: SYSTEM_BINDING.PREFIX,\n LIST: SYSTEM_LIST.PREFIX,\n MOUNT: SYSTEM_MOUNT.PREFIX,\n} as const;\n\nexport const ERROR_MESSAGES = {\n ROUTE: SYSTEM_ROUTE.ERRORS,\n SECURITY: SYSTEM_SECURITY.ERRORS,\n BINDING: SYSTEM_BINDING.ERRORS,\n LIST: SYSTEM_LIST.ERRORS,\n MOUNT: SYSTEM_MOUNT.ERRORS,\n CORE: SYSTEM_CORE.ERRORS,\n} as const;\n\nexport const ROUTE_DEFAULTS = SYSTEM_ROUTE.DEFAULTS;\nexport const INPUT_DEFAULTS = SYSTEM_BINDING.INPUT_DEFAULTS;\nexport const DEBUG_DEFAULTS = SYSTEM_DEBUG.DEFAULTS;\n\n// Simplified collections (formerly Sets, now Arrays)\nexport const VALID_INPUT_TAGS = SYSTEM_BINDING.VALID_INPUT_TAGS;\nexport const URL_PROPS = SYSTEM_SECURITY.URL_PROPS;\nexport const DANGEROUS_PROPS = SYSTEM_SECURITY.DANGEROUS_PROPS;\nexport const DANGEROUS_PROTOCOL_PATTERN = SYSTEM_SECURITY.DANGEROUS_PROTOCOL_PATTERN;\n","import type { RouteDefinition } from '@/types';\n\n/** Standard type guard for thenable objects (Promises). */\nexport const isPromise = <T>(v: unknown): v is Promise<T> =>\n v !== null &&\n (typeof v === 'object' || typeof v === 'function') &&\n typeof (v as PromiseLike<T>).then === 'function';\n\n/**\n * Generates a human-readable CSS selector for an Element.\n *\n * Logic: Prioritizes tag, #id, and .classes.\n * Caution: Includes specific handling for SVG elements where `className`\n * is an SVGAnimatedString rather than a standard string.\n */\nexport function getSelector(el: Element): string {\n const { localName: tag, id, className } = el;\n let res = tag;\n if (id) res += `#${id}`;\n\n const classStr =\n typeof className === 'string'\n ? className\n : (className as unknown as SVGAnimatedString)?.baseVal;\n\n if (classStr) {\n const trimmed = classStr.trim().replace(/\\s+/g, '.');\n if (trimmed) res += `.${trimmed}`;\n }\n\n const type = (el as { type?: string }).type;\n if (type && type !== 'text') res += `.${type}`;\n\n return res;\n}\n\n/**\n * Compatibility Shim: Provides a safe alternative to Object.hasOwn (ES2022).\n *\n * Reason: The project targets ES2021, but modern linting rules often\n * mandate the use of `hasOwn`. This shim satisfies static analysis\n * without requiring an ES2022 runtime.\n */\nexport const hasOwn = Object.prototype.hasOwnProperty;\n\n/** Route Type Guard: Identifies routes defined via <template> selectors. */\nexport const isTemplateRoute = (r: RouteDefinition): boolean =>\n r !== null && typeof r === 'object' && typeof r.template === 'string';\n\n/** Route Type Guard: Identifies routes defined via functional renderers. */\nexport const isRenderRoute = (r: RouteDefinition): boolean =>\n r !== null && typeof r === 'object' && typeof r.render === 'function';\n\n/**\n * Performs a shallow comparison between two objects.\n *\n * Features:\n * - Uses `Object.is` for correct NaN and signed-zero comparison.\n * - Optimized for early exit on identity or length mismatch.\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 objA = a as Record<string, unknown>;\n const objB = b as Record<string, unknown>;\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) return false;\n\n for (const key of keysA) {\n if (!hasOwn.call(objB, key) || !Object.is(objA[key], objB[key])) return false;\n }\n return true;\n}\n","import { DEBUG_DEFAULTS } from '@/constants';\nimport { getSelector } from '@/utils';\n\nconst HIGHLIGHT_CLASS = 'atom-debug-highlight';\nconst ATTR_MARKER = 'data-atom-debug';\nconst IS_BROWSER = typeof window !== 'undefined';\n\n/**\n * Memory Safety: Uses WeakMaps to associate temporal debug state with DOM\n * elements without preventing garbage collection of the elements themselves.\n */\nconst timers = new WeakMap<Element, ReturnType<typeof setTimeout>>();\nconst rafs = new WeakMap<Element, number>();\n\nlet styleInjected = false;\n\n/**\n * Minimal Footprint: Injects utility styles once per session.\n * Transition duration is linked to DEBUG_DEFAULTS for configuration consistency.\n */\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n const style = document.createElement('style');\n style.setAttribute(ATTR_MARKER, '');\n style.textContent = `\n [${ATTR_MARKER}] { transition: outline ${DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS / 1000}s ease-out; }\n .${HIGHLIGHT_CLASS} { outline: 2px solid rgba(255, 68, 68, 0.8); outline-offset: 1px; }\n `.replace(/\\s+/g, ' ');\n document.head.appendChild(style);\n styleInjected = true;\n}\n\n/**\n * Feature Detection: Determines the initial debug state.\n * Priority: 1. Manual global flag -> 2. NODE_ENV check -> 3. Default off.\n */\nfunction resolveInitialState(): boolean {\n const g = globalThis as typeof globalThis & {\n __ATOM_DEBUG__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n if (g.__ATOM_DEBUG__ !== undefined) return !!g.__ATOM_DEBUG__;\n return g.process?.env?.NODE_ENV !== 'production' && g.process?.env?.NODE_ENV !== undefined;\n}\n\nconst IS_DEV = resolveInitialState();\n\n/**\n * Global diagnostic logger.\n * Toggle `debug.enabled` at runtime to activate/deactivate instrumentation.\n */\nexport const debug = {\n enabled: IS_DEV,\n\n warn: (prefix: string, message: string, ...rest: unknown[]) =>\n console.warn(`${prefix} ${message}`, ...rest),\n\n error: (prefix: string, message: string, cause: unknown) =>\n console.error(`${prefix} ${message}`, cause),\n\n /**\n * Tracks a reactive DOM mutation.\n * Logic: Logs the specific property update and triggers a visual \"flash\"\n * to help developers locate the change on potentially complex pages.\n */\n domUpdated(prefix: string, target: Element | JQuery, type: string, value: unknown) {\n if (!this.enabled) return;\n const el = 'jquery' in target ? target[0] : target;\n // Safety: Only instrument elements that are currently live in the document.\n if (el && el.nodeType === 1 && el.isConnected) {\n console.log(`${prefix} DOM updated: ${getSelector(el as Element)}.${type} =`, value);\n triggerVisualHighlight(el as Element);\n }\n },\n};\n\n/**\n * Orchestrates a temporary visual highlight on the targeted element.\n *\n * Logic:\n * 1. Debouncing: Cancels pending animations/timers for the same element.\n * 2. RAF: Ensures class addition occurs in the next available paint cycle.\n * 3. GC: Automatically cleans up WeakMap entries after the timeout.\n */\nfunction triggerVisualHighlight(el: Element): void {\n const g = globalThis;\n if (!IS_BROWSER || typeof g.requestAnimationFrame !== 'function') return;\n injectStyle();\n\n const existingRaf = rafs.get(el);\n const existingTimer = timers.get(el);\n if (existingRaf !== undefined) g.cancelAnimationFrame(existingRaf);\n if (existingTimer !== undefined) clearTimeout(existingTimer);\n\n if (!el.hasAttribute(ATTR_MARKER)) el.setAttribute(ATTR_MARKER, '');\n\n rafs.set(\n el,\n g.requestAnimationFrame(() => {\n rafs.delete(el);\n if (!el.isConnected) return;\n el.classList.add(HIGHLIGHT_CLASS);\n timers.set(\n el,\n setTimeout(() => {\n el.classList.remove(HIGHLIGHT_CLASS);\n timers.delete(el);\n }, DEBUG_DEFAULTS.HIGHLIGHT_DURATION_MS)\n );\n })\n );\n}\n","import {\n aeNextTick,\n atom,\n atomLens,\n batch,\n composeLens,\n computed,\n effect,\n isAtom,\n isComputed,\n lensFor,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { debug } from '@/utils/debug';\n\n/**\n * Returns a promise that resolves after the next reactive tick.\n * Useful for waiting until all pending effects have updated the DOM.\n */\nexport const nextTick = (): Promise<void> => aeNextTick();\n\n/**\n * Integrates Atom-Effect reactive primitives into the global jQuery object.\n *\n * Why: This allows a unified development experience, where state management\n * and DOM manipulation can both be accessed through the standard '$' object.\n *\n * @example\n * // Reactive state management via jQuery\n * const count = $.atom(0);\n * $.effect(() => {\n * $('#counter').text(count.value);\n * });\n *\n * count.value++;\n */\n$.extend({\n atom,\n computed,\n effect,\n batch,\n untracked,\n isAtom,\n isComputed,\n nextTick,\n atomLens,\n composeLens,\n lensFor,\n\n debug,\n});\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\n\nlet autoCleanupScheduled = false;\n\n/**\n * Optimization: Elements with active bindings are marked with this class.\n * This allows cleanupDescendants to perform a high-performance scoped query\n * (querySelectorAll) instead of a slow, full-tree recursive walk.\n */\nconst AES_BOUND = '_aes-bound';\n\nexport interface BindingRecord {\n cleanups?: Array<() => void>;\n componentCleanup?: (() => void) | undefined;\n}\n\n/**\n * Manages the lifecycle of reactive bindings and component effects.\n *\n * Safety Rationale:\n * - Uses WeakMap for records to avoid holding strong references that prevent GC.\n * - Uses WeakSet for node flags (kept/ignored) to ensure the registry doesn't leak\n * memory even for nodes that were \"lost\" without a cleanup call.\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n\n private preservedNodes = new WeakSet<Node>();\n\n private ignoredNodes = new WeakSet<Node>();\n\n /** Mark a node to preserve its effects even if detached from the DOM (e.g., jQuery .detach()). */\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 /** Temporary flag to block redundant cleanup cycles for the same node. */\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(element: Element): BindingRecord {\n // Lazy-init: The mutation observer only starts when the first binding is created.\n if (!autoCleanupScheduled && typeof document !== 'undefined' && document.body) {\n autoCleanupScheduled = true;\n enableAutoCleanup(document.body);\n }\n let result = this.records.get(element);\n if (!result) {\n result = {};\n this.records.set(element, result);\n element.classList.add(AES_BOUND);\n }\n return result;\n }\n\n private addCleanup(element: Element, cleanupFunction: () => void): void {\n const record = this.getOrCreateRecord(element);\n if (!record.cleanups) record.cleanups = [];\n record.cleanups.push(cleanupFunction);\n }\n\n /** Registers a reactive effect instance to be disposed when the element is removed. */\n trackEffect(element: Element, reactiveEffect: EffectObject): void {\n const selector = getSelector(element);\n this.addCleanup(element, () => {\n try {\n reactiveEffect.dispose();\n } catch (error) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.CORE.EFFECT_DISPOSE_ERROR(selector),\n error\n );\n }\n });\n }\n\n /** Registers a generic cleanup closure to be executed when the element is removed. */\n trackCleanup(element: Element, cleanupFunction: () => void): void {\n const selector = getSelector(element);\n this.addCleanup(element, () => {\n try {\n cleanupFunction();\n } catch (error) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.CLEANUP_ERROR(selector), error);\n }\n });\n }\n\n /** Sets the optional teardown function returned by a mounted component. */\n setComponentCleanup(element: Element, teardownFunction: (() => void) | undefined): void {\n this.getOrCreateRecord(element).componentCleanup = teardownFunction;\n }\n\n hasBind(element: Element): boolean {\n return this.records.has(element);\n }\n\n /**\n * Performs the actual destruction of all resources bound to the node.\n * This clears the record, removes the tracking CSS class, and executes all callbacks.\n */\n cleanup(node: Node): void {\n this.preservedNodes.delete(node);\n this.ignoredNodes.delete(node);\n\n if (node.nodeType !== 1) return;\n const element = node as Element;\n const record = this.records.get(element);\n\n this.records.delete(element);\n element.classList.remove(AES_BOUND);\n\n if (!record) return;\n\n if (record.componentCleanup) {\n try {\n record.componentCleanup();\n } catch (error) {\n const selector = getSelector(element);\n debug.error(LOG_PREFIXES.MOUNT, ERROR_MESSAGES.MOUNT.CLEANUP_ERROR(selector), error);\n }\n }\n\n if (record.cleanups) {\n for (const cleanupFunction of record.cleanups) cleanupFunction();\n }\n }\n\n cleanupDescendants(root: Element | DocumentFragment | ShadowRoot): void {\n // Strategy: Use querySelectorAll to obtain a static NodeList snapshot.\n // This ensures loop stability by preventing index shifting if items are removed\n // or their classes are modified (via classList.remove) during the cleanup cycle.\n const nodes = root.querySelectorAll(`.${AES_BOUND}`);\n\n for (let i = 0, length = nodes.length; i < length; i++) {\n const node = nodes[i];\n if (node) this.cleanup(node);\n }\n }\n\n /** Destroys the reactive state of the element and its entire sub-tree. */\n cleanupTree(node: Node): void {\n if (node.nodeType === 1 || node.nodeType === 11) {\n this.cleanupDescendants(node as Element | DocumentFragment | ShadowRoot);\n }\n this.cleanup(node);\n }\n}\n\nexport const registry = new BindingRegistry();\n\nconst observers = new Map<Node, MutationObserver>();\n\n/**\n * Requirement: Native browser operations (like el.innerHTML = '') bypass jQuery hooks.\n * This observer serves as a safety net, detecting removed nodes that missed the\n * patched jQuery .remove() or .empty() calls.\n */\nexport function enableAutoCleanup(root: Element | ShadowRoot | DocumentFragment): void {\n if (observers.has(root)) return;\n\n const observer = new MutationObserver((mutations) => {\n for (let i = 0, mutationsLength = mutations.length; i < mutationsLength; i++) {\n const removedNodes = mutations[i]!.removedNodes;\n for (let j = 0, removedNodesLength = removedNodes.length; j < removedNodesLength; j++) {\n const node = removedNodes[j]!;\n\n // Condition: We only clean up nodes that are genuinely disconnected from the DOM\n // AND are not marked for preservation.\n if (node.nodeType !== 1 || (node as Element).isConnected) continue;\n\n const element = node as Element;\n\n if (registry.isKept(element) || registry.isIgnored(element)) continue;\n\n registry.cleanupTree(element);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observers.set(root, observer);\n}\n\nexport function setAutoCleanupScheduled(scheduled: boolean): void {\n autoCleanupScheduled = scheduled;\n}\n\nexport function disableAutoCleanup(): void {\n observers.forEach((observer) => observer.disconnect());\n observers.clear();\n}\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\n\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/** Symbol used to mark handlers as processed, avoiding redundant wrapping in batch(). */\nexport const INTERNAL_HANDLER = Symbol.for('atom-effect-internal');\n\n/** Maps original developer functions to their corresponding batch-wrapped versions. */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\ntype JQueryEventHandler = EventHandler | boolean;\n\ntype OriginalMethods = {\n on: typeof $.fn.on;\n one: typeof $.fn.one;\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 * Wraps a standard jQuery event handler in a 'batch()' block.\n * This ensures that multiple atom updates triggered by a single event\n * (e.g., click) only trigger a single collective re-render.\n */\nconst getWrappedHandler = (fn: EventHandler): EventHandler => {\n if ((fn as unknown as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER]) return fn;\n\n let wrapped = handlerMap.get(fn);\n\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\n (wrapped as unknown as { [INTERNAL_HANDLER]?: boolean })[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n }\n return wrapped;\n};\n\n/** Retrieves the wrapped version of a handler so it can be passed back to jQuery's .off(). */\nconst resolveWrapped = (fn: EventHandler): EventHandler => {\n return handlerMap.get(fn) ?? fn;\n};\n\nfunction wrapEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler> {\n const newMap: Record<string, JQueryEventHandler> = {};\n for (const k in map) {\n const fn = map[k];\n newMap[k] = typeof fn === 'function' ? getWrappedHandler(fn) : (fn as JQueryEventHandler);\n }\n return newMap;\n}\n\nfunction resolveOffEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler | undefined> {\n const newMap: Record<string, JQueryEventHandler | undefined> = {};\n for (const k in map) {\n const h = map[k];\n newMap[k] = typeof h === 'function' ? resolveWrapped(h) : h;\n }\n return newMap;\n}\n\n/** Utility to traverse and patch jQuery arguments whether they are objects or individual parameters. */\nfunction patchEventArguments(\n args: unknown[],\n mapProcessor: (\n map: Record<string, JQueryEventHandler | undefined>\n ) => Record<string, JQueryEventHandler | undefined>,\n handlerProcessor: (fn: EventHandler) => EventHandler\n) {\n const first = args[0];\n if (first && typeof first === 'object') {\n args[0] = mapProcessor(first as Record<string, JQueryEventHandler | undefined>);\n } else {\n for (let i = 1; i < args.length; i++) {\n if (typeof args[i] === 'function') {\n args[i] = handlerProcessor(args[i] as EventHandler);\n }\n }\n }\n}\n\nfunction createEventHandlerPatch(origFn: Function) {\n return function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, wrapEventMap, getWrappedHandler);\n return origFn.apply(this, args) ?? this;\n };\n}\n\n/**\n * Globally overrides specific jQuery prototype methods to automate library behavior.\n *\n * Responsibilities:\n * 1. Auto-Batching: Wraps all event handlers in 'batch()' to prevent UI jitter.\n * 2. Lifecycle Sync: Hooking .remove()/.empty() to stop reactive effects on deleted elements.\n * 3. Persistence: Hooking .detach() to preserve effects when nodes are moved temporarily.\n * 4. Identity Management: Uses a WeakMap so .off(originalFn) still works correctly.\n */\nexport function enablejQueryOverrides(): void {\n if (originals !== null) return;\n\n originals = {\n on: $.fn.on,\n one: $.fn.one,\n off: $.fn.off,\n remove: $.fn.remove,\n empty: $.fn.empty,\n detach: $.fn.detach,\n };\n const orig = originals;\n\n $.fn.remove = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n if (el) {\n // Condition: Mark ignored to prevent duplicate cleanup cycles if jQuery\n // triggers internal events during removal.\n registry.markIgnored(el);\n registry.cleanupTree(el);\n }\n }\n return orig.remove.call(this, selector) ?? this;\n };\n\n $.fn.empty = function (this: JQuery) {\n const len = this.length;\n for (let i = 0; i < len; i++) {\n const el = this[i];\n if (el?.hasChildNodes()) registry.cleanupDescendants(el);\n }\n return orig.empty.call(this) ?? this;\n };\n\n $.fn.detach = function (this: JQuery, selector?: string) {\n const targets = selector ? this.filter(selector) : this;\n const len = targets.length;\n for (let i = 0; i < len; i++) {\n const el = targets[i];\n // Logic: Unlike .remove(), .detach() signals that the element might reappear\n // elsewhere, so we keep its reactive effects alive.\n if (el) registry.keep(el);\n }\n return orig.detach.call(this, selector) ?? this;\n };\n\n $.fn.on = createEventHandlerPatch(orig.on) as typeof $.fn.on;\n $.fn.one = createEventHandlerPatch(orig.one) as typeof $.fn.one;\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n patchEventArguments(args, resolveOffEventMap, resolveWrapped);\n return orig.off.apply(this, args as Parameters<typeof $.fn.off>) ?? this;\n };\n}\n\n/** Restores original jQuery prototype methods to their clean state. */\nexport function disablejQueryOverrides(): void {\n if (originals === null) return;\n\n $.fn.on = originals.on;\n $.fn.one = originals.one;\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 Paths,\n PathValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\nexport type EffectCleanup = () => void;\nexport interface ComponentLifecycle {\n unmount: EffectCleanup;\n}\nexport type EffectResult = undefined | EffectCleanup | ComponentLifecycle;\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\nexport interface AtomOptions extends BaseAtomOptions {\n name?: string;\n sync?: boolean;\n}\n\n/**\n * Flexible value container.\n * Supports raw T, reactive Atoms, or functional getters for deferred execution.\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * Extension of ReactiveValue that permits Promises.\n * Used primarily for CSS and Attribute bindings that might rely on async fetching.\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\n\nexport type PrimitiveValue = string | number | boolean | null | undefined;\n\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\n\nexport type CssBindings = Record<string, CssValue>;\n\n/**\n * Central DSL for declarative jQuery bindings.\n * Maps reactive sources to specific DOM manipulation strategies.\n */\nexport interface BindingOptions<T = unknown> {\n text?:\n | AsyncReactiveValue<unknown>\n | [source: AsyncReactiveValue<unknown>, formatter: (v: unknown) => string];\n html?: AsyncReactiveValue<string>;\n class?: Record<string, AsyncReactiveValue<boolean>>;\n css?: CssBindings;\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n show?: AsyncReactiveValue<boolean>;\n hide?: AsyncReactiveValue<boolean>;\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n checked?: WritableAtom<boolean>;\n form?:\n | WritableAtom<T extends object ? T : unknown>\n | [\n atom: WritableAtom<T extends object ? T : unknown>,\n options: FormOptions<T extends object ? T : unknown>,\n ];\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\nexport interface DisposableWritableAtom<T> extends WritableAtom<T> {\n dispose(): void;\n}\n\nexport type ListKey = string | number;\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\n/**\n * Configuration for high-performance list reconciliation.\n * Uses 'key' for identity tracking to minimize DOM churn.\n */\nexport interface ListOptions<T> {\n key: keyof T | ListKeyFn<T>;\n render: (item: T, index: number) => ListRenderResult;\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?: ListRenderResult;\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n isEqual?: (a: T, b: T) => boolean;\n}\n\nexport interface ValOptions<T> {\n debounce?: number;\n event?: string;\n parse?: (v: string) => T;\n format?: (v: T) => string;\n equal?: EqualFn<T>;\n}\n\nexport interface FormOptions<T> extends ValOptions<T> {\n /** Custom function to transform field value based on path before atomic sync. */\n transform?: (path: string, value: unknown) => unknown;\n /** Callback triggered when a field value changes. */\n onChange?: (path: string, value: unknown) => void;\n}\n\nexport interface FetchOptions<T> {\n defaultValue: T;\n name?: string;\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n headers?: Record<string, string>;\n transform?: (raw: unknown, xhr: JQuery.jqXHR) => T;\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n onError?: (err: unknown) => void;\n eager?: boolean;\n}\n\nexport interface FetchError extends Error {\n jqXHR?: JQuery.jqXHR;\n}\n\n/** Definition for a mountable component that manages its own lifecycle. */\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\nexport interface RouteLifecycle {\n onEnter?: (\n params: Record<string, string>,\n router: Router\n ) => Record<string, string> | undefined | false;\n onLeave?: (router: Router) => boolean | undefined;\n title?: string;\n}\n\nexport interface RouteDefinition extends RouteLifecycle {\n template?: string;\n render?: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\nexport interface RouteConfig {\n target: string | JQuery<HTMLElement> | HTMLElement;\n default?: string;\n routes?: Record<string, RouteDefinition>;\n mode?: 'hash' | 'history';\n basePath?: string;\n notFound?: string;\n autoBindLinks?: boolean;\n activeClass?: string;\n beforeTransition?: (from: string, to: string) => void;\n afterTransition?: (from: string, to: string) => void;\n}\n\nexport interface Router {\n currentRoute: ReadonlyAtom<string>;\n queryParams: ReadonlyAtom<Record<string, string>>;\n params: ReadonlyAtom<Record<string, string>>;\n navigate: (route: string) => void;\n destroy: () => void;\n}\n\nexport interface AtomNavOptions {\n target: string | JQuery<HTMLElement> | HTMLElement;\n selector?: string;\n headers?: Record<string, string>;\n onBeforeLoad?: (url: string) => boolean | undefined | Promise<boolean | undefined>;\n onMount?: ($container: JQuery, url: string) => void;\n onUnmount?: ($container: JQuery, oldUrl: string) => void;\n onError?: (err: unknown, url: string) => boolean | undefined;\n scrollToTop?: boolean;\n syncTitle?: boolean;\n\n window?: Window & typeof globalThis;\n}\n\nexport interface AtomNav {\n currentUrl: ReadonlyAtom<string>;\n isPending: ReadonlyAtom<boolean>;\n hasError: ReadonlyAtom<boolean>;\n navigate(url: string, options?: { replace?: boolean }): Promise<void>;\n destroy: () => void;\n}\n\n/**\n * Bitwise Synchronization Guard: Prevents recursive feedback loops\n * between the DOM and Atoms during two-way data flow.\n */\nexport enum BindingFlags {\n None = 0,\n Focused = 1 << 0,\n Composing = 1 << 1,\n SyncingToAtom = 1 << 2,\n SyncingToDom = 1 << 3,\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\ndeclare global {\n /** Global jQuery namespace extensions ($). */\n interface JQueryStatic {\n atom<T>(v: T, opts?: AtomOptions): WritableAtom<T>;\n computed<T>(fn: () => T, opts?: ComputedOptions<T>): ComputedAtom<T>;\n computed<T>(\n fn: () => Promise<T>,\n opts: ComputedOptions<T> & { defaultValue: T }\n ): ComputedAtom<T>;\n effect(\n fn: () => EffectResult,\n opts?: import('@but212/atom-effect').EffectOptions\n ): EffectObject;\n batch(fn: () => void): void;\n untracked<T>(fn: () => T): T;\n isAtom(v: unknown): boolean;\n isComputed(v: unknown): boolean;\n nextTick(): Promise<void>;\n\n debug: {\n enabled: boolean;\n warn(prefix: string, message: string, ...rest: unknown[]): void;\n error(prefix: string, message: string, cause: unknown): void;\n domUpdated(prefix: string, target: Element | JQuery, type: string, value: unknown): void;\n };\n\n atomLens<T extends object, P extends Paths<T>>(\n atom: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n composeLens<T extends object, P extends Paths<T>>(\n lens: WritableAtom<T>,\n path: P\n ): DisposableWritableAtom<PathValue<T, P>>;\n lensFor<T extends object>(\n atom: WritableAtom<T>\n ): <P extends Paths<T>>(p: P) => DisposableWritableAtom<PathValue<T, P>>;\n route(config: RouteConfig): Router;\n\n atomFetch<T>(\n url: string | (() => string),\n opts: FetchOptions<T>\n ): ComputedAtom<T> & { abort: () => void; dispose(): void };\n atomNav(options: AtomNavOptions): AtomNav;\n }\n\n /** jQuery Instance Method extensions ($('...').method()). */\n interface JQuery {\n atomText<T>(src: AsyncReactiveValue<T>, fmt?: (v: T) => string): this;\n atomHtml(src: AsyncReactiveValue<string>): this;\n atomClass(name: string, cond: AsyncReactiveValue<boolean>): this;\n atomClass(map: Record<string, AsyncReactiveValue<boolean>>): this;\n atomCss(prop: string, src: AsyncReactiveValue<string | number>, unit?: string): this;\n atomCss(map: CssBindings): this;\n atomAttr(name: string, src: AsyncReactiveValue<PrimitiveValue>): this;\n atomAttr(map: Record<string, AsyncReactiveValue<PrimitiveValue>>): this;\n atomProp<T>(name: string, src: AsyncReactiveValue<T>): this;\n atomProp(map: Record<string, AsyncReactiveValue<unknown>>): this;\n atomShow(cond: AsyncReactiveValue<boolean>): this;\n atomHide(cond: AsyncReactiveValue<boolean>): this;\n\n atomVal<T>(atom: WritableAtom<T>, opts?: ValOptions<T>): this;\n\n atomChecked(atom: WritableAtom<boolean>): this;\n\n atomForm<T extends object>(atom: WritableAtom<T>, opts?: FormOptions<T>): this;\n\n atomOn(event: string, handler: (e: JQuery.Event) => void): this;\n\n atomBind<T = unknown>(opts: BindingOptions<T>): this;\n\n atomList<T>(src: ReadonlyAtom<T[]>, opts: ListOptions<T>): this;\n\n atomMount<P>(comp: ComponentFn<P>, props?: P): this;\n atomUnmount(): this;\n\n atomUnbind(): this;\n }\n}\n\nexport type { ComputedAtom, ComputedOptions, EffectObject, ReadonlyAtom, WritableAtom };\n","import { effect, untracked } from '@but212/atom-effect';\nimport { INPUT_DEFAULTS, LOG_PREFIXES } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\nlet instanceCounter = 0;\ntype FormElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a function as an internal atom-effect handler.\n *\n * Reason: Bypasses the global jQuery batching patch to prevent redundant update cycles\n * since synchronization is already gated by internal bitmask flags.\n */\nfunction markInternal(handlerFunction: Function): void {\n (handlerFunction as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n}\n\n/**\n * Internal engine for two-way data binding between DOM inputs and reactive Atoms.\n *\n * Optimization: Specializes read/write/equal/format strategies at construction time\n * to ensure monomorphic execution paths, avoiding branching in high-frequency sync loops.\n */\nclass InputBinding<T> {\n private readonly namespace = `.atomBind-${++instanceCounter}`;\n private readonly readValue: () => T;\n private readonly writeToDom: (value: T, formatted: string) => void;\n private readonly areEqual: (first: T, second: T) => boolean;\n private readonly formatValue: (value: T) => string;\n\n private flags = BindingFlags.None;\n private debounceTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n private readonly $element: JQuery,\n private readonly atom: WritableAtom<T>,\n private readonly options: ValOptions<T>\n ) {\n const element = $element[0] as FormElement;\n const isMultipleSelect =\n element.tagName === 'SELECT' && (element as HTMLSelectElement).multiple;\n const isTextControl = element.tagName === 'INPUT' || element.tagName === 'TEXTAREA';\n\n const parse = options.parse ?? ((value: string) => value as unknown as T);\n const baseEqual = options.equal ?? Object.is;\n\n // Optimization: Branching is handled once here instead of every sync cycle.\n if (isMultipleSelect) {\n this.readValue = () => (($element.val() as string[]) || []) as unknown as T;\n this.writeToDom = (value) => {\n $element.val(value as unknown as string[]);\n };\n this.areEqual = (a, b) => {\n if (baseEqual(a, b)) return true;\n return (\n Array.isArray(a) &&\n Array.isArray(b) &&\n a.length === b.length &&\n a.every((v, i) => Object.is(v, b[i]))\n );\n };\n this.formatValue =\n options.format ?? ((v: unknown) => (Array.isArray(v) ? v : v ? [String(v)] : []).join(','));\n } else {\n this.readValue = () => parse(element.value);\n this.writeToDom = (_, formatted) => {\n // Logic: Cursor preservation prevents focus loss or \"jumping\" when updating focused text controls.\n if (isTextControl && document.activeElement === element) {\n const input = element as HTMLInputElement;\n try {\n const { selectionStart, selectionEnd } = input;\n input.value = formatted;\n if (selectionStart !== null && selectionEnd !== null) {\n const length = formatted.length;\n input.setSelectionRange(\n Math.min(selectionStart, length),\n Math.min(selectionEnd, length)\n );\n }\n } catch {\n input.value = formatted;\n }\n } else {\n element.value = formatted;\n }\n };\n this.areEqual = baseEqual;\n this.formatValue = options.format ?? ((v: T) => String(v ?? ''));\n }\n\n this.initializeEvents();\n }\n\n private initializeEvents(): void {\n const namespace = this.namespace;\n const debounce = this.options.debounce ?? 0;\n\n const syncToAtomDelegate = () => {\n if (!(this.flags & BindingFlags.Composing)) this.syncToAtom();\n };\n\n const handleInput =\n debounce > 0\n ? () => {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(syncToAtomDelegate, debounce);\n }\n : syncToAtomDelegate;\n\n [\n this.handleFocus,\n this.handleBlur,\n this.handleCompositionStart,\n this.handleCompositionEnd,\n handleInput,\n ].forEach(markInternal);\n\n const eventNames = (this.options.event ?? INPUT_DEFAULTS.EVENT)\n .trim()\n .split(/\\s+/)\n .map((name) => `${name}${namespace}`)\n .join(' ');\n\n this.$element\n .on(`focus${namespace}`, this.handleFocus)\n .on(`blur${namespace}`, this.handleBlur)\n .on(`compositionstart${namespace}`, this.handleCompositionStart)\n .on(`compositionend${namespace}`, this.handleCompositionEnd)\n .on(eventNames, handleInput);\n }\n\n private handleFocus = () => {\n this.flags |= BindingFlags.Focused;\n };\n\n private handleCompositionStart = () => {\n this.flags |= BindingFlags.Composing;\n };\n\n private handleCompositionEnd = () => {\n this.flags &= ~BindingFlags.Composing;\n this.syncToAtom();\n };\n\n private handleBlur = () => {\n const wasComposing = !!(this.flags & BindingFlags.Composing);\n this.flags &= ~(BindingFlags.Focused | BindingFlags.Composing);\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = undefined;\n this.syncToAtom();\n } else if (wasComposing) {\n this.syncToAtom();\n }\n\n // Logic: Normalization ensures the DOM value strictly matches the Atom state when interactions end.\n const atomValue = this.atom.peek();\n if (!this.isDomUpToDate(atomValue)) {\n this.writeToDom(atomValue, this.formatValue(atomValue));\n }\n };\n\n private syncToAtom(): void {\n if (this.flags & BindingFlags.Busy) return;\n this.flags |= BindingFlags.SyncingToAtom;\n try {\n const domValue = this.readValue();\n if (!this.areEqual(this.atom.peek(), domValue)) {\n this.atom.value = domValue;\n }\n } finally {\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n }\n\n /**\n * Synchronizes the DOM element's value with the current Atom state.\n */\n public readonly syncToDom = () => {\n const atomValue = this.atom.value;\n // Logic: Bitmask gate prevents infinite feedback loops between DOM events and Atom updates.\n if (this.flags & BindingFlags.Busy) return;\n\n untracked(() => {\n if (this.isDomUpToDate(atomValue)) return;\n this.flags |= BindingFlags.SyncingToDom;\n try {\n const formatted = this.formatValue(atomValue);\n this.writeToDom(atomValue, formatted);\n debug.domUpdated(LOG_PREFIXES.BINDING, this.$element, 'val', formatted);\n } finally {\n this.flags &= ~BindingFlags.SyncingToDom;\n }\n });\n };\n\n private isDomUpToDate(atomValue: T): boolean {\n if (!this.areEqual(this.readValue(), atomValue)) return false;\n\n // Logic: While focused, we allow minor visual discrepancies (e.g., \"1.0\" vs \"1\") for input stability.\n if (this.flags & BindingFlags.Focused) return true;\n\n const element = this.$element[0] as FormElement;\n return this.formatValue(atomValue) === element.value;\n }\n\n /**\n * Removes all event listeners and clears pending timers.\n */\n public cleanup(): void {\n // Constraint: Namespacing prevents collisions with other bindings or user-defined event listeners.\n this.$element.off(this.namespace);\n clearTimeout(this.debounceTimer);\n }\n}\n\n/**\n * Applies a two-way value binding between a jQuery selection and a reactive Atom.\n *\n * When to use:\n * - To synchronize form inputs (text, textarea, select) with a WritableAtom.\n * - When cursor preservation or IME composition support is required for better UX.\n *\n * @param $element - The jQuery wrapped form element to bind.\n * @param atom - The WritableAtom to synchronize with the element value.\n * @param options - Configuration for debouncing, custom parsing, and formatting.\n *\n * @returns An object containing the reactive effect and a cleanup function.\n *\n * @example\n * const count = atom(0);\n * const { cleanup } = applyInputBinding($('#my-input'), count, {\n * parse: (v) => parseInt(v, 10),\n * debounce: 300\n * });\n */\nexport function applyInputBinding<T>(\n $element: JQuery,\n atom: WritableAtom<T>,\n options: ValOptions<T>\n): { reactiveEffect: EffectObject; cleanup: () => void } {\n const binding = new InputBinding($element, atom, options);\n return {\n reactiveEffect: effect(binding.syncToDom),\n cleanup: () => binding.cleanup(),\n };\n}\n","import { effect, isAtom, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\n\nimport { isPromise } from '@/utils';\nimport { debug } from '@/utils/debug';\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 * Internal helper to manage async race conditions and cleanup.\n */\nfunction createAsyncRunner<T>(\n el: Element,\n debugType: BindingDebugType,\n updater: (value: T) => void\n) {\n let latestId = 0;\n let isDisposed = false;\n\n registry.trackCleanup(el, () => {\n isDisposed = true;\n });\n\n return (val: T | Promise<T>) => {\n const currentId = ++latestId;\n\n if (!isPromise(val)) {\n untracked(() => {\n try {\n updater(val);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, debugType, val);\n } catch (e) {\n debug.error(\n LOG_PREFIXES.BINDING,\n ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType, true),\n e\n );\n }\n });\n return;\n }\n\n val\n .then((resolved) => {\n if (currentId === latestId && !isDisposed) {\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(LOG_PREFIXES.BINDING, el, `${debugType} (async)`, resolved);\n } catch (e) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n }\n })\n .catch((e) => {\n if (currentId === latestId && !isDisposed) {\n debug.error(LOG_PREFIXES.BINDING, ERROR_MESSAGES.BINDING.UPDATER_ERROR(debugType), e);\n }\n });\n };\n}\n\n/**\n * Orchestrates a reactive relationship between a single source and a DOM element.\n */\nexport function registerReactiveEffect<T>(\n el: Element,\n source: AsyncReactiveValue<T>,\n updater: (value: T) => void,\n debugType: BindingDebugType\n): void {\n const runner = createAsyncRunner(el, debugType, updater);\n\n const sourceIsReactive = isAtom(source);\n const sourceIsFunction = typeof source === 'function';\n\n if (sourceIsReactive || sourceIsFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = sourceIsReactive\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : (source as () => T | Promise<T>)();\n runner(value);\n },\n { name: debugType }\n )\n );\n } else {\n runner(source as T | Promise<T>);\n }\n}\n\n/**\n * Orchestrates reactive updates for a collection of values (e.g. classes or styles).\n */\nexport function registerMapEffect<T>(\n el: Element,\n map: Record<string, AsyncReactiveValue<T>>,\n updater: (map: Record<string, T>) => void,\n debugType: BindingDebugType\n): void {\n const runner = createAsyncRunner(el, debugType, updater);\n const entries = Object.entries(map);\n\n let hasReactive = false;\n for (let i = 0, len = entries.length; i < len; i++) {\n const val = entries[i]![1];\n if (isAtom(val) || typeof val === 'function') {\n hasReactive = true;\n break;\n }\n }\n\n const evaluateMap = () => {\n const promises: Promise<{ key: string; val: T }>[] = [];\n const resolvedMap: Record<string, T> = {};\n\n for (let i = 0, len = entries.length; i < len; i++) {\n const [key, source] = entries[i]!;\n const val = isAtom(source)\n ? (source as ReadonlyAtom<T | Promise<T>>).value\n : typeof source === 'function'\n ? (source as () => T | Promise<T>)()\n : (source as T | Promise<T>);\n\n if (isPromise(val)) {\n promises.push(val.then((v) => ({ key, val: v })));\n } else {\n resolvedMap[key] = val as T;\n }\n }\n\n if (promises.length > 0) {\n return Promise.all(promises).then((results) => {\n for (let i = 0, len = results.length; i < len; i++) {\n const res = results[i]!;\n resolvedMap[res.key] = res.val;\n }\n return resolvedMap;\n });\n }\n return resolvedMap;\n };\n\n if (hasReactive) {\n registry.trackEffect(\n el,\n effect(() => runner(evaluateMap()), { name: debugType })\n );\n } else {\n runner(evaluateMap());\n }\n}\n","import { DANGEROUS_PROTOCOL_PATTERN } from '@/constants';\n\n// --- Configuration & Security Constants ---\n\n/** Attributes that must be checked for dangerous URI protocols. */\nconst URL_ATTRIBUTES = [\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'data',\n 'poster',\n 'background',\n 'cite',\n 'longdesc',\n 'profile',\n 'usemap',\n 'classid',\n 'codebase',\n 'fill',\n 'filter',\n 'mask',\n 'marker-start',\n 'marker-mid',\n 'marker-end',\n 'clip-path',\n 'srcdoc',\n 'srcset',\n];\n\n/** Tags that are dangerous and must be neutralized by transforming them into safe containers. */\nconst BLACKLISTED_TAGS = [\n 'script',\n 'iframe',\n 'object',\n 'embed',\n 'base',\n 'meta',\n 'applet',\n 'noscript',\n 'form',\n 'style',\n 'link',\n 'title',\n];\n\n/** List of patterns that are forbidden within CSS contexts. */\nconst CSS_DANGER_PATTERNS = [\n /expression\\s*\\(/i, // IE legacy expressions\n /behavior\\s*:/i, // IE legacy behaviors\n /-moz-binding\\s*:/i, // Old Firefox XBL bindings\n /@import/i, // External stylesheet imports\n new RegExp(`url\\\\s*\\\\(\\\\s*[\"']?\\\\s*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`, 'i'), // url(javascript:...)\n /data\\s*:\\s*(?!image\\/)/i, // data: URIs that aren't images\n];\n\n/** Mapping of obfuscated HTML entities to their plain-text equivalents. */\nconst HTML_ENTITY_LOOKUP: Record<string, string> = {\n colon: ':',\n tab: '\\t',\n newline: '\\n',\n};\n\n// --- Regex Definitions ---\n\nconst REGEX_NUMERIC_ENTITY = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\nconst REGEX_NAMED_ENTITY = /&(colon|tab|newline);?/gi;\n\n// biome-ignore lint/suspicious/noControlCharactersInRegex: necessary for protocol normalization\nconst REGEX_CONTROL_CHARS = /[\\x00-\\x1f\\x7f]/g;\n\nconst REGEX_DATA_URI_HTML =\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/i;\n\n/** Optimization: Pre-compiled strict protocol pattern */\nconst REGEX_PROTOCOL_STRICT = new RegExp(\n `(?:^|url\\\\s*\\\\(\\\\s*[\"']?)\\\\s*${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`,\n 'i'\n);\n\n/**\n * Logic: A combined pattern used for fast-path sniffing of dangerous content.\n * Synchronized automatically with BLACKLISTED_TAGS.\n */\nconst REGEX_DANGEROUS_SNIFFER = new RegExp(\n [\n `(<(${BLACKLISTED_TAGS.join('|')})\\\\b[^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\2>|<(${BLACKLISTED_TAGS.join('|')})\\\\b[^>]*\\\\/?>)`,\n '\\\\bon\\\\w+\\\\s*=',\n `${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`,\n REGEX_DATA_URI_HTML.source,\n ].join('|'),\n 'i'\n);\n\n// --- Safe DOM Access ---\n\n/**\n * Security Bridge: Accesses DOM properties via prototypes to prevent bypass attacks\n * that use Object.defineProperty on element instances (DOM Clobbering).\n */\nconst DOM_PROTOTYPE_BRIDGE = {\n getAttributes: (element: Element) =>\n Object.getOwnPropertyDescriptor(Element.prototype, 'attributes')!.get!.call(\n element\n ) as NamedNodeMap,\n setAttribute: (element: Element, name: string, value: string) =>\n Element.prototype.setAttribute.call(element, name, value),\n removeAttribute: (element: Element, name: string) =>\n Element.prototype.removeAttribute.call(element, name),\n replaceElement: (oldElement: Element, newElement: Node) =>\n Element.prototype.replaceWith.call(oldElement, newElement),\n getLocalName: (element: Element) =>\n Object.getOwnPropertyDescriptor(Element.prototype, 'localName')!.get!.call(element) as string,\n getFirstChild: (node: Node) =>\n Object.getOwnPropertyDescriptor(Node.prototype, 'firstChild')!.get!.call(\n node\n ) as ChildNode | null,\n};\n\n// --- Normalization & Validation Logic ---\n\n/**\n * Decodes HTML entities and strips control characters to reveal hidden protocols.\n */\nfunction normalizeValue(input: string): string {\n if (typeof input !== 'string') return '';\n return input\n .replace(REGEX_NUMERIC_ENTITY, (_, hex, dec) => {\n const codePoint = hex ? parseInt(hex, 16) : parseInt(dec, 10);\n return codePoint >= 0 && codePoint <= 0x10ffff ? String.fromCodePoint(codePoint) : '';\n })\n .replace(REGEX_NAMED_ENTITY, (_, name) => HTML_ENTITY_LOOKUP[name.toLowerCase()] ?? '')\n .replace(REGEX_CONTROL_CHARS, '');\n}\n\n/**\n * Returns true if the string contains a dangerous URI protocol.\n */\nfunction isDangerousProtocol(value: string): boolean {\n const cleanedValue = value.replace(/\\s+/g, '');\n return REGEX_PROTOCOL_STRICT.test(cleanedValue) || REGEX_DATA_URI_HTML.test(cleanedValue);\n}\n\n/**\n * Security Patch: srcset can contain comma-separated URLs.\n * Each must be sanitized individually to prevent protocol smuggling.\n */\nfunction scrubSrcset(value: string): string {\n return value\n .split(',')\n .map((part) => {\n const trimmedPart = part.trim();\n if (!trimmedPart) return part;\n const [url, ...metadata] = trimmedPart.split(/\\s+/);\n const normalizedUrl = normalizeValue(url!);\n return isDangerousProtocol(normalizedUrl)\n ? ['data-unsafe-protocol:', ...metadata].join(' ')\n : [normalizedUrl, ...metadata].join(' ');\n })\n .join(',');\n}\n\n/**\n * Normalizes CSS by removing comments and extra whitespace\n * to reveal hidden keywords or protocols.\n */\nfunction normalizeCss(value: string): string {\n const normalized = normalizeValue(value);\n // Strip CSS comments: /* ... */\n return normalized.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n}\n\n/** Returns true if any dangerous CSS patterns are detected. */\nfunction isCssDangerous(value: string): boolean {\n const cleanCss = normalizeCss(value);\n return CSS_DANGER_PATTERNS.some((pattern) => pattern.test(cleanCss));\n}\n\n// --- Attribute Specific Scrubbers ---\n\n/**\n * Logic: Handlers for attributes that require specialized sanitization logic.\n */\nconst ATTRIBUTE_HANDLERS: Record<\n string,\n (element: HTMLElement, name: string, value: string) => void\n> = {\n srcdoc: (element, name, value) => {\n const normalizedValue = normalizeValue(value);\n DOM_PROTOTYPE_BRIDGE.setAttribute(element, name, sanitizeHtml(normalizedValue));\n },\n srcset: (element, name, value) => {\n DOM_PROTOTYPE_BRIDGE.setAttribute(element, name, scrubSrcset(value));\n },\n style: (element, _, value) => {\n if (isCssDangerous(value)) {\n DOM_PROTOTYPE_BRIDGE.setAttribute(element, 'style', 'data-unsafe-css:');\n }\n },\n};\n\n// --- Scrubber Core ---\n\n/**\n * Scrubs event listeners (on*) and malicious protocols from individual element attributes.\n */\nfunction applySecurityPolicy(element: HTMLElement): void {\n const attributes = DOM_PROTOTYPE_BRIDGE.getAttributes(element);\n if (!attributes) return;\n\n const scrubbedEventHandlers: string[] = [];\n\n for (let i = attributes.length - 1; i >= 0; i--) {\n const attribute = attributes[i]!;\n const name = attribute.name;\n const lowerName = name.toLowerCase();\n const value = attribute.value;\n\n if (lowerName.startsWith('on')) {\n DOM_PROTOTYPE_BRIDGE.removeAttribute(element, name);\n scrubbedEventHandlers.push(name);\n continue;\n }\n\n if (ATTRIBUTE_HANDLERS[lowerName]) {\n ATTRIBUTE_HANDLERS[lowerName]!(element, name, value);\n } else if (URL_ATTRIBUTES.includes(lowerName)) {\n const normalizedValue = normalizeValue(value);\n if (isDangerousProtocol(normalizedValue)) {\n DOM_PROTOTYPE_BRIDGE.setAttribute(element, name, 'data-unsafe-protocol:');\n }\n }\n }\n\n if (scrubbedEventHandlers.length > 0) {\n DOM_PROTOTYPE_BRIDGE.setAttribute(element, 'data-unsafe-attr', scrubbedEventHandlers.join(','));\n }\n}\n\n/**\n * Neutralizes dangerous tags (like <script>) by converting them to <span>.\n */\nfunction neutralizeDangerousNode(element: HTMLElement): void {\n if (!BLACKLISTED_TAGS.includes(DOM_PROTOTYPE_BRIDGE.getLocalName(element))) return;\n\n const safeReplacement = document.createElement('span');\n const attributes = DOM_PROTOTYPE_BRIDGE.getAttributes(element);\n\n for (let i = 0; i < attributes.length; i++) {\n const attr = attributes[i];\n if (attr) safeReplacement.setAttribute(attr.name, attr.value);\n }\n\n // Scrub attributes copied from dangerous nodes\n applySecurityPolicy(safeReplacement);\n\n let child = DOM_PROTOTYPE_BRIDGE.getFirstChild(element);\n while (child) {\n safeReplacement.appendChild(child);\n child = DOM_PROTOTYPE_BRIDGE.getFirstChild(element);\n }\n\n DOM_PROTOTYPE_BRIDGE.replaceElement(element, safeReplacement);\n}\n\n/**\n * Recursive walker that processes a document fragment and its nested templates.\n */\nfunction executeSanitizationWalk(root: Node | DocumentFragment): void {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n const processingQueue: HTMLElement[] = [];\n\n let currentElement = walker.nextNode() as HTMLElement | null;\n while (currentElement) {\n processingQueue.push(currentElement);\n if (DOM_PROTOTYPE_BRIDGE.getLocalName(currentElement) === 'template') {\n executeSanitizationWalk((currentElement as HTMLTemplateElement).content);\n }\n currentElement = walker.nextNode() as HTMLElement | null;\n }\n\n for (const node of processingQueue) {\n applySecurityPolicy(node);\n neutralizeDangerousNode(node);\n }\n}\n\n// --- Public APIs ---\n\n/**\n * Sanitizes a raw HTML string by stripping dangerous tags, attributes, and protocols.\n *\n * When to use:\n * - Before injecting untrusted HTML strings into the DOM via $.fn.atomHtml.\n * - When processing user-provided markup to prevent XSS.\n *\n * @param html The raw HTML string to cleanse.\n * @returns A sanitized HTML string safe for browser execution.\n *\n * @example\n * const dirty = '<img src=x onerror=alert(1)>';\n * const clean = sanitizeHtml(dirty);\n * // Result: <img src=\"x\" data-unsafe-attr=\"onerror\">\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n // Use a fresh template per call to avoid complex state management.\n const template = document.createElement('template');\n template.innerHTML = String(html);\n executeSanitizationWalk(template.content);\n return template.innerHTML;\n}\n\n/**\n * Checks if a specific attribute/value pair contains dangerous content or protocols.\n *\n * When to use:\n * - To validate individual attribute updates in $.fn.atomAttr.\n *\n * @param attribute The name of the HTML attribute (e.g., 'href').\n * @param value The value to validate.\n * @returns True if the value contains a dangerous protocol or script context.\n *\n * @example\n * isDangerousUrl('href', 'javascript:alert(1)'); // true\n * isDangerousUrl('src', 'https://safe.com/img.png'); // false\n */\nexport const isDangerousUrl = (attribute: string, value: string): boolean => {\n const lowerAttribute = attribute.toLowerCase();\n if (!URL_ATTRIBUTES.includes(lowerAttribute)) return false;\n\n const normalizedValue = normalizeValue(value);\n return lowerAttribute === 'srcdoc'\n ? REGEX_DANGEROUS_SNIFFER.test(normalizedValue)\n : isDangerousProtocol(normalizedValue);\n};\n\n/**\n * Checks if a CSS value contains dangerous expressions or forbidden protocols.\n *\n * When to use:\n * - To validate dynamic style updates in $.fn.atomCss.\n *\n * @param value The CSS property value to validate.\n * @returns True if the value contains patterns like expression() or url(javascript:...).\n *\n * @example\n * isDangerousCssValue('url(javascript:alert(1))'); // true\n * isDangerousCssValue('red'); // false\n */\nexport const isDangerousCssValue = (value: string): boolean => {\n const cleanCss = normalizeValue(value).replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n return CSS_DANGER_PATTERNS.some((pattern) => pattern.test(cleanCss));\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { DANGEROUS_PROPS, ERROR_MESSAGES, LOG_PREFIXES, VALID_INPUT_TAGS } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\n\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml } from '@/utils/sanitize';\n\n/** Converts kebab-case CSS properties to camelCase. */\nfunction getCamelCase(property: string): string {\n return property.includes('-')\n ? property.replace(/-./g, (match) => match[1]!.toUpperCase())\n : property;\n}\n\n/**\n * Security: Blocks 'on*' event attributes and dangerous properties like innerHTML\n * from being bound as standard attributes/props to prevent XSS.\n */\nfunction isSafeBinding(name: string, isProperty: boolean): boolean {\n const lowerName = name.toLowerCase();\n if (lowerName.startsWith('on')) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`);\n return false;\n }\n if (isProperty && (DANGEROUS_PROPS as readonly string[]).includes(name)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)}`);\n return false;\n }\n return true;\n}\n\n/** Syncs element text content with a reactive source. */\nexport function bindText<T = unknown>(\n element: HTMLElement,\n value: AsyncReactiveValue<T>,\n formatter?: (value: T) => string\n): void {\n registerReactiveEffect(\n element,\n value,\n (currentValue) => {\n const textContent = formatter ? formatter(currentValue) : String(currentValue ?? '');\n if (element.textContent !== textContent) element.textContent = textContent;\n },\n 'text'\n );\n}\n\n/**\n * Binds sanitized HTML content to an element.\n * Note: Descendant bindings are automatically cleaned up before re-writing innerHTML.\n */\nexport function bindHtml(element: HTMLElement, value: AsyncReactiveValue<string>): void {\n let lastHtml: string | null = null;\n\n registerReactiveEffect(\n element,\n value,\n (currentValue) => {\n const sanitizedHtml = sanitizeHtml(currentValue as string);\n if (lastHtml !== sanitizedHtml) {\n registry.cleanupDescendants(element);\n element.innerHTML = sanitizedHtml;\n lastHtml = sanitizedHtml;\n }\n },\n 'html'\n );\n}\n\n/**\n * Manages element classes reactively using a boolean map.\n * Case handling: Correctly removes tokens only if no other active class definition in the map requires them.\n */\nexport function bindClass(\n element: HTMLElement,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokenMap: Record<string, string[]> = {};\n let lastActiveTokens = new Set<string>();\n\n for (const key of Object.keys(classMap)) {\n const trimmedKey = key.trim();\n tokenMap[key] = trimmedKey.includes(' ')\n ? trimmedKey.split(/\\s+/).filter(Boolean)\n : [trimmedKey];\n }\n\n registerMapEffect(\n element,\n classMap,\n (states) => {\n const currentActiveTokens = new Set<string>();\n for (const [key, isActive] of Object.entries(states)) {\n if (isActive) {\n for (const token of tokenMap[key]!) {\n currentActiveTokens.add(token);\n }\n }\n }\n\n // Add new tokens\n for (const token of currentActiveTokens) {\n if (!lastActiveTokens.has(token)) {\n element.classList.add(token);\n }\n }\n\n // Remove tokens that are no longer active\n for (const token of lastActiveTokens) {\n if (!currentActiveTokens.has(token)) {\n element.classList.remove(token);\n }\n }\n\n lastActiveTokens = currentActiveTokens;\n },\n 'class'\n );\n}\n\n/** Reactively updates inline styles while blocking potentially harmful CSS values. */\nexport function bindCss(element: HTMLElement, cssMap: Record<string, CssValue>): void {\n const style = element.style as unknown as Record<string, string | null>;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const metadataMap: Record<string, { camelCase: string; unit: string }> = {};\n const previousValues: Record<string, string | null> = {};\n\n for (const [property, value] of Object.entries(cssMap)) {\n const [source, unit] = Array.isArray(value) ? value : [value, ''];\n reactiveMap[property] = source;\n metadataMap[property] = { camelCase: getCamelCase(property), unit };\n }\n\n registerMapEffect(\n element,\n reactiveMap,\n (states) => {\n for (const [property, value] of Object.entries(states)) {\n const metadata = metadataMap[property]!;\n const valueString = metadata.unit ? `${value}${metadata.unit}` : String(value);\n\n if (previousValues[property] !== valueString) {\n if (!isDangerousCssValue(valueString)) {\n style[metadata.camelCase] = valueString;\n }\n previousValues[property] = valueString;\n }\n }\n },\n 'css'\n );\n}\n\n/**\n * Syncs DOM attributes.\n * Note: Handles specific logic for boolean attributes (like 'disabled')\n * and protocol-validation for URLs (href/src).\n */\nexport function bindAttr(\n element: HTMLElement,\n attrMap: Record<string, AsyncReactiveValue<PrimitiveValue>>\n): void {\n const safeEntries = Object.entries(attrMap).filter(([name]) => isSafeBinding(name, false));\n const safeMap = Object.fromEntries(safeEntries);\n const metadataMap: Record<string, { isAria: boolean }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const [name] of safeEntries) {\n metadataMap[name] = { isAria: name.toLowerCase().startsWith('aria-') };\n cache[name] = element.getAttribute(name);\n }\n\n registerMapEffect(\n element,\n safeMap,\n (states) => {\n for (const [name, value] of Object.entries(states)) {\n const metadata = metadataMap[name]!;\n const primitiveValue = value as PrimitiveValue;\n\n if (primitiveValue == null || (primitiveValue === false && !metadata.isAria)) {\n if (cache[name] !== null) element.removeAttribute(name);\n cache[name] = null;\n continue;\n }\n\n const newValue =\n primitiveValue === true ? (metadata.isAria ? 'true' : name) : String(primitiveValue);\n if (isDangerousUrl(name, newValue)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (cache[name] !== newValue) {\n element.setAttribute(name, newValue);\n cache[name] = newValue;\n }\n }\n },\n 'attr'\n );\n}\n\n/** Directly maps reactive values to DOM element properties with URL validation. */\nexport function bindProp(\n element: HTMLElement,\n propMap: Record<string, AsyncReactiveValue<unknown>>\n): void {\n const target = element as unknown as Record<string, unknown>;\n const safeEntries = Object.entries(propMap).filter(([name]) => isSafeBinding(name, true));\n const safeMap = Object.fromEntries(safeEntries);\n const previousValues: Record<string, unknown> = {};\n\n registerMapEffect(\n element,\n safeMap,\n (states) => {\n for (const [name, value] of Object.entries(states)) {\n if (previousValues[name] === value) continue;\n\n if (typeof value === 'string' && isDangerousUrl(name, value)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n target[name] = value;\n previousValues[name] = value;\n }\n },\n 'prop'\n );\n}\n\n/** Toggles display style between 'none' and its original state. */\nexport function bindVisibility(\n element: HTMLElement,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n let lastDisplay = element.style.display === 'none' ? '' : element.style.display;\n\n registerReactiveEffect(\n element,\n condition,\n (value) => {\n const isVisible = invert !== !!value;\n if (isVisible) {\n if (element.style.display === 'none') {\n element.style.display = lastDisplay;\n }\n } else if (element.style.display !== 'none') {\n lastDisplay = element.style.display;\n element.style.display = 'none';\n }\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/** Entry point for input/value bindings; delegates to the InputBinding engine. */\nexport function bindVal(\n element: HTMLElement,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tagName = element.tagName.toLowerCase();\n if (!(VALID_INPUT_TAGS as readonly string[]).includes(tagName)) {\n console.warn(\n `${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.BINDING.INVALID_INPUT_ELEMENT(tagName)}`\n );\n return;\n }\n const { reactiveEffect, cleanup } = applyInputBinding($(element), atom, options);\n registry.trackEffect(element, reactiveEffect);\n registry.trackCleanup(element, cleanup);\n}\n\n/**\n * Requirement: Radio buttons in the same name group don't fire 'change'\n * when they are automatically unchecked by another radio selection.\n * We manually trigger a sync for the rest of the group.\n */\nfunction synchronizeRadioGroup(element: HTMLInputElement): void {\n if (element.type === 'radio' && element.name) {\n (element.form ? $(element.form) : $(document))\n .find(`input[type=\"radio\"][name=\"${$.escapeSelector(element.name)}\"]`)\n .not(element)\n .trigger('change.atomRadioSync');\n }\n}\n\n/** Specialized two-way binding for checkbox and radio 'checked' states. */\nexport function bindChecked(element: HTMLElement, atom: WritableAtom<boolean>): void {\n if (!(element instanceof HTMLInputElement)) {\n console.warn(`${LOG_PREFIXES.BINDING} atomChecked called on non-input element`);\n return;\n }\n const inputElement = element;\n const $element = $(inputElement);\n\n const changeHandler = () => {\n if (atom.peek() !== inputElement.checked) {\n atom.value = inputElement.checked;\n synchronizeRadioGroup(inputElement);\n }\n };\n (changeHandler as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $element.on('change change.atomRadioSync', changeHandler);\n registry.trackCleanup(inputElement, () =>\n $element.off('change change.atomRadioSync', changeHandler)\n );\n\n registry.trackEffect(\n inputElement,\n effect(() => {\n const isChecked = !!atom.value;\n untracked(() => {\n if (inputElement.checked !== isChecked) {\n inputElement.checked = isChecked;\n debug.domUpdated(LOG_PREFIXES.BINDING, inputElement, 'checked', isChecked);\n if (isChecked) synchronizeRadioGroup(inputElement);\n }\n });\n })\n );\n}\n\n/** Registers flat event maps with automatic lifecycle cleanup. */\nexport function bindEvents(\n element: HTMLElement,\n eventMap: NonNullable<BindingOptions['on']>\n): void {\n const $element = $(element);\n $element.on(eventMap);\n registry.trackCleanup(element, () => $element.off(eventMap));\n}\n\n/** Registers a single event listener with automatic lifecycle cleanup. */\nexport function bindOn(\n element: HTMLElement,\n event: string,\n handler: (event: JQuery.TriggeredEvent) => void\n): void {\n const $element = $(element);\n $element.on(event, handler);\n registry.trackCleanup(element, () => $element.off(event, handler));\n}\n","import {\n atomLens,\n effect,\n type Paths,\n type PathValue,\n untracked,\n type WritableAtom,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { INTERNAL_HANDLER } from '@/core/jquery-patch';\nimport { registry } from '@/core/registry';\nimport type { FormOptions } from '@/types';\nimport { bindVal } from './unified';\n\ninterface FieldEntry {\n /** Individual atom (lens) for this specific field. */\n atom: WritableAtom<unknown>;\n\n name: string;\n\n /** Reference count to determine when to safely dispose of the field effect. */\n refCount: number;\n}\n\nconst SELECTOR = 'input, select, textarea';\n\n/**\n * Engine for synchronizing a complex object (Atom) with a flat HTML Form.\n *\n * Design Intent:\n * - Follows Rob Pike's rules: Uses simple data structures (`atomLens`) over fancy dual-sync algorithms.\n * - Supports nested object paths through standard form 'name' attributes.\n * - Observes DOM mutations to handle form fields added or removed after initialization.\n */\nclass FormBinder<T extends object> {\n private fieldMap = new Map<string, FieldEntry>();\n\n private fields: FieldEntry[] = [];\n\n private elementNames = new WeakMap<Element, string>();\n\n constructor(\n private form: HTMLFormElement,\n private atom: WritableAtom<T>,\n private options: FormOptions<unknown> = {}\n ) {\n this.init();\n }\n\n private init(): void {\n this.bindElement(this.form);\n this.setupObserver();\n }\n\n /** Scans an element or its descendants for bindable form controls. */\n public bindElement(el: Element): void {\n const targets = el.matches?.(SELECTOR)\n ? [el]\n : (el as HTMLElement).querySelectorAll?.(SELECTOR) || [];\n for (let i = 0, len = targets.length; i < len; i++) {\n this.bindControl(targets[i] as Element);\n }\n }\n\n /** Configures a single form control with two-way binding. */\n private bindControl(el: Element): void {\n if (\n !(\n el instanceof HTMLInputElement ||\n el instanceof HTMLSelectElement ||\n el instanceof HTMLTextAreaElement\n )\n ) {\n return;\n }\n const control = el;\n const name = control.name;\n if (!name) return;\n\n // Handle 'name' attribute changes reactively\n const oldName = this.elementNames.get(control);\n if (oldName !== undefined && oldName !== name) registry.cleanup(control);\n\n if (this.elementNames.has(control) && oldName === name) return;\n\n const entry = this.acquireField(name);\n this.elementNames.set(control, name);\n\n registry.trackCleanup(control, () => this.releaseField(control, name));\n\n if (\n control instanceof HTMLInputElement &&\n (control.type === 'radio' || control.type === 'checkbox')\n ) {\n this.bindToggle(control, entry.atom, control.value, control.type === 'checkbox');\n } else {\n bindVal(control, entry.atom, this.options);\n }\n }\n\n /** Specialized internal logic for radio buttons and multi-value checkboxes. */\n private bindToggle(\n el: HTMLInputElement,\n atom: WritableAtom<unknown>,\n val: string,\n isCheck: boolean\n ): void {\n const handler = () => {\n const curr = atom.peek();\n if (isCheck && Array.isArray(curr)) {\n // Multi-checkbox mode: manages an array of selected values\n const s = new Set(curr.map(String));\n el.checked ? s.add(val) : s.delete(val);\n atom.value = Array.from(s);\n } else {\n atom.value = isCheck ? el.checked : val;\n }\n };\n\n (handler as unknown as { [INTERNAL_HANDLER]: boolean })[INTERNAL_HANDLER] = true;\n $(el).on('change', handler);\n registry.trackCleanup(el, () => $(el).off('change', handler));\n\n registry.trackEffect(\n el,\n effect(() => {\n const v = atom.value;\n const checked = isCheck\n ? Array.isArray(v)\n ? v.some((x) => String(x) === val)\n : !!v\n : String(v) === val;\n if (el.checked !== checked) el.checked = checked;\n })\n );\n }\n\n /**\n * Resolves or creates a field-level lens and binds it to the root object.\n */\n private acquireField(name: string): FieldEntry {\n let entry = this.fieldMap.get(name);\n if (entry) {\n entry.refCount++;\n return entry;\n }\n\n // Convert flat names (e.g., 'user.info[0]') into dot paths\n const dotPath = name.replace(/\\[(\\w+)\\]/g, '.$1').replace(/^\\./, '');\n\n const baseLens = atomLens(this.atom, dotPath as Paths<T>);\n const customLens = Object.create(baseLens);\n\n // Explicitly destructure options to avoid 'this' context issues in the setter\n const { transform, onChange } = this.options;\n\n Object.defineProperty(customLens, 'value', {\n get() {\n return baseLens.value;\n },\n set(val: unknown) {\n const transformed = transform ? transform(name, val) : val;\n baseLens.value = transformed as PathValue<T, Paths<T>>;\n if (onChange) untracked(() => onChange(name, transformed));\n },\n });\n\n entry = { atom: customLens as WritableAtom<unknown>, name, refCount: 1 };\n\n this.fieldMap.set(name, entry);\n this.fields.push(entry);\n return entry;\n }\n\n private releaseField(el: Element, name: string): void {\n const entry = this.fieldMap.get(name);\n if (entry && --entry.refCount <= 0) {\n const idx = this.fields.indexOf(entry);\n if (idx !== -1) this.fields.splice(idx, 1);\n const disposableAtom = entry.atom as Partial<{ dispose: () => void }>;\n if (typeof disposableAtom.dispose === 'function') {\n disposableAtom.dispose();\n }\n this.fieldMap.delete(name);\n }\n registry.cleanup(el);\n }\n\n /** Monitors the form DOM for structural changes (AJAX loads, dynamic inputs). */\n private setupObserver(): void {\n const observer = new MutationObserver((ms) => {\n for (let i = 0, len = ms.length; i < len; i++) {\n const m = ms[i]!;\n if (m.type === 'childList') {\n for (let j = 0; j < m.addedNodes.length; j++) {\n const node = m.addedNodes[j]!;\n if (node.nodeType === 1) this.bindElement(node as Element);\n }\n } else if (m.attributeName === 'name') {\n // Re-bind if a 'name' attribute is changed on the fly\n this.bindElement(m.target as Element);\n }\n }\n });\n\n observer.observe(this.form, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['name'],\n });\n\n registry.trackCleanup(this.form, () => observer.disconnect());\n }\n}\n\n/**\n * Initializes a reactive whole-form binding.\n *\n * @param form The target form element.\n * @param atom A writable atom holding the form's state object.\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): void {\n new FormBinder(form, atom, options);\n}\n","/**\n * Iterates through a jQuery collection and executes the callback only for\n * valid HTMLElement (nodeType 1) nodes.\n *\n * Why: jQuery collections can contain text or comment nodes; this utility\n * provides a safe, element-only iteration path for binding setup.\n */\nexport function atomEachElement(jq: JQuery, fn: (el: HTMLElement) => void): JQuery {\n for (let i = 0, len = jq.length; i < len; i++) {\n const node = jq[i];\n\n if (node?.nodeType === 1) {\n fn(node as HTMLElement);\n }\n }\n return jq;\n}\n\n/**\n * Normalizes binding arguments that can be either a single reactive value or a\n * [Value, Option] tuple (e.g., .atomCss('prop', [atom, 'px'])).\n *\n * Logic:\n * Uses heuristics (checking for functions or non-atom objects) to determine if\n * the input array represents a configuration tuple or just an array-based data value.\n */\nexport function unpack<T, O>(val: T | [T, O]): [T, O?] {\n if (!Array.isArray(val) || val.length !== 2) return [val as T];\n\n const second = val[1];\n\n // Logic: Tuples usually contain a formatter function or a static options object.\n // We explicitly check that the second element isn't itself a reactive 'atom' or 'promise'.\n const isTuple =\n typeof second === 'function' ||\n (second !== null && typeof second === 'object' && !('value' in second) && !('then' in second));\n\n return isTuple ? (val as [T, O]) : [val as T];\n}\n","import $ from 'jquery';\nimport { bindForm } from '@/bindings/form';\nimport {\n bindAttr,\n bindChecked,\n bindClass,\n bindCss,\n bindEvents,\n bindHtml,\n bindOn,\n bindProp,\n bindText,\n bindVal,\n bindVisibility,\n} from '@/bindings/unified';\nimport { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport { atomEachElement, unpack } from '@/core/dom';\nimport { registry } from '@/core/registry';\nimport type {\n AsyncReactiveValue,\n BindingOptions,\n CssBindings,\n CssValue,\n FormOptions,\n PrimitiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nimport { debug } from '@/utils/debug';\n\n/**\n * Resolves a single key-value pair or a map into a uniform map.\n * Used to simplify multiple binding methods.\n */\nfunction resolveMap<V>(\n keyOrMap: string | Record<string, V>,\n value: V | undefined,\n methodName: string,\n errorMsg: string = ERROR_MESSAGES.BINDING.MISSING_SOURCE(methodName)\n): Record<string, V> | null {\n const map =\n typeof keyOrMap === 'string' ? (value === undefined ? null : { [keyOrMap]: value }) : keyOrMap;\n\n if (!map) {\n console.warn(`${LOG_PREFIXES.BINDING} ${errorMsg}`);\n return null;\n }\n return map;\n}\n\n/**\n * Binds an atom's value to the text content of the matching elements.\n *\n * @example\n * $('.count').atomText(counterAtom, (v) => `Current: ${v}`);\n */\n$.fn.atomText = function <T>(source: AsyncReactiveValue<T>, formatter?: (v: T) => string): JQuery {\n return atomEachElement(this, (el) => bindText(el, source, formatter));\n};\n\n/**\n * Binds an atom's value to the innerHTML of the matching elements.\n * Warning: Ensure the source data is trusted to prevent XSS.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (el) => bindHtml(el, source));\n};\n\n/**\n * Reactively toggles CSS classes.\n *\n * Supports two patterns:\n * 1. Single class: .atomClass('active', conditionAtom)\n * 2. Class map: .atomClass({ 'is-loading': loadingAtom, 'is-hidden': hiddenAtom })\n */\n$.fn.atomClass = function (\n this: JQuery,\n classNameOrMap: string | Record<string, AsyncReactiveValue<boolean>>,\n condition?: AsyncReactiveValue<boolean>\n): JQuery {\n const map = resolveMap(\n classNameOrMap,\n condition,\n 'atomClass',\n ERROR_MESSAGES.BINDING.MISSING_CONDITION('atomClass')\n );\n return map ? atomEachElement(this, (el) => bindClass(el, map)) : this;\n};\n\n/**\n * Reactively updates CSS properties.\n *\n * Supports two patterns:\n * 1. Single property: .atomCss('opacity', valueAtom)\n * 2. Property map: .atomCss({ width: '100px', height: heightAtom })\n */\n$.fn.atomCss = function (\n this: JQuery,\n propOrMap: string | CssBindings,\n source?: AsyncReactiveValue<string | number>,\n unit?: string\n): JQuery {\n const value: CssValue | undefined =\n source !== undefined && unit ? [source as AsyncReactiveValue<number>, unit] : source;\n const map = resolveMap<CssValue>(propOrMap, value, 'atomCss');\n\n return map ? atomEachElement(this, (el) => bindCss(el, map as CssBindings)) : this;\n};\n\n/** Reactively updates DOM attributes based on atom changes. */\n$.fn.atomAttr = function (\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<PrimitiveValue>>,\n source?: AsyncReactiveValue<PrimitiveValue>\n): JQuery {\n const map = resolveMap(nameOrMap, source, 'atomAttr');\n return map ? atomEachElement(this, (el) => bindAttr(el, map)) : this;\n};\n\n/** Reactively updates DOM properties (e.g., 'disabled', 'readOnly'). */\n$.fn.atomProp = function <T>(\n this: JQuery,\n nameOrMap: string | Record<string, AsyncReactiveValue<T>>,\n source?: AsyncReactiveValue<T>\n): JQuery {\n const map = resolveMap(nameOrMap, source, 'atomProp');\n return map\n ? atomEachElement(this, (el) =>\n bindProp(el, map as Record<string, AsyncReactiveValue<unknown>>)\n )\n : this;\n};\n\n/** Toggles visibility (display: none) when the condition is true. */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (el) => bindVisibility(el, condition, false));\n};\n\n/** Hides the element (display: none) when the condition is true. */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (el) => bindVisibility(el, condition, true));\n};\n\n/**\n * Two-way binding for form input values.\n * Automatically synchronizes the input state with the writable atom.\n */\n$.fn.atomVal = function <T>(atom: WritableAtom<T>, options: ValOptions<T> = {}): JQuery {\n return atomEachElement(this, (el) =>\n bindVal(el, atom as WritableAtom<unknown>, options as ValOptions<unknown>)\n );\n};\n\n/** Two-way binding for checkboxes and radio buttons. */\n$.fn.atomChecked = function (atom: WritableAtom<boolean>): JQuery {\n return atomEachElement(this, (el) => bindChecked(el, atom));\n};\n\n/**\n * Orchestrates two-way binding for an entire form.\n * Maps form fields to properties of a reactive object.\n */\n$.fn.atomForm = function <T extends object>(\n atom: WritableAtom<T>,\n options: FormOptions<T> = {}\n): JQuery {\n return atomEachElement(this, (el) => {\n if (el instanceof HTMLFormElement) {\n bindForm(el, atom as WritableAtom<object>, options as unknown as FormOptions<unknown>);\n } else {\n debug.warn(LOG_PREFIXES.BINDING, 'Skipping non-Form element for atomForm');\n }\n });\n};\n\n/** Configures a standard event listener with automatic cleanup. */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (el) => bindOn(el, event, handler));\n};\n\ninterface BindingTask {\n key: keyof BindingOptions<unknown>;\n run: (el: HTMLElement, val: unknown) => void;\n}\n\n/**\n * Registry of available binding tasks for the unified .atomBind() method.\n * Note: Keeps the order of execution consistent during multi-binding.\n */\nconst BINDING_TASKS: BindingTask[] = [\n {\n key: 'text',\n run: (el, v) =>\n bindText(el, ...(unpack(v) as [AsyncReactiveValue<unknown>, (v: unknown) => string])),\n },\n { key: 'html', run: (el, v) => bindHtml(el, v as AsyncReactiveValue<string>) },\n {\n key: 'class',\n run: (el, v) => bindClass(el, v as Record<string, AsyncReactiveValue<boolean>>),\n },\n { key: 'css', run: (el, v) => bindCss(el, v as CssBindings) },\n {\n key: 'attr',\n run: (el, v) => bindAttr(el, v as Record<string, AsyncReactiveValue<PrimitiveValue>>),\n },\n {\n key: 'prop',\n run: (el, v) => bindProp(el, v as Record<string, AsyncReactiveValue<unknown>>),\n },\n { key: 'show', run: (el, v) => bindVisibility(el, v as AsyncReactiveValue<boolean>, false) },\n { key: 'hide', run: (el, v) => bindVisibility(el, v as AsyncReactiveValue<boolean>, true) },\n {\n key: 'val',\n run: (el, v) => bindVal(el, ...(unpack(v) as [WritableAtom<unknown>, ValOptions<unknown>])),\n },\n { key: 'checked', run: (el, v) => bindChecked(el, v as WritableAtom<boolean>) },\n {\n key: 'form',\n run: (el, v) => {\n if (el instanceof HTMLFormElement) {\n bindForm(el, ...(unpack(v) as [WritableAtom<object>, FormOptions<unknown>]));\n }\n },\n },\n { key: 'on', run: (el, v) => bindEvents(el, v as Record<string, (e: JQuery.Event) => void>) },\n];\n\n/**\n * Unified entry point for declaring multiple reactive bindings in a single call.\n *\n * @example\n * $('.btn').atomBind({\n * text: labelAtom,\n * class: { 'is-primary': primaryAtom },\n * on: { click: handleClick }\n * });\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n const opt = options as Record<string, unknown>;\n let hasTasks = false;\n\n for (let i = 0, len = BINDING_TASKS.length; i < len; i++) {\n if (opt[BINDING_TASKS[i]!.key] !== undefined) {\n hasTasks = true;\n break;\n }\n }\n\n if (!hasTasks) return this;\n\n return atomEachElement(this, (el) => {\n for (let i = 0, len = BINDING_TASKS.length; i < len; i++) {\n const task = BINDING_TASKS[i]!;\n const val = opt[task.key];\n if (val !== undefined) {\n task.run(el, val);\n }\n }\n });\n};\n\n/** Manually destroys all reactive bindings associated with the elements in the collection. */\n$.fn.atomUnbind = function (this: JQuery): JQuery {\n return atomEachElement(this, (el) => registry.cleanupTree(el));\n};\n","import $ from 'jquery';\nimport { registry } from '@/core/registry';\n\n/**\n * Normalizes an Element or a jQuery collection into a standard jQuery object.\n */\nexport function wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n/**\n * Manages the `data-atom-key` attribute used for list reconciliation.\n *\n * Note: This key allows the diffing algorithm to identify and reuse DOM nodes\n * across different rendering cycles.\n */\nexport function setAtomKey(node: Element | Node | JQuery, key: string | null): void {\n if (node instanceof Element) {\n if (key === null) node.removeAttribute('data-atom-key');\n else node.setAttribute('data-atom-key', key);\n } else if (!(node as Node).nodeType) {\n // Handling jQuery collections\n const elOrJq = node as JQuery;\n for (let i = 0, len = elOrJq.length; i < len; i++) {\n const el = elOrJq[i];\n if (el instanceof Element) {\n if (key === null) el.removeAttribute('data-atom-key');\n else el.setAttribute('data-atom-key', key);\n }\n }\n }\n}\n\n/**\n * Triggers the mandatory teardown for reactive bindings associated with the target nodes.\n *\n * Important:\n * This must be called before an element is permanently removed or replaced\n * to prevent memory leaks from stale reactive effects in the registry.\n */\nexport function cleanupNodes(node: Element | JQuery): void {\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n for (let j = 0, nLen = (node as JQuery).length; j < nLen; j++) {\n const el = (node as JQuery)[j];\n if (el instanceof Element) registry.cleanupTree(el);\n }\n }\n}\n","import type { EffectObject, ListKey } from '@/types';\nimport { setAtomKey } from './utils';\n\n/**\n * Manages the internal state and lifecycle for $.fn.atomList.\n *\n * Responsibilities:\n * - Stores previous state (Keys, Items, Nodes) for the diffing algorithm.\n * - Tracks elements undergoing asynchronous removal (animations) to prevent conflicts.\n * - Handles container-level event cleanup and memory management.\n */\nexport class ListContext<T> {\n /** Reference storage for diffing and DOM reuse */\n oldKeys: ListKey[] = [];\n\n oldItems: T[] = [];\n\n oldNodes: (Element | JQuery | undefined)[] = [];\n\n /**\n * Tracks keys of items currently in the middle of a removal animation.\n * Reason: Prevents the reconciliation logic from attempting to re-add or manipulate\n * an element that is still being transitioned out of the DOM.\n */\n readonly removingKeys = new Set<ListKey>();\n\n /** Cached element to display when the list is empty */\n $emptyEl: JQuery | null = null;\n\n /** Fast lookup map to find the previous index of a key during diffing */\n readonly keyToIndex = new Map<ListKey, number>();\n\n /** The parent Effect. If disposed, all DOM manipulations must cease immediately. */\n fx?: EffectObject;\n\n constructor(\n public readonly $container: JQuery,\n public readonly containerSelector: string,\n public readonly onRemove: (($el: JQuery) => Promise<void> | void) | undefined\n ) {}\n\n /**\n * Orchestrates the removal of an element, respecting the optional `onRemove` hook.\n *\n * Constraints:\n * 1. Aborts if the effect has been disposed.\n * 2. Aborts if the element was reclaimed by another binding (checked via `data-atom-key`).\n */\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n // Reason: If the effect is disposed or the element has been re-assigned to a new key\n // during the async delay, we must not remove it from the DOM.\n if (this.fx?.isDisposed) return;\n\n if ($el[0] instanceof Element && $el[0].hasAttribute('data-atom-key')) return;\n\n if ($el[0]?.isConnected) $el.remove();\n this.removingKeys.delete(k);\n };\n\n const res = this.onRemove?.($el);\n if (res instanceof Promise) res.then(commit, commit);\n else commit();\n }\n\n /**\n * Marks an item for removal and initiates the teardown process.\n *\n * @example\n * context.removeItem('item_id_1', $itemElement);\n */\n removeItem(k: ListKey, $el: JQuery): void {\n // Note: Clear the atom-key immediately so rendering cycles don't treat this\n // element as \"active\" while the removal animation is pending.\n setAtomKey($el, null);\n this.removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n /**\n * Clears all references and unbinds container events.\n * Crucial for preventing memory leaks in large, frequently updated lists.\n */\n dispose(): void {\n this.removingKeys.clear();\n this.oldKeys = [];\n this.oldItems = [];\n this.oldNodes = [];\n this.keyToIndex.clear();\n this.$emptyEl?.remove();\n\n // Use namespaced off() to avoid removing user-defined handlers on the same container\n this.$container.off('.atomList');\n }\n}\n","import type { ListKey, ListKeyFn, ListOptions } from '@/types';\n\nexport type { ListKey, ListKeyFn };\n\n/**\n * Lifecycle flags representing the status of an item during reconciliation.\n *\n * Logic:\n * - Unchanged: Perfect match in both key and data; no action needed.\n * - Existing: Key matched, but position or data might need a patch/update.\n * - New: The item is completely new to this list.\n * - ForceReplace: Key matched, but data changed and no update handler is available\n * to patch the node, requiring a full re-create.\n */\nexport const ItemState = {\n Unchanged: 0,\n\n Existing: 1 << 0,\n\n New: 1 << 1,\n\n ForceReplace: 1 << 2,\n} as const;\n\nexport type ItemState = (typeof ItemState)[keyof typeof ItemState];\n\n/**\n * The 'reconciliation plan' generated by the diffing algorithm.\n *\n * Provides index-based maps and metadata to the DOM synchronizer to\n * perform the minimum necessary DOM manipulations.\n */\nexport interface PreparedDiff<T> {\n newKeys: ListKey[];\n newItems: T[];\n newKeySet: Set<ListKey>;\n newIndices: number[];\n newStates: ItemState[];\n newNodes: (Element | JQuery | undefined)[];\n\n /** List of items requiring asynchronous DOM creation or HTML parsing */\n toRender: { key: ListKey; item: T; index: number }[];\n\n /** Indices defining the \"dirty\" middle section after prefix/suffix matching */\n startIndex: number;\n oldEndIndex: number;\n newEndIndex: number;\n}\n\n/**\n * Internal collection of hooks and callbacks used during the node placement phase.\n */\nexport interface PlaceCallbacks<T> {\n bind?: (($el: JQuery, item: T, index: number) => void) | undefined;\n update?: (($el: JQuery, item: T, index: number) => void) | undefined;\n onAdd?: (($el: JQuery) => void) | undefined;\n onRemove?: ListOptions<T>['onRemove'] | undefined;\n events?: ListOptions<T>['events'] | undefined;\n}\n","import { ERROR_MESSAGES, LOG_PREFIXES } from '@/constants';\nimport type { ListKey, ListKeyFn, ListOptions } from '@/types';\nimport { shallowEqual } from '@/utils';\nimport { debug } from '@/utils/debug';\nimport type { ListContext } from './context';\nimport { ItemState, type PreparedDiff } from './types';\n\n/**\n * Prepares the reconciliation plan (diff) between the old list state and the new items.\n *\n * This function identifies which DOM nodes can be reused, which are new,\n * and which need a forced replacement based on key/identity changes.\n *\n * Performance: Uses a double-ended diffing strategy (prefix/suffix matching)\n * to skip unchanged elements at both ends, isolating only the modified middle section.\n */\nexport function buildIndices<T>(\n ctx: ListContext<T>,\n items: T[],\n itemCount: number,\n getKey: ListKeyFn<T>,\n update: ListOptions<T>['update'],\n isEqual: ListOptions<T>['isEqual']\n): PreparedDiff<T> {\n const { oldKeys, oldItems, oldNodes, removingKeys, keyToIndex } = ctx;\n const oldLen = oldKeys.length;\n const eq = isEqual || shallowEqual;\n\n let startIndex = 0,\n oldEndIndex = oldLen - 1,\n newEndIndex = itemCount - 1;\n\n const newKeySet = new Set<ListKey>();\n const newKeys: ListKey[] = new Array(itemCount);\n const newItems: T[] = new Array(itemCount);\n const newNodes: (Element | JQuery | undefined)[] = new Array(itemCount);\n const newStates: ItemState[] = new Array(itemCount);\n const newIndices: number[] = new Array(itemCount);\n const toRender: { key: ListKey; item: T; index: number }[] = [];\n\n // Optimization Step 1: Skip unchanged prefix\n // Reason: Fast-forward through items that haven't moved or changed at the start.\n while (startIndex <= oldEndIndex && startIndex <= newEndIndex) {\n const item = items[startIndex]!,\n k = getKey(item, startIndex);\n if (oldKeys[startIndex] !== k || !eq(oldItems[startIndex]!, item) || !oldNodes[startIndex])\n break;\n keyToIndex.set(k, startIndex++);\n }\n\n // Optimization Step 2: Skip unchanged suffix\n // Reason: Isolate the \"dirty\" middle range by matching unchanged items from the end.\n while (oldEndIndex >= startIndex && newEndIndex >= startIndex) {\n const item = items[newEndIndex]!,\n k = getKey(item, newEndIndex);\n if (oldKeys[oldEndIndex] !== k || !eq(oldItems[oldEndIndex]!, item) || !oldNodes[oldEndIndex])\n break;\n keyToIndex.set(k, newEndIndex--);\n oldEndIndex--;\n }\n\n // Process skip ranges as Unchanged\n for (let i = 0; i < startIndex; i++) {\n const k = oldKeys[i]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[i]!;\n newStates[i] = ItemState.Unchanged;\n newIndices[i] = i;\n newKeySet.add(k);\n }\n for (let j = oldLen - 1, i = itemCount - 1; i > newEndIndex; i--, j--) {\n const k = oldKeys[j]!;\n newKeys[i] = k;\n newItems[i] = items[i]!;\n newNodes[i] = oldNodes[j]!;\n newStates[i] = ItemState.Unchanged;\n newIndices[i] = j;\n newKeySet.add(k);\n }\n\n // Map remaining old keys for fast lookup during middle-section diffing\n const oldIndexMap = new Map<ListKey, number>();\n for (let i = startIndex; i <= oldEndIndex; i++) oldIndexMap.set(oldKeys[i]!, i);\n\n // Process the \"dirty\" middle section\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!,\n k = getKey(item, i);\n newKeys[i] = k;\n newItems[i] = item;\n keyToIndex.set(k, i);\n\n if (newKeySet.has(k)) {\n debug.warn(LOG_PREFIXES.LIST, ERROR_MESSAGES.LIST.DUPLICATE_KEY(k, i));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const foundIdx = oldIndexMap.get(k);\n // Caution: If a key is in removingKeys, its DOM node is currently animating out.\n // We must treat it as a new item rather than re-using the decaying DOM node.\n const oldIdx = foundIdx !== undefined && !removingKeys.has(k) ? foundIdx : undefined;\n\n if (oldIdx === undefined) {\n toRender.push({ key: k, item, index: i });\n newIndices[i] = -1;\n newStates[i] = ItemState.New;\n continue;\n }\n\n newNodes[i] = oldNodes[oldIdx]!;\n // Logic: If 'update' is not provided and content changed, we can't patch the DOM.\n // We must force a full replacement (destroy and re-create).\n if (!update && !eq(oldItems[oldIdx]!, item)) {\n toRender.push({ key: k, item, index: i });\n newStates[i] = ItemState.ForceReplace;\n } else {\n newStates[i] = ItemState.Existing;\n }\n newIndices[i] = oldIdx;\n }\n\n return {\n newKeys,\n newKeySet,\n newItems,\n newNodes,\n newStates,\n newIndices,\n toRender,\n startIndex,\n oldEndIndex,\n newEndIndex,\n };\n}\n","import $ from 'jquery';\nimport { LOG_PREFIXES } from '@/constants';\nimport type { ListOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { sanitizeHtml } from '@/utils/sanitize';\nimport type { ListContext } from './context';\nimport { ItemState, type PlaceCallbacks, type PreparedDiff } from './types';\nimport { cleanupNodes, setAtomKey, wrap } from './utils';\n\n/**\n * Low-level DOM helper to insert elements before a reference node.\n * Supports both raw Elements and jQuery collections.\n */\nexport function insertOrAppend(\n elOrJq: Element | JQuery | undefined,\n nextNode: Node | null,\n container: Element\n): void {\n if (!elOrJq) return;\n if (elOrJq instanceof Element) {\n container.insertBefore(elOrJq, nextNode);\n return;\n }\n const jq = elOrJq as JQuery;\n for (let i = 0, len = jq.length; i < len; i++) {\n const el = jq[i];\n if (el) container.insertBefore(el, nextNode);\n }\n}\n\n/**\n * Synchronizes the container state with the 'empty' option.\n *\n * Logic:\n * - If onRemove exists, we must trigger the async removal flow for each item\n * instead of a destructive $container.empty().\n */\nexport function handleEmpty<T>(\n ctx: ListContext<T>,\n itemCount: number,\n $container: JQuery,\n empty: ListOptions<T>['empty']\n): void {\n if (ctx.$emptyEl && itemCount > 0) {\n ctx.$emptyEl.remove();\n ctx.$emptyEl = null;\n }\n if (itemCount !== 0) return;\n\n const { oldKeys, oldNodes, onRemove } = ctx;\n if (!onRemove) {\n $container.empty();\n } else {\n // Reason: Must trigger coordinated animations for every existing row.\n for (let i = 0, len = oldKeys.length; i < len; i++) {\n const k = oldKeys[i]!,\n node = oldNodes[i];\n if (node) ctx.removeItem(k, wrap(node as Element | JQuery<Element>));\n }\n }\n\n if (empty && !ctx.$emptyEl) {\n const raw = typeof empty === 'string' ? $.parseHTML(sanitizeHtml(empty)) : empty;\n ctx.$emptyEl = $(raw as Element | Element[] | JQuery) as unknown as JQuery;\n ctx.$emptyEl.appendTo($container);\n }\n\n ctx.oldKeys = [];\n ctx.oldItems = [];\n ctx.oldNodes = [];\n}\n\n/**\n * Orchestrates the rendering of new or updated items.\n *\n * Performance Optimization:\n * If all items are HTML strings and it's a cold start, returns sanitized HTML\n * parts for direct innerHTML injection to bypass slow jQuery object creation.\n */\nexport function renderItems<T>(\n diff: PreparedDiff<T>,\n options: ListOptions<T>,\n isInitial: boolean\n): string[] | null {\n const { toRender, newNodes, newStates } = diff;\n const renderCount = toRender.length;\n if (renderCount === 0) return null;\n\n const results: (string | Element | DocumentFragment | JQuery)[] = new Array(renderCount);\n const htmlParts: string[] = [];\n let isAllStrings = true;\n\n for (let i = 0; i < renderCount; i++) {\n const raw = options.render(toRender[i]!.item, toRender[i]!.index);\n results[i] = raw;\n if (typeof raw === 'string') htmlParts.push(raw);\n else isAllStrings = false;\n }\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) sanitized = batchSanitize(htmlParts);\n\n // High-perf path: Cold start with string-only templates\n if (\n isInitial &&\n isAllStrings &&\n sanitized &&\n !options.bind &&\n !options.onAdd &&\n !options.events\n ) {\n if ($.parseHTML(sanitized.join('')).length === renderCount) return sanitized;\n }\n\n let sIdx = 0;\n for (let i = 0; i < renderCount; i++) {\n const { key, index: targetIdx } = toRender[i]!;\n const raw = results[i]!;\n const $el = (typeof raw === 'string'\n ? $($.parseHTML(sanitized![sIdx++]!))\n : $(raw as Element | DocumentFragment | JQuery)) as unknown as JQuery;\n\n setAtomKey($el, String(key));\n\n // Choice: ForceReplace occurs when identity matches but patching is not allowed.\n if (newStates[targetIdx] === ItemState.ForceReplace && newNodes[targetIdx]) {\n const node = newNodes[targetIdx]!;\n cleanupNodes(node as Element | JQuery);\n const $old = wrap(node as Element | JQuery<Element>);\n $old.first().before($el);\n $old.remove();\n }\n\n newNodes[targetIdx] = $el.length === 1 ? ($el[0] as Element) : $el;\n }\n\n return null;\n}\n\n/**\n * Batch sanitizes multiple HTML fragments using a unique template separator.\n * Reason: Massive performance gain by reducing DOMPurify/Sanitizer calls to one.\n */\nfunction batchSanitize(parts: string[]): string[] {\n if (parts.length === 1) return [sanitizeHtml(parts[0]!)];\n const sep = `<template data-atom-sep=\"s${Math.random().toString(36).slice(2)}\"></template>`;\n return sanitizeHtml(parts.join(sep)).split(sep);\n}\n\n/**\n * Identifies and removes items that are no longer present in the dataset.\n */\nexport function cleanupRemoved<T>(ctx: ListContext<T>, diff: PreparedDiff<T>): void {\n const { startIndex, oldEndIndex, newKeySet } = diff;\n for (let i = startIndex; i <= oldEndIndex; i++) {\n const k = ctx.oldKeys[i]!;\n // Note: Items in the \"moving\" middle section are already filtered.\n // Here we only target items that don't exist in the new key set at all.\n if (!newKeySet.has(k) && ctx.oldNodes[i]) {\n ctx.removeItem(k, wrap(ctx.oldNodes[i] as Element | JQuery<Element>));\n }\n }\n}\n\n/**\n * Final step: Physically places or moves the nodes into their correct positions.\n */\nexport function placeItems<T>(\n ctx: ListContext<T>,\n diff: PreparedDiff<T>,\n container: Element,\n callbacks: PlaceCallbacks<T>,\n htmlFragments: string[] | null\n): void {\n const { newKeys, newItems, newNodes, newStates, newIndices } = diff;\n const count = newKeys.length;\n\n // Path A: The fastest possible start using direct innerHTML.\n if (htmlFragments) {\n container.innerHTML = htmlFragments.join('');\n let el = container.firstElementChild;\n for (let i = 0; i < count; i++) {\n if (!el) break;\n el.setAttribute('data-atom-key', String(newKeys[i]));\n newNodes[i] = el;\n newStates[i] = ItemState.Existing;\n debug.domUpdated(LOG_PREFIXES.LIST, $(el) as unknown as JQuery, 'list.add', newItems[i]);\n el = el.nextElementSibling;\n }\n return;\n }\n\n // Path B: Fragment-based batch injection for clean starts.\n if (ctx.oldKeys.length === 0 && ctx.removingKeys.size === 0) {\n const frag = document.createDocumentFragment();\n for (const node of newNodes) {\n if (!node) continue;\n if (node instanceof Element) frag.appendChild(node);\n else {\n const jq = node as JQuery;\n for (let j = 0; j < jq.length; j++) {\n const entry = jq[j];\n if (entry) frag.appendChild(entry);\n }\n }\n }\n container.innerHTML = '';\n container.appendChild(frag);\n } else {\n // Path C: Complex move logic.\n // Optimization: Loop backwards to maintain order using insertBefore(next).\n let next: Node | null = null,\n min = Infinity;\n for (let i = count - 1; i >= 0; i--) {\n const idx = newIndices[i]!,\n node = newNodes[i];\n if (!node) continue;\n\n const first = node instanceof Element ? node : (node as JQuery)[0];\n if (first) {\n // Deterministic Move Logic:\n // idx !== -1 ensures it's an existing item.\n // idx < min tracks the relative order; if broken, the item must be moved.\n if (idx !== -1 && idx < min) min = idx;\n else insertOrAppend(node as Element | JQuery, next, container);\n next = first;\n }\n }\n }\n\n // Finalize: Trigger callbacks (bind, update, onAdd) for the current frame.\n for (let i = 0; i < count; i++) {\n const state = newStates[i]!;\n if (state === ItemState.Unchanged) continue;\n\n const node = newNodes[i];\n if (!node) continue;\n\n const $el = wrap(node as Element | JQuery<Element>),\n item = newItems[i]!;\n if (state === ItemState.Existing) callbacks.update?.($el, item, i);\n else {\n callbacks.bind?.($el, item, i);\n if (state === ItemState.New) {\n callbacks.onAdd?.($el);\n ctx.removingKeys.delete(newKeys[i]!); // Stop tracking now that it's back in the active DOM.\n debug.domUpdated(LOG_PREFIXES.LIST, $el, 'list.add', item);\n }\n }\n }\n}\n","import { effect, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\nimport type { EffectObject, ListKey, ListKeyFn, ListOptions, ReadonlyAtom } from '@/types';\nimport { getSelector, hasOwn } from '@/utils';\nimport { ListContext } from './context';\nimport { buildIndices } from './diff';\nimport { cleanupRemoved, handleEmpty, placeItems, renderItems } from './dom';\nimport type { PlaceCallbacks } from './types';\n\n/** Provides metadata storage for container-to-context associations. */\nconst listInstances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\n\n/**\n * Binds a reactive atom array to a jQuery container for automated list rendering.\n *\n * When to use:\n * - Use this to render dynamic lists that stay in sync with an atom's value.\n * - Ideal for high-performance dashboard rows, item feeds, or state-driven UI components.\n *\n * Performance:\n * - Uses a diffing algorithm to minimize DOM operations (only moves or updates what's changed).\n * - Implements batch rendering and sanitization for cold starts.\n *\n * @example\n * $('#my-list').atomList(itemAtom, {\n * key: 'id',\n * render: (item) => `<li>${item.name}</li>`,\n * events: {\n * 'click li': (item, index, e) => console.log(item.id)\n * }\n * });\n */\nfunction atomList<T>(this: JQuery, source: ReadonlyAtom<T[]>, options: ListOptions<T>): JQuery {\n const getKey: ListKeyFn<T> =\n typeof options.key === 'function'\n ? options.key\n : (item: T) => item[options.key as keyof T] as unknown as ListKey;\n\n const callbacks: PlaceCallbacks<T> = {\n bind: options.bind,\n update: options.update,\n onAdd: options.onAdd,\n onRemove: options.onRemove,\n events: options.events,\n };\n\n for (let i = 0, len = this.length; i < len; i++) {\n const raw = this[i]!,\n $c = $(raw);\n\n // Teardown previous binding if re-applying to the same element\n const old = listInstances.get(raw);\n if (old) {\n old.fx.dispose();\n old.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(raw), options.onRemove);\n const fx = effect(() => {\n const items = source.value,\n count = items.length;\n\n // Reason: DOM synchronization and diffing should not contribute to\n // reactive dependency tracking to prevent infinite loops or over-execution.\n untracked(() => {\n handleEmpty(ctx, count, $c, options.empty);\n if (count === 0) return;\n\n const isActuallyInitial = ctx.oldKeys.length === 0 && ctx.removingKeys.size === 0;\n\n ctx.keyToIndex.clear();\n const diff = buildIndices(ctx, items, count, getKey, options.update, options.isEqual);\n\n const frag = renderItems(diff, options, isActuallyInitial);\n\n cleanupRemoved(ctx, diff);\n placeItems(ctx, diff, raw, callbacks, frag);\n\n // Update context with the new state for the next reconciliation cycle\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n });\n });\n\n ctx.fx = fx;\n if (options.events) setupEvents(ctx, $c, options.events);\n\n // Lifecycle: Automatic cleanup when the element or parent effect is destroyed\n registry.trackEffect(raw, fx);\n listInstances.set(raw, { fx, ctx });\n\n registry.trackCleanup(raw, () => {\n ctx.dispose();\n listInstances.delete(raw);\n });\n }\n return this;\n}\n\n/**\n * Configures delegated event listeners on the container.\n *\n * Logic:\n * - Uses event delegation for performance (single listener per container).\n * - Resolves the clicked DOM element back to the original data item using 'data-atom-key'.\n */\nfunction setupEvents<T>(\n ctx: ListContext<T>,\n $container: JQuery,\n events: Record<string, Function>\n): void {\n for (const ek in events) {\n if (!hasOwn.call(events, ek)) continue;\n const s = ek.indexOf(' '),\n type = s === -1 ? ek : ek.slice(0, s),\n sel = s === -1 ? '> *' : ek.slice(s + 1).trim();\n const handler = events[ek]!;\n\n $container.on(`${type}.atomList`, sel, function (this: HTMLElement, e: JQuery.TriggeredEvent) {\n const itemEl = e.target.closest?.('[data-atom-key]') as HTMLElement | null;\n const rk = itemEl?.getAttribute('data-atom-key');\n if (rk === null || rk === undefined) return;\n\n let key: ListKey = rk;\n\n // Handle cases where Number-based keys were serialized to Strings in the DOM\n if (!ctx.keyToIndex.has(rk)) {\n const nk = Number(rk);\n if (!Number.isNaN(nk) && ctx.keyToIndex.has(nk)) key = nk;\n }\n\n const idx = ctx.keyToIndex.get(key);\n if (idx !== undefined) {\n handler.call(itemEl as HTMLElement, ctx.oldItems[idx]!, idx, e);\n }\n });\n }\n}\n\n$.fn.atomList = atomList;\n","import { batch, untracked } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { atomEachElement } from '@/core/dom';\nimport { registry } from '@/core/registry';\nimport type { ComponentFn } from '@/types';\n\nconst EMPTY_PROPS = Object.freeze({});\n\n/**\n * Mounts a functional component to the selected elements.\n *\n * When to use:\n * - Use for complex UI modules that manage their own internal reactive effects or DOM listeners.\n * - Ideal for \"Logic Units\" that need a cleanup phase when removed.\n *\n * Lifecycle:\n * 1. Automatically cleans up any existing component logic/effects on the target element.\n * 2. Executes the component function in an isolated reactive window (batch/untracked).\n * 3. Registers any returned cleanup function for future destruction.\n *\n * @example\n * // Define a component\n * const MyComponent = ($element, props) => {\n * const reactiveEffect = effect(() => $element.text(props.label));\n * return () => reactiveEffect.dispose(); // Optional teardown\n * };\n *\n * // Mount it\n * $('.tab').atomMount(MyComponent, { label: 'Home' });\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const componentProps = (props ?? EMPTY_PROPS) as P;\n\n return atomEachElement(this, (element) => {\n // Reason: Prevents memory leaks and conflicting effects if mounting on a non-empty element.\n registry.cleanupTree(element);\n\n // Reason: 'untracked' ensures component initialization doesn't establish dependency\n // loops with the parent caller. 'batch' ensures initial DOM updates are atomic.\n const result = untracked(() => batch(() => component($(element), componentProps)));\n\n if (result) {\n const teardown = typeof result === 'function' ? result : result.unmount;\n registry.setComponentCleanup(element, teardown);\n }\n });\n};\n\n/**\n * Manually triggers the teardown phase for the component(s) and all nested bindings.\n */\n$.fn.atomUnmount = function (this: JQuery): JQuery {\n return atomEachElement(this, (element) => registry.cleanupTree(element));\n};\n","import {\n batch,\n computed,\n atom as createAtom,\n effect,\n type ReadonlyAtom,\n untracked,\n} from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { ERROR_MESSAGES, LOG_PREFIXES, ROUTE_DEFAULTS } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, RouteDefinition, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/** Internal utilities for consistent path manipulation across adapters. */\nconst PathUtils = {\n normalize: (path: string): string => path.replace(/(^\\/+|\\/+$)/g, ''),\n\n split: (path: string): { route: string; query: string | undefined } => {\n const [route, query] = path.split('?');\n return { route: PathUtils.normalize(route || ''), query };\n },\n\n isSameParams: (a: Record<string, string>, b: Record<string, string>): boolean => {\n if (a === b) return true;\n const ka = Object.keys(a),\n kb = Object.keys(b);\n return ka.length === kb.length && ka.every((k) => a[k] === b[k]);\n },\n};\n\nfunction parseQueryParams(raw: string): Record<string, string> {\n const res: Record<string, string> = {};\n if (!raw) return res;\n\n try {\n decodeURIComponent(raw);\n } catch {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.MALFORMED_URI(raw));\n }\n\n try {\n new URLSearchParams(raw).forEach((v, k) => {\n res[k] = v;\n });\n } catch {}\n return res;\n}\n\ntype URLState = {\n readonly path: string;\n readonly query: Record<string, string>;\n readonly url: string;\n};\n\n/** Abstract interface for synchronizing the router with different browser URL mechanisms. */\ninterface UrlAdapter {\n readonly getBrowserState: () => URLState;\n readonly commit: (fullPath: string) => URLState;\n readonly revert: (previousUrl: string) => void;\n readonly resolveAnchor: (el: HTMLAnchorElement) => string;\n readonly setupListener: (handler: () => void) => () => void;\n}\n\n/** Implementation for modern browsers using the HTML5 History API (pushState). */\nconst createHistoryAdapter = (basePathRaw?: string): UrlAdapter => {\n const basePath = basePathRaw ? `/${PathUtils.normalize(basePathRaw)}` : '';\n const absoluteBase = `${location.origin}${basePath}/`.replace(/\\/+$/, '/');\n\n return {\n getBrowserState: () => {\n let p = location.pathname;\n if (basePath && p.startsWith(basePath)) p = p.substring(basePath.length);\n return {\n path: PathUtils.normalize(p),\n query: parseQueryParams(location.search.substring(1)),\n url: location.pathname + location.search,\n };\n },\n commit: (fullPath) => {\n const { route, query } = PathUtils.split(fullPath);\n const url = new URL(route, absoluteBase);\n if (query) url.search = query;\n const urlStr = url.pathname + url.search;\n try {\n history.pushState(null, '', urlStr);\n } catch {}\n return {\n path: PathUtils.normalize(route),\n query: parseQueryParams(query || ''),\n url: urlStr,\n };\n },\n revert: (previousUrl) => {\n const current = location.pathname + location.search;\n if (current !== previousUrl) {\n try {\n history.replaceState(null, '', previousUrl);\n } catch {}\n }\n },\n resolveAnchor: (el) => {\n let p = el.pathname;\n if (basePath && p.startsWith(basePath)) p = p.substring(basePath.length);\n return PathUtils.normalize(p) + el.search;\n },\n setupListener: (handler) => {\n window.addEventListener('popstate', handler);\n return () => window.removeEventListener('popstate', handler);\n },\n };\n};\n\n/** Implementation for legacy support or static environments using URL fragments (#). */\nconst createHashAdapter = (): UrlAdapter => {\n return {\n getBrowserState: () => {\n const hash = location.hash;\n const raw = hash.startsWith('#') ? hash.substring(1) : hash;\n const { route, query } = PathUtils.split(raw);\n return { path: route, query: parseQueryParams(query || ''), url: hash };\n },\n commit: (fullPath) => {\n const { route, query } = PathUtils.split(fullPath);\n const url = `#${query ? `${route}?${query}` : route}`;\n location.hash = url;\n return { path: PathUtils.normalize(route), query: parseQueryParams(query || ''), url };\n },\n revert: (previousUrl) => {\n if (location.hash !== previousUrl) location.hash = previousUrl;\n },\n resolveAnchor: (el) => {\n return el.hash.startsWith('#') ? PathUtils.normalize(el.hash.substring(1)) : '';\n },\n setupListener: (handler) => {\n window.addEventListener('hashchange', handler);\n return () => window.removeEventListener('hashchange', handler);\n },\n };\n};\n\ntype CompiledRoute =\n | {\n readonly kind: 'exact';\n readonly pattern: string;\n readonly def: RouteDefinition;\n }\n | {\n readonly kind: 'dynamic';\n readonly pattern: string;\n readonly regex: RegExp;\n readonly paramNames: readonly string[];\n readonly def: RouteDefinition;\n };\n\ntype MatchResult =\n | {\n readonly kind: 'found';\n readonly route: CompiledRoute;\n readonly params: Record<string, string>;\n }\n | { readonly kind: 'not-found' };\n\n/** Compiles string route patterns into Regex for high-performance URL matching and param extraction. */\nclass RouteMatcher {\n private readonly routes: CompiledRoute[] = [];\n\n constructor(routes: Record<string, RouteDefinition>) {\n Object.entries(routes).forEach(([path, def]) => {\n const normalized = PathUtils.normalize(path);\n if (!normalized.includes(':')) {\n this.routes.push({ kind: 'exact', pattern: normalized, def });\n } else {\n const paramNames: string[] = [];\n // Regex Transformation: Converts '/user/:id' into a regex with capture groups.\n const regexStr = normalized\n .replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/:(\\w+)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n });\n\n this.routes.push({\n kind: 'dynamic',\n pattern: normalized,\n regex: new RegExp(`^${regexStr}$`),\n paramNames,\n def,\n });\n }\n });\n }\n\n match(path: string): MatchResult {\n const normalized = PathUtils.normalize(path);\n\n for (const route of this.routes) {\n if (route.kind === 'exact') {\n if (route.pattern === normalized) return { kind: 'found', route, params: {} };\n } else {\n const match = normalized.match(route.regex);\n if (match) {\n const params = route.paramNames.reduce(\n (acc, name, i) => {\n try {\n acc[name] = decodeURIComponent(match[i + 1] || '');\n } catch {\n acc[name] = match[i + 1] || '';\n }\n return acc;\n },\n {} as Record<string, string>\n );\n return { kind: 'found', route, params };\n }\n }\n }\n return { kind: 'not-found' };\n }\n}\n\n/** Orchestrates the reactive routing logic, History/Hash adaptation, and view rendering. */\nclass RouterImpl implements Router {\n /** Reactive current path (read-only). */\n public currentRoute: ReadonlyAtom<string>;\n /** Reactive key-value map of URL query parameters. */\n public queryParams: ReadonlyAtom<Record<string, string>>;\n /** Combined reactive map of route params (e.g. :id) and query params. */\n public params: ReadonlyAtom<Record<string, string>>;\n\n private readonly matcher: RouteMatcher;\n private readonly config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> };\n private readonly urlAdapter: UrlAdapter;\n private readonly $target: JQuery<HTMLElement>;\n private readonly activeClass: string;\n\n private readonly currentRouteAtom: WritableAtom<string>;\n private readonly queryParamsAtom: WritableAtom<Record<string, string>>;\n private readonly paramsAtom: WritableAtom<Record<string, string>>;\n\n private isDestroyed = false;\n private previousPath = '';\n private previousUrl = '';\n\n private cleanups: (() => void)[] = [];\n private routeCleanups: (() => void)[] = [];\n\n constructor(config: RouteConfig) {\n this.config = this.parseConfig(config);\n this.activeClass = this.config.activeClass;\n\n const target = this.config.target;\n if (typeof target === 'string') {\n this.$target = $(target);\n } else if (target instanceof HTMLElement) {\n this.$target = $(target);\n } else {\n this.$target = target as JQuery<HTMLElement>;\n }\n\n this.urlAdapter =\n this.config.mode === 'history'\n ? createHistoryAdapter(this.config.basePath)\n : createHashAdapter();\n\n this.discoverRoutesFromDOM();\n this.matcher = new RouteMatcher(this.config.routes);\n\n const initState = this.urlAdapter.getBrowserState();\n this.previousUrl = initState.url;\n\n const initialPath = initState.path || this.config.default;\n this.currentRouteAtom = createAtom(initialPath);\n this.currentRoute = this.currentRouteAtom;\n\n this.queryParamsAtom = createAtom(initState.query);\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n const firstMatch = this.matcher.match(initialPath);\n const initialParams = firstMatch.kind === 'found' ? firstMatch.params : {};\n this.paramsAtom = createAtom({ ...initState.query, ...initialParams });\n this.params = computed(() => this.paramsAtom.value);\n\n this.setupLifecycle();\n }\n\n private parseConfig(c: RouteConfig) {\n return {\n mode: ROUTE_DEFAULTS.mode,\n basePath: ROUTE_DEFAULTS.basePath,\n autoBindLinks: ROUTE_DEFAULTS.autoBindLinks,\n activeClass: ROUTE_DEFAULTS.activeClass,\n notFound: c.notFound || '',\n beforeTransition: c.beforeTransition || (() => {}),\n afterTransition: c.afterTransition || (() => {}),\n default: c.default || '',\n ...c,\n routes: c.routes || {},\n } as Required<RouteConfig> & { routes: Record<string, RouteDefinition> };\n }\n\n private setupLifecycle() {\n this.cleanups.push(this.urlAdapter.setupListener(() => this.handleBrowserSync()));\n\n const renderSub = effect(() => {\n const path = this.currentRouteAtom.value;\n // Dependency: Implicitly tracks queryParamsAtom to re-render if query changes.\n this.queryParamsAtom.value;\n\n untracked(() => {\n this.runRouteCleanups();\n this.render(path);\n });\n });\n this.cleanups.push(() => renderSub.dispose());\n\n if (this.config.autoBindLinks) this.setupInterception();\n if (this.$target[0]) {\n registry.trackCleanup(this.$target[0], () => this.destroy());\n }\n }\n\n /** Navigates to a new path. Aborts if the 'onLeave' guard returns false. */\n public navigate(path: string): void {\n if (this.isDestroyed || !this.canLeave()) return;\n\n const { route, query } = PathUtils.split(path);\n const targetPath = route || this.config.default;\n if (!targetPath) return;\n\n const fullPath = query ? `${targetPath}?${query}` : targetPath;\n\n batch(() => {\n const nextState = this.urlAdapter.commit(fullPath);\n this.previousUrl = nextState.url;\n\n if (!PathUtils.isSameParams(this.queryParamsAtom.peek(), nextState.query)) {\n this.queryParamsAtom.value = nextState.query;\n }\n\n const current = this.currentRouteAtom.peek();\n if (current !== nextState.path) {\n this.currentRouteAtom.value = nextState.path;\n }\n });\n }\n\n /** Syncs internal state with browser back/forward button events. Supports nav guards. */\n private handleBrowserSync() {\n if (this.isDestroyed) return;\n const state = this.urlAdapter.getBrowserState();\n if (state.url === this.previousUrl) return;\n\n const nextPath = state.path || this.config.default;\n if (this.currentRouteAtom.peek() !== nextPath) {\n if (!this.canLeave()) {\n // Revert: If navigation is blocked by a guard, force the browser URL back to the previous state.\n this.urlAdapter.revert(this.previousUrl);\n return;\n }\n this.currentRouteAtom.value = nextPath;\n }\n\n this.queryParamsAtom.value = state.query;\n this.previousUrl = state.url;\n }\n\n /** Executes the route transition lifecycle: beforeTransition -> onEnter -> render -> afterTransition. */\n private render(requestedPath: string): void {\n const matchResult = this.matcher.match(requestedPath);\n const def =\n matchResult.kind === 'found'\n ? matchResult.route.def\n : this.config.routes[this.config.notFound];\n\n if (!def) {\n debug.warn(LOG_PREFIXES.ROUTE, ERROR_MESSAGES.ROUTE.NOT_FOUND(requestedPath));\n return;\n }\n\n const routeName = matchResult.kind === 'found' ? matchResult.route.pattern : requestedPath;\n const pathParams = matchResult.kind === 'found' ? matchResult.params : {};\n const mergedParams = { ...this.queryParamsAtom.peek(), ...pathParams };\n\n untracked(() => this.config.beforeTransition(this.previousPath, routeName));\n\n if (def.onEnter) {\n // Guard: Allows synchronous blocking of the current navigation.\n const hookResult = untracked(() => def.onEnter!(mergedParams, this));\n if (hookResult === false) {\n this.urlAdapter.revert(this.previousUrl);\n return;\n }\n if (hookResult) Object.assign(mergedParams, hookResult);\n }\n\n if (!PathUtils.isSameParams(this.paramsAtom.peek(), mergedParams)) {\n this.paramsAtom.value = mergedParams;\n }\n\n if (def.title) document.title = def.title;\n this.updateDom(def, routeName, mergedParams);\n\n untracked(() => this.config.afterTransition(this.previousPath, routeName));\n this.finalizeNavigation(routeName, mergedParams);\n }\n\n /** Performs the actual HTML injection and executes onMount hooks. */\n private updateDom(def: RouteDefinition, name: string, params: Record<string, string>) {\n const container = this.$target[0];\n if (!container) return;\n container.replaceChildren();\n\n const onUnmount = (fn: () => void) => this.routeCleanups.push(fn);\n\n if (def.render) {\n def.render(container, name, params, onUnmount, this);\n } else if (def.template) {\n const tmpl = this.getTemplate(def.template);\n if (tmpl) {\n container.appendChild(tmpl.content.cloneNode(true));\n def.onMount?.($(container).children(), onUnmount, this);\n }\n }\n }\n\n /** Scans the DOM for <template data-path=\"...\"> elements to automatically register routes. */\n private discoverRoutesFromDOM() {\n document.querySelectorAll<HTMLTemplateElement>('template[data-path]').forEach((tmpl) => {\n const path = PathUtils.normalize(tmpl.getAttribute('data-path') || '');\n const title = tmpl.getAttribute('title') || tmpl.getAttribute('data-title');\n\n const existing = this.config.routes[path];\n if (!existing) {\n if (!tmpl.id) tmpl.id = `route-${Math.random().toString(36).substring(2, 9)}`;\n this.config.routes[path] = {\n template: `#${tmpl.id}`,\n ...(title ? { title } : {}),\n };\n } else if (title && !existing.title) {\n existing.title = title;\n }\n\n if (tmpl.hasAttribute('data-default') && !this.config.default) {\n this.config.default = path;\n }\n });\n }\n\n /** Global click hijacker for link-based navigation. Filters out external links and modifier clicks. */\n private setupInterception() {\n const onClick = (e: JQuery.TriggeredEvent) => {\n const me = e.originalEvent as MouseEvent;\n if (me && (me.ctrlKey || me.metaKey || me.altKey || me.shiftKey || me.button !== 0)) return;\n\n const el = e.currentTarget as HTMLElement;\n if (el.hasAttribute('data-ignore')) return;\n\n const path = this.resolvePathFromElement(el);\n if (path && this.shouldIntercept(path, el)) {\n e.preventDefault();\n this.navigate(path);\n }\n };\n\n $(document).on('click', 'a, [data-route]', onClick);\n this.cleanups.push(() => $(document).off('click', 'a, [data-route]', onClick));\n this.setupActiveEffect();\n }\n\n /** Reactive effect that automatically toggles the 'activeClass' on links matching the current route. */\n private setupActiveEffect() {\n const activeSub = effect(() => {\n const current = this.currentRouteAtom.value;\n const matchResult = this.matcher.match(current);\n const pattern = matchResult.kind === 'found' ? matchResult.route.pattern : '';\n\n untracked(() => {\n document.querySelectorAll<HTMLElement>('a, [data-route]').forEach((el) => {\n const path = this.resolvePathFromElement(el, true);\n const active = path === current || path === pattern;\n el.classList.toggle(this.activeClass, active);\n // Accessibility: Updates aria-current to signal active navigation for screen readers.\n if (active) el.setAttribute('aria-current', 'page');\n else el.removeAttribute('aria-current');\n });\n });\n });\n this.cleanups.push(() => activeSub.dispose());\n }\n\n private resolvePathFromElement(el: HTMLElement, stripQuery = false): string {\n let path = el.dataset.route || '';\n if (!path && el instanceof HTMLAnchorElement) {\n path = this.urlAdapter.resolveAnchor(el);\n }\n return stripQuery ? PathUtils.split(path).route : path;\n }\n\n /** Heuristics to decide if a link click should be handled by the router or allowed to reload the page. */\n private shouldIntercept(path: string, el: HTMLElement): boolean {\n if (el instanceof HTMLAnchorElement) {\n if (\n el.rel === 'external' ||\n (el.target && el.target !== '_self') ||\n el.hasAttribute('download')\n )\n return false;\n if (el.origin !== location.origin) return false;\n\n // Logic: Ignore clicks to file paths (.jpg, .pdf) that don't match a registered route.\n const last = path.split('/').pop() || '';\n if (\n last.includes('.') &&\n this.matcher.match(PathUtils.split(path).route).kind === 'not-found'\n )\n return false;\n }\n const { route } = PathUtils.split(path);\n return this.matcher.match(route).kind === 'found' || !!this.config.notFound;\n }\n\n private canLeave(): boolean {\n const matchResult = this.matcher.match(this.currentRouteAtom.peek());\n const def =\n matchResult.kind === 'found'\n ? matchResult.route.def\n : this.config.routes[this.config.notFound];\n return def?.onLeave ? untracked(() => def.onLeave!(this)) !== false : true;\n }\n\n private getTemplate(selector: string) {\n const el = document.querySelector(selector);\n return el instanceof HTMLTemplateElement ? el : null;\n }\n\n private runRouteCleanups() {\n this.routeCleanups.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n this.routeCleanups = [];\n }\n\n /** Finalizes a successful navigation event: events, logging, and accessibility focus reset. */\n private finalizeNavigation(routeName: string, params: Record<string, string>) {\n window.dispatchEvent(\n new CustomEvent('route-change', {\n detail: { from: this.previousPath, to: routeName, params },\n })\n );\n\n const targetElement = this.$target[0];\n if (!targetElement) return;\n\n // Accessibility: Reset focus to the main heading or container to handle SPA navigation for screen readers.\n const heading = targetElement.querySelector('h1, [role=\"heading\"]');\n const focusTarget = heading instanceof HTMLElement ? heading : targetElement;\n focusTarget.tabIndex = -1;\n focusTarget.focus();\n\n this.previousPath = routeName;\n }\n\n /** Destroys the router instance, cleaning up all event listeners and reactive subscriptions. */\n public destroy(): void {\n if (this.isDestroyed) return;\n this.isDestroyed = true;\n this.runRouteCleanups();\n this.cleanups.forEach((fn) => {\n try {\n fn();\n } catch {}\n });\n this.cleanups = [];\n }\n}\n\n/**\n * Initializes a client-side router for the application.\n *\n * Capabilities:\n * - Multi-mode support: 'history' (pushState) or 'hash'.\n * - Dynamic matching: Extract parameters from routes like '/user/:id'.\n * - Reactive state: Track route and params via atoms.\n * - Lifecycle hooks: Intercept navigation via onEnter and onLeave.\n *\n * @example\n * const router = $.route({\n * target: '#app',\n * routes: {\n * '/': { template: '#home-tmpl' },\n * '/user/:id': { render: (el, name, params) => ... }\n * }\n * });\n */\nexport function route(config: RouteConfig): Router {\n return new RouterImpl(config);\n}\n\n$.extend({ route });\n","import { computed } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n/**\n * Derives JQuery.AjaxSettings from FetchOptions.\n * Data-focused transformation without hidden state.\n *\n * Transforms high-level FetchOptions into standard jQuery.AjaxSettings.\n * Logic: Forces callback removal (success/error/complete) to ensure\n * the library’s internal async orchestration remains the single source of truth.\n */\nfunction getAjaxSettings<T>(getUrl: () => string, options: FetchOptions<T>): JQuery.AjaxSettings {\n const baseAjax = typeof options.ajaxOptions === 'object' ? options.ajaxOptions : {};\n const dynamicOptions = typeof options.ajaxOptions === 'function' ? options.ajaxOptions() : {};\n\n return {\n ...baseAjax,\n ...dynamicOptions,\n url: getUrl(),\n method: options.method || dynamicOptions.method || baseAjax.method,\n headers: {\n ...(baseAjax as JQuery.AjaxSettings)?.headers,\n ...options.headers,\n ...dynamicOptions.headers,\n },\n // Reset callbacks to prevent interference with atom-effect's internal lifecycle logic\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n}\n\n/**\n * Normalizes jQuery-specific jqXHR errors into standard JS Error objects.\n * Logic: Preserves the original jqXHR instance on the error object for\n * advanced debugging/logging in the 'onError' hook.\n */\nfunction handleFetchError(err: unknown, onError?: (err: unknown) => void): never {\n let final: Error;\n\n if (err && typeof (err as JQuery.jqXHR).readyState !== 'undefined') {\n const x = err as JQuery.jqXHR;\n final = new Error(`Network Error: ${x.statusText || 'Unknown'} (${x.status})`);\n (final as FetchError).jqXHR = x;\n } else {\n final = err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n }\n\n if (onError) {\n try {\n onError(final);\n } catch {\n // Logic: Ignore user-hook errors to prevent breaking the core fetch promise chain.\n }\n }\n throw final;\n}\n\n/**\n * Creates a reactive fetch atom powered by jQuery.ajax.\n *\n * When to use:\n * - Best for fetching data that depends on other reactive stores (e.g., search queries, ID-based details).\n *\n * Built-in Features:\n * 1. Concurrency Management: Automatically aborts the previous request if the URL/atom re-evaluates.\n * 2. Lifecycle Cleanup: Terminates any pending network request when the atom is disposed.\n * 3. Reactive Integration: Exposes the result as a standard ComputedAtom.\n *\n * @example\n * const userId = $.atom(123);\n * const user = $.atomFetch(() => `/api/users/${userId.value}`, {\n * defaultValue: { name: 'Loading...' },\n * eager: true\n * });\n *\n * $.effect(() => console.log(user.value.name));\n */\nfunction atomFetch<T>(urlOrFn: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const getUrl = typeof urlOrFn === 'string' ? () => urlOrFn : urlOrFn;\n let abortController: AbortController | null = null;\n\n const execute = async (): Promise<T> => {\n // Logic: Aborts the previous execution to prevent out-of-order async race conditions.\n abortController?.abort();\n\n const controller = new AbortController();\n abortController = controller;\n const { signal } = controller;\n\n const settings = getAjaxSettings(getUrl, options);\n let xhr: JQuery.jqXHR | undefined;\n let onAbort: (() => void) | undefined;\n\n try {\n xhr = $.ajax(settings);\n const currentXhr = xhr;\n onAbort = () => currentXhr.abort();\n signal.addEventListener('abort', onAbort);\n\n if (signal.aborted) currentXhr.abort();\n\n const raw = await currentXhr;\n return options.transform ? options.transform(raw, currentXhr) : (raw as T);\n } catch (err) {\n if (signal.aborted) {\n const e = new Error('AbortError');\n e.name = 'AbortError';\n throw e;\n }\n return handleFetchError(err, options.onError);\n } finally {\n if (onAbort) {\n signal.removeEventListener('abort', onAbort);\n }\n if (abortController === controller) {\n abortController = null;\n }\n }\n };\n\n const atomVal = computed(execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n ...(options.name !== undefined ? { name: options.name } : {}),\n });\n\n // Lifecycle: Ensures the network request is canceled when the atom itself is destroyed.\n const originalDispose = atomVal.dispose.bind(atomVal);\n atomVal.dispose = () => {\n abortController?.abort();\n originalDispose();\n };\n\n return Object.assign(atomVal, {\n abort: () => abortController?.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n}\n\n$.extend({\n atomFetch,\n});\n","import $ from 'jquery';\nimport type { AtomNav, AtomNavOptions, ReadonlyAtom } from '@/types';\nimport { sanitizeHtml } from '@/utils/sanitize';\n\ntype NavigationType = 'init' | 'push' | 'replace' | 'pop';\n\ninterface NavState {\n url: string;\n type: NavigationType;\n}\n\ninterface ContentState {\n html: string;\n title: string | null;\n attributes?: Record<string, string>;\n redirectUrl?: string | null | undefined;\n meta?: Record<string, string>;\n}\n\nfunction getAbsoluteUrl(url: string, base: string): URL {\n try {\n return new URL(url, base);\n } catch {\n return new URL(url, 'http://localhost');\n }\n}\n\nfunction getCurrentFullUrl(win: Window): string {\n const { pathname, search, hash } = win.location;\n return (pathname || '/') + (search || '') + (hash || '');\n}\n\nfunction getPathAndSearch(urlObj: URL): string {\n return urlObj.pathname + urlObj.search;\n}\n\n/**\n * Parses raw HTML into a structured ContentState.\n *\n * Performance: Uses isolated DOMParser instances to extract clean fragments\n * without the high overhead of invisible iframes or global parser state.\n */\nfunction extractContent(html: string, selector?: string, xhr?: JQuery.jqXHR): ContentState {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const title = doc.querySelector('title')?.textContent?.trim() || null;\n\n const contentNode = selector ? doc.querySelector(selector) : null;\n const rawHtml = contentNode ? contentNode.innerHTML : doc.body?.innerHTML || html;\n\n const attributes: Record<string, string> = {};\n if (contentNode) {\n for (const { name, value } of Array.from(contentNode.attributes)) {\n if (name !== 'id') attributes[name] = value;\n }\n }\n\n const meta: Record<string, string> = {};\n const getMeta = (sel: string) => doc.querySelector(sel)?.getAttribute('content');\n const desc = getMeta('meta[name=\"description\"]');\n const keys = getMeta('meta[name=\"keywords\"]');\n const can = doc.querySelector('link[rel=\"canonical\"]')?.getAttribute('href');\n\n if (desc) meta.description = desc;\n if (keys) meta.keywords = keys;\n if (can) meta.canonical = can;\n\n return {\n html: sanitizeHtml(rawHtml).trim(),\n title,\n attributes,\n redirectUrl: xhr?.getResponseHeader?.('X-PJAX-URL') || undefined,\n meta,\n };\n}\n\n/** Synchronizes <head> metadata with the new content state to maintain SEO/Social integrity. */\nfunction syncMetaData(win: Window, meta?: Record<string, string>): void {\n const doc = win.document;\n const head = doc.head;\n\n const sync = (selector: string, value: string | undefined, name: string, isLink = false) => {\n const el = head.querySelector(selector);\n if (!value) {\n el?.remove();\n return;\n }\n const target = (el as HTMLElement) || doc.createElement(isLink ? 'link' : 'meta');\n if (!el) {\n if (isLink) target.setAttribute('rel', 'canonical');\n else target.setAttribute('name', name);\n head.appendChild(target);\n }\n const attr = isLink ? 'href' : 'content';\n if (target.getAttribute(attr) !== value) target.setAttribute(attr, value);\n };\n\n sync('meta[name=\"description\"]', meta?.description, 'description');\n sync('meta[name=\"keywords\"]', meta?.keywords, 'keywords');\n sync('link[rel=\"canonical\"]', meta?.canonical, 'canonical', true);\n}\n\n/** Updates attributes on the container element (classes, aria-labels) while preserving internal IDs. */\nfunction updateAttributes(el: HTMLElement, next: Record<string, string>): void {\n for (const attr of Array.from(el.attributes)) {\n const { name } = attr;\n if (name !== 'id' && name !== 'data-atom-nav-target' && !(name in next)) {\n el.removeAttribute(name);\n }\n }\n for (const [name, value] of Object.entries(next)) {\n if (el.getAttribute(name) !== value) {\n el.setAttribute(name, value);\n }\n }\n}\n\n/** Handles smooth scroll-to-hash or page-top behavior after navigation. */\nfunction performScroll(win: Window, hash?: string, fallbackToTop = false): void {\n if (hash) {\n const el = win.document.getElementById(decodeURIComponent(hash));\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n return;\n }\n if (!fallbackToTop) return;\n }\n win.scrollTo(0, 0);\n}\n\n/**\n * Initializes a reactive Single Page Application (SPA) navigation system.\n *\n * Responsibilities:\n * 1. History Sync: Manages browser pushState/replaceState and popstate.\n * 2. Partial Loading: Fetches fragments of new pages and injects them into the target.\n * 3. Interception: Globally intercepts link clicks to prevent full page reloads.\n * 4. Automatic SEO: Updates <title> and <meta> tags on every navigation event.\n *\n * @example\n * const nav = $.atomNav({\n * target: '#main-content',\n * selector: 'a[data-nav]',\n * onMount: ($target, url) => console.log('Arrived at:', url)\n * });\n */\nexport function atomNav(options: AtomNavOptions): AtomNav {\n const { target, selector = 'a[data-nav]', headers = {}, syncTitle = true } = options;\n const win = options.window ?? (window as Window & typeof globalThis);\n const $target = $(target as string);\n\n $target.attr('data-atom-nav-target', 'true');\n\n const initialUrl = getCurrentFullUrl(win);\n const initialUrlObj = getAbsoluteUrl(initialUrl, win.location.href);\n const initialPath = getPathAndSearch(initialUrlObj);\n\n const _navState = $.atom<NavState>({ url: initialUrl, type: 'init' }, { name: 'nav:state' });\n const _pendingHookCount = $.atom(0, { name: 'nav:hook-pending-count' });\n const _renderedState = $.atom({ url: initialUrl, path: initialPath }, { name: 'nav:rendered' });\n\n const _normalizedState = $.computed(\n () => {\n const { url, type } = _navState.value;\n const urlObj = getAbsoluteUrl(url, win.location.href);\n return {\n url,\n pathAndSearch: getPathAndSearch(urlObj),\n hash: urlObj.hash.slice(1),\n type,\n };\n },\n { name: 'nav:normalized' }\n );\n\n const targetSelector =\n typeof target === 'string'\n ? target\n : $target.attr('id')\n ? `#${$.escapeSelector($target.attr('id')!)}`\n : undefined;\n\n const _content = $.atomFetch<ContentState>(() => _normalizedState.value.pathAndSearch, {\n name: 'nav:content',\n defaultValue: { html: '', title: null },\n headers: { 'X-PJAX': 'true', ...headers },\n eager: false,\n transform: (raw, xhr) => extractContent(String(raw), targetSelector, xhr),\n });\n\n const _lifecycleController = new AbortController();\n let _navController: AbortController | null = null;\n\n function _renewAbortSignal(): AbortController {\n _navController?.abort();\n (_content as unknown as { abort?: () => void }).abort?.();\n\n const controller = new AbortController();\n _navController = controller;\n return controller;\n }\n\n /** Performs the actual DOM manipulation, ensuring reactive elements are properly unbound before removal. */\n function reconcileDOM(state: ContentState, url: string, previousUrl: string): void {\n $.untracked(() => {\n const doc = win.document;\n if (syncTitle && state.title !== null && doc.title !== state.title) {\n doc.title = state.title;\n }\n\n syncMetaData(win, state.meta);\n options.onUnmount?.($target, previousUrl);\n\n // Clean up: Manually unbind any reactive elements within the target areas\n // BEFORE jQuery overwrites the HTML to prevent memory leaks.\n $target.children().atomUnbind();\n\n const el = $target[0] as HTMLElement | undefined;\n if (el && state.attributes) {\n updateAttributes(el, state.attributes);\n }\n\n $target.html(state.html);\n options.onMount?.($target, url);\n });\n }\n\n /** Central UI synchronization effect. Decides whether to re-fetch, re-render, or just scroll. */\n function syncUI(): undefined {\n const { url, pathAndSearch, hash, type } = _normalizedState.value;\n const rendered = _renderedState.value;\n\n // Optimization: Skip re-fetching if only the hash changed. Just perform scroll.\n if (type === 'init' && pathAndSearch === rendered.path) {\n if (hash) performScroll(win, hash);\n options.onMount?.($target, url);\n return;\n }\n\n if (_content.hasError) {\n const error = _content.lastError;\n if (error instanceof Error && error.name === 'AbortError') return;\n // Fail-over: If AJAX navigation fails, fall back to a standard browser refresh.\n if (options.onError?.(error, url) !== false) {\n win.location.assign(url);\n }\n return;\n }\n\n const state = _content.value;\n if (!_content.isResolved || _content.isPending) return;\n\n const isRedirect = state.redirectUrl && state.redirectUrl !== url;\n const previousUrl = rendered.url;\n\n const finalUrl = isRedirect ? state.redirectUrl! : url;\n const redirectObj = isRedirect ? getAbsoluteUrl(finalUrl, win.location.href) : null;\n const finalPath = redirectObj ? getPathAndSearch(redirectObj) : pathAndSearch;\n const isNewTarget = finalPath !== rendered.path;\n\n $.batch(() => {\n if (isRedirect) {\n // Handle server-side redirects detected via headers (e.g. X-PJAX-URL).\n win.history.replaceState(null, '', finalUrl);\n }\n\n if (isNewTarget || isRedirect) {\n reconcileDOM(state, finalUrl, previousUrl);\n }\n\n const { scrollToTop = true } = options;\n const prevUrlObj = getAbsoluteUrl(_renderedState.value.url, win.location.href);\n const isHashRemoval = !hash && prevUrlObj.hash !== '';\n const isPop = type === 'pop';\n const shouldScroll = !!hash || (!isPop && (isHashRemoval || (isNewTarget && scrollToTop)));\n\n if (shouldScroll) {\n performScroll(win, hash, !isPop && isNewTarget && scrollToTop);\n }\n\n _renderedState.value = { url: finalUrl, path: finalPath };\n });\n\n return undefined;\n }\n\n const _navEffect = $.effect(() => syncUI(), { name: 'nav:sync-effect' });\n\n const handlePopState = (): void => {\n _renewAbortSignal();\n const currentUrl = getCurrentFullUrl(win);\n _navState.value = { url: currentUrl, type: 'pop' };\n };\n\n const doc = win.document;\n /** Global Link Interceptor: Hijacks clicks on <a> tags that match the provided selector. */\n doc.addEventListener(\n 'click',\n (e) => {\n const el = (e.target as Element).closest<HTMLAnchorElement>(selector);\n if (!el) return;\n\n const targetAttr = el.dataset.target;\n const myId = $target.attr('id');\n const isExplicitTarget = targetAttr && myId && targetAttr === `#${myId}`;\n\n // Logic: Only intercept if the link targets this specific nav instance.\n if (targetAttr && !isExplicitTarget) return;\n\n const closestNavTarget = $(el).closest('[data-atom-nav-target=\"true\"]')[0];\n const isInsideOtherNav = closestNavTarget && closestNavTarget !== $target[0];\n if (!isExplicitTarget && isInsideOtherNav) return;\n\n const mouse = e as MouseEvent;\n const isPrevented =\n e.defaultPrevented ||\n (e as unknown as JQuery.Event).isDefaultPrevented?.() ||\n (e as unknown as { originalEvent?: { defaultPrevented?: boolean } }).originalEvent\n ?.defaultPrevented;\n\n // Heuristic: Ignore clicks with modifier keys (Ctrl/Cmd/Shift) or non-primary mouse buttons\n // to preserve standard \"Open in new tab\" OS behavior.\n if (isPrevented || mouse.ctrlKey || mouse.metaKey || mouse.shiftKey || mouse.button > 0)\n return;\n\n const targetHref = el.getAttribute('href');\n const isInterceptee =\n targetHref &&\n !targetHref.startsWith('#') &&\n el.target !== '_blank' &&\n !el.hasAttribute('download') &&\n el.getAttribute('rel') !== 'external' &&\n el.dataset.nav !== 'false' &&\n (el.protocol === 'http:' || el.protocol === 'https:');\n\n if (isInterceptee) {\n try {\n const targetOrigin =\n el.origin ??\n new URL(el.href, el.ownerDocument.location?.href ?? win.location.origin).origin;\n if (targetOrigin === win.location.origin) {\n e.preventDefault();\n navigator.navigate(el.href);\n }\n } catch {}\n }\n },\n { signal: _lifecycleController.signal }\n );\n\n win.addEventListener('popstate', handlePopState, { signal: _lifecycleController.signal });\n\n const navigator: AtomNav = {\n currentUrl: $.computed(() => _renderedState.value.url, { name: 'nav:public-url' }),\n isPending: $.computed(() => _content.isPending || _pendingHookCount.value > 0, {\n name: 'nav:isPending',\n }),\n hasError: $.computed(() => _content.hasError, { name: 'nav:hasError' }),\n\n /** Programmatically trigger a navigation event. Supports 'replace' and 'onBeforeLoad' hooks. */\n async navigate(url: string, navOptions: { replace?: boolean } = {}): Promise<void> {\n const { signal } = _renewAbortSignal();\n\n if (options.onBeforeLoad) {\n _pendingHookCount.value++;\n try {\n // Hook: Allows the application to cancel or redirect navigation before AJAX starts.\n const ok = await (\n options.onBeforeLoad as (url: string, signal: AbortSignal) => Promise<boolean> | boolean\n )(url, signal);\n if (signal.aborted || ok === false) return;\n } finally {\n _pendingHookCount.value = Math.max(0, _pendingHookCount.value - 1);\n }\n }\n\n const base = win.document.baseURI ?? win.location.href;\n const targetObj = getAbsoluteUrl(url, base);\n\n // Condition: Always perform a full page reload if the origin changed.\n if (targetObj.origin !== win.location.origin) {\n win.location.assign(url);\n return;\n }\n\n const targetPath = getPathAndSearch(targetObj);\n const currentUrlObj = getAbsoluteUrl(win.location.href, base);\n const currentPath = getPathAndSearch(currentUrlObj);\n const finalUrl = targetPath + targetObj.hash;\n\n const isSameLoc = targetPath === currentPath && targetObj.hash === (win.location.hash || '');\n\n if (!isSameLoc || navOptions.replace) {\n $.batch(() => {\n const method = navOptions.replace ? 'replaceState' : 'pushState';\n win.history[method](null, '', finalUrl);\n _navState.value = { url: finalUrl, type: navOptions.replace ? 'replace' : 'push' };\n });\n } else if (url.includes('#') || targetObj.hash) {\n performScroll(win, targetObj.hash.slice(1), true);\n }\n },\n\n /** Destroys the navigator instance, stripping listeners and cleaning up reactive memory. */\n destroy() {\n _lifecycleController.abort();\n _navController?.abort();\n _navEffect.dispose();\n _content.dispose();\n $target.removeAttr('data-atom-nav-target');\n\n const atoms = [\n _navState,\n _pendingHookCount,\n _renderedState,\n _normalizedState,\n navigator.currentUrl,\n navigator.isPending,\n navigator.hasError,\n ];\n atoms.forEach((a) => (a as ReadonlyAtom).dispose?.());\n },\n };\n\n return navigator;\n}\n\n$.extend({ atomNav });\n","/**\n * atom-effect-jquery: Main Entry Point\n *\n * This module orchestrates the automatic integration of reactive atoms\n * into the jQuery ecosystem. By importing this module, the following\n * actions occur automatically:\n * 1. jQuery prototypes are patched for lifecycle safety.\n * 2. Reactive chainable methods ($().atomText, etc.) are registered.\n * 3. The MutationObserver safety-net is activated for automated cleanup.\n */\nimport $ from 'jquery';\n\n// side-effectful imports: these register methods and features into the $ namespace.\nimport '@/core/namespace';\nimport '@/bindings/chainable';\nimport '@/bindings/list';\nimport '@/bindings/mount';\nimport '@/features/route';\nimport '@/features/fetch';\nimport '@/features/nav';\n\nimport { enablejQueryOverrides } from '@/core/jquery-patch';\nimport { disableAutoCleanup, enableAutoCleanup, registry } from '@/core/registry';\n\n/**\n * Auto-Initialize:\n * Logic: Hooks into jQuery's ready event to guarantee that overrides\n * and lifecycle observers are anchored to a valid DOM tree.\n */\n$(() => {\n enablejQueryOverrides();\n if (document.body) {\n // Rationale: document.body is the standard root for the MutationObserver 'safety-net'.\n enableAutoCleanup(document.body);\n }\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { nextTick } from '@/core/namespace';\n\n/**\n * Public API Surface:\n * Re-exports the definitive types used for building reactive components and bindings.\n */\nexport type {\n AtomNavOptions,\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchOptions,\n ListOptions,\n PrimitiveValue,\n ReactiveValue,\n ReadonlyAtom,\n RouteConfig,\n RouteDefinition,\n RouteLifecycle,\n Router,\n ValOptions,\n WritableAtom,\n} from '@/types';\n\nexport { disableAutoCleanup, enableAutoCleanup, registry };\n\n/** The augmented jQuery object is the default export. */\nexport default $;\n"],"mappings":"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"}
|