@but212/atom-effect-jquery 0.30.1 → 0.32.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 +32 -28
- package/dist/atom-effect-jquery.min.js +9 -10
- package/dist/atom-effect-jquery.min.js.map +1 -1
- package/dist/bindings/chainable.d.ts +2 -0
- package/dist/bindings/chainable.d.ts.map +1 -0
- package/dist/bindings/form.d.ts +29 -0
- package/dist/bindings/form.d.ts.map +1 -0
- package/dist/bindings/input-binding.d.ts +31 -0
- package/dist/bindings/input-binding.d.ts.map +1 -0
- package/dist/bindings/list/context.d.ts +61 -0
- package/dist/bindings/list/context.d.ts.map +1 -0
- package/dist/bindings/list/diff.d.ts +32 -0
- package/dist/bindings/list/diff.d.ts.map +1 -0
- package/dist/bindings/list/dom.d.ts +63 -0
- package/dist/bindings/list/dom.d.ts.map +1 -0
- package/dist/bindings/list/index.d.ts +2 -0
- package/dist/bindings/list/index.d.ts.map +1 -0
- package/dist/bindings/list/types.d.ts +93 -0
- package/dist/bindings/list/types.d.ts.map +1 -0
- package/dist/bindings/list/utils.d.ts +33 -0
- package/dist/bindings/list/utils.d.ts.map +1 -0
- package/dist/bindings/mount.d.ts +2 -0
- package/dist/bindings/mount.d.ts.map +1 -0
- package/dist/bindings/unified.d.ts +135 -0
- package/dist/bindings/unified.d.ts.map +1 -0
- package/dist/constants.d.ts +108 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core/dom.d.ts +26 -0
- package/dist/core/dom.d.ts.map +1 -0
- package/dist/core/effect-factory.d.ts +34 -0
- package/dist/core/effect-factory.d.ts.map +1 -0
- package/dist/core/jquery-patch.d.ts +12 -0
- package/dist/core/jquery-patch.d.ts.map +1 -0
- package/dist/core/namespace.d.ts +11 -0
- package/dist/core/namespace.d.ts.map +1 -0
- package/dist/core/navigation.d.ts +172 -0
- package/dist/core/navigation.d.ts.map +1 -0
- package/dist/core/registry.d.ts +189 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/symbols.d.ts +33 -0
- package/dist/core/symbols.d.ts.map +1 -0
- package/dist/features/fetch.d.ts +2 -0
- package/dist/features/fetch.d.ts.map +1 -0
- package/dist/features/nav.d.ts +23 -0
- package/dist/features/nav.d.ts.map +1 -0
- package/dist/features/route/core.d.ts +83 -0
- package/dist/features/route/core.d.ts.map +1 -0
- package/dist/features/route/index.d.ts +43 -0
- package/dist/features/route/index.d.ts.map +1 -0
- package/dist/features/route/router.d.ts +74 -0
- package/dist/features/route/router.d.ts.map +1 -0
- package/dist/features/route/types.d.ts +60 -0
- package/dist/features/route/types.d.ts.map +1 -0
- package/dist/features/route/view.d.ts +116 -0
- package/dist/features/route/view.d.ts.map +1 -0
- package/dist/features/web-component/index.d.ts +33 -0
- package/dist/features/web-component/index.d.ts.map +1 -0
- package/dist/features/web-component/setup.d.ts +77 -0
- package/dist/features/web-component/setup.d.ts.map +1 -0
- package/dist/features/web-component/state.d.ts +47 -0
- package/dist/features/web-component/state.d.ts.map +1 -0
- package/dist/features/web-component/utils.d.ts +13 -0
- package/dist/features/web-component/utils.d.ts.map +1 -0
- package/dist/index.cjs +9 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +30 -232
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +3129 -2726
- package/dist/index.mjs.map +1 -1
- package/dist/types.d.ts +476 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/debug.d.ts +40 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/sanitize.d.ts +52 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/package.json +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atom-effect-jquery.min.js","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}, At = 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}), ft = 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 N(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\"), Et = /* @__PURE__ */ Symbol(\"AtomEffect.Id\"), it = /* @__PURE__ */ Symbol(\"AtomEffect.Type\"), B = /* @__PURE__ */ Symbol(\"AtomEffect.NoDefaultValue\"), dt = \"[Atom Effect]\", pt = 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(`${dt} ${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 [Et]: {\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}, It = {\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 pt() : It, Ct = 1, gt = () => Ct++ | 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 $(t, e) {\n if (!t) return !1;\n const s = typeof t;\n return (s === \"object\" || s === \"function\") && !!((t[F] ?? 0) & e);\n}\nfunction yt(t) {\n return $(t, p.Atom);\n}\nfunction Rt(t) {\n return $(t, p.Computed);\n}\nfunction wt(t) {\n return $(t, p.Effect);\n}\nfunction q(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 W = class {\n constructor(t, e, s = void 0) {\n this.node = t, this.version = e, this.unsub = s;\n }\n}, Dt = 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}, St = 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(q(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 St();\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 = gt() & 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 N(/* @__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 Dt(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(N(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 j(t) {\n const e = t + 1 & k;\n return e === 0 ? 1 : e;\n}\nvar Z = 0, z = !1, ct = 0;\nfunction Tt() {\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 mt() {\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 vt = 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}, b = new vt();\nfunction Ft(t) {\n if (_ && typeof t != \"function\") throw new TypeError(h.BATCH_CALLBACK_MUST_BE_FUNCTION);\n b.startBatch();\n try {\n return t();\n } finally {\n b.endBatch();\n }\n}\nvar Ot = 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 = j(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 && !b.isBatching ? this._notifying === 0 && this._flushNotifications() : b.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 || b.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 Ut(t, e = {}) {\n return new Ot(t, e);\n}\nvar { IDLE: D, DIRTY: E, PENDING: O, RESOLVED: I, REJECTED: T, HAS_ERROR: P, RECOMPUTING: y, DISPOSED: G, IS_COMPUTED: R, FORCE_COMPUTE: X } = Q, Nt = 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 & O) !== 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 & O) !== 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 & O) !== 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 W(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, q(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 | O) & ~(D | E | I | T), this._notifySubscribers(void 0, void 0), this._promiseId = (this._promiseId + 1) % ft.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 = N(t, A, e);\n if ((!this.isRejected || this._error !== i) && (this.version = j(this.version)), this._error = i, this.flags = this.flags & ~(D | E | O | 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 = j(this.version)), this._value = t, this._error = null, this.flags = (e | I) & ~(D | E | O | 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 Lt(t, e = {}) {\n return new Nt(t, e);\n}\nvar bt = 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 = () => b.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 W(t, t.version, i);\n } catch (i) {\n const n = N(i, m, h.EFFECT_EXECUTION_FAILED);\n if (console.error(n), this._onError) try {\n this._onError(n);\n } catch {\n }\n s = new W(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, q(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 = Tt();\n this._lastFlushEpoch !== t && (this._lastFlushEpoch = t, this._executionsInEpoch = 0), ++this._executionsInEpoch > this._maxExecutionsPerFlush && this._throwInfiniteLoopError(\"per-effect\"), mt() > 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 = N(t, m, e);\n if (console.error(s), this._onError) try {\n this._onError(s);\n } catch (i) {\n console.error(N(i, m, h.CALLBACK_ERROR_IN_ERROR_HANDLER));\n }\n }\n};\nfunction Pt(t, e = {}) {\n if (typeof t != \"function\") throw new m(h.EFFECT_MUST_BE_FUNCTION);\n const s = new bt(t, e);\n return s.execute(), s;\n}\nvar lt = /^(?:__proto__|constructor|prototype)$/;\nfunction _t(t, e, s, i) {\n if (s === e.length) return i;\n const n = e[s];\n if (lt.test(n)) return t;\n const r = t != null && typeof t == \"object\" ? t : {}, o = r[n], c = _t(o, e, s + 1, i);\n if (Object.is(o, c)) return t;\n if (Array.isArray(r)) {\n const a = r.slice(), v = Number(n);\n return n.trim() !== \"\" && Number.isInteger(v) && v >= 0 ? a[v] = c : a[n] = 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 const r = e[n];\n if (lt.test(r)) 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 = () => {\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 = _t(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 v = x(c, s), tt = x(a, s);\n Object.is(v, tt) || r(v, 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 xt = (t, e) => at(t, e), Mt = (t) => (e) => at(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 Ut as atom,\n at as atomLens,\n Ft as batch,\n xt as composeLens,\n Lt as computed,\n Pt as effect,\n x as getPathValue,\n b as globalScheduler,\n yt as isAtom,\n Rt as isComputed,\n wt as isEffect,\n Mt as lensFor,\n d as runtimeDebug,\n _t 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 *\n * This context is passed to binding functions and provides:\n * 1. The target element (`el`).\n * 2. A `trackCleanup` helper to register any standard or reactive cleanups\n * that should run when the element is removed from the DOM.\n *\n * @param el - The target HTMLElement to create a context for.\n * @returns A BindingContext instance for the element.\n */\nexport function createContext(el: HTMLElement): BindingContext {\n return {\n el,\n trackCleanup: (fn: EffectCleanup) => registry.trackCleanup(el, fn),\n };\n}\n\n/**\n * The central iteration engine for all chainable `atomXXX` methods.\n *\n * Processes a jQuery set and applies a binding function to each Element node.\n * It handles the `nodeType` filtering (skipping text/comment nodes) and\n * optionally provides a binding context if `needsCtx` is true.\n *\n * @param jq - The jQuery set to iterate over.\n * @param fn - The binding logic to apply to each element.\n * @param options - Configure whether a context is generated.\n * @param options.needsCtx - If true, passes a new BindingContext to the function.\n * @returns The original jQuery set for method chaining.\n */\nexport function atomEachElement(\n jq: JQuery,\n fn: (ctx: BindingContext | null, el: HTMLElement) => void,\n options: { needsCtx?: boolean } = {}\n): JQuery {\n // Performance: Cache options lookup before entering the loop.\n const needsCtx = !!options.needsCtx;\n const len = jq.length;\n\n for (let i = 0; i < len; i++) {\n const node = jq[i];\n\n // Only Element nodes (nodeType 1) are valid targets for reactive bindings.\n if (node?.nodeType === 1) {\n const el = node as HTMLElement;\n fn(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 normalize `[source, options]` tuple or standalone `source` arguments.\n *\n * This is crucial for integrated bindings (like `atomBind`) that support\n * both shorthand values and detailed [value, options] pairs.\n *\n * @note The tuple detection is focused on the **second** element. If it looks\n * like an options object or a formatter function (and isn't reactive itself),\n * the input is treated as a tuple. This allows first-class support for static\n * constants or plain objects as binding sources.\n *\n * @param val - The raw value or tuple provided by the user.\n * @returns A normalized array where index 0 is always the source.\n */\nexport function unpack<T, O>(val: T | [T, O]): [T, O?] {\n if (!Array.isArray(val) || val.length !== 2) {\n return [val as T];\n }\n\n const second = val[1];\n\n // Identifies a tuple if the second element:\n // 1. Is a function (usually a formatter: (v) => formattedValue).\n // 2. Is a plain object (excluding arrays, Atoms, and Promises).\n const isTuple =\n typeof second === 'function' ||\n (second !== null &&\n typeof second === 'object' &&\n !Array.isArray(second) &&\n !('value' in second) &&\n !('then' in second));\n\n return isTuple ? (val as [T, O]) : [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 provides a multi-layered defense:\n * 1. Fast-path scanner for O(n) safety checks.\n * 2. Hardened normalization (Entity decoding, Control character removal).\n * 3. Recursive tag stripping.\n * 4. Protocol and CSS neutralizers.\n */\nimport { DANGEROUS_PROTOCOL_PATTERN } from '@/constants';\n\n// ============================================================================\n// Constants & Configuration\n// ============================================================================\n\n/** Attributes that carry a URL or raw HTML (srcdoc). */\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 'srcdoc',\n]);\n\nconst NAMED_ENTITY_MAP: Record<string, string> = {\n colon: ':',\n tab: '\\t',\n newline: '\\n',\n};\n\n// ============================================================================\n// Regex Engine (Pre-compiled for performance)\n// ============================================================================\n\nconst RE_NUMERIC_ENTITY = /&#x([0-9a-f]+);?|&#([0-9]+);?/gi;\nconst RE_NAMED_ENTITY = /&(colon|tab|newline);?/gi;\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\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;\nconst RE_UNSAFE_ATTR = /\\bon\\w+\\s*=/gim;\n\nconst PROTOCOL_PATTERN = `${DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`;\nconst RE_DANGEROUS_PROTOCOL_GLOBAL = new RegExp(PROTOCOL_PATTERN, 'gi');\nconst RE_DANGEROUS_PROTOCOL_CONTEXT = new RegExp(\n `(?:^|url\\\\s*\\\\(\\\\s*[\"']?)\\\\s*${PROTOCOL_PATTERN}`,\n 'i'\n);\n\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\n/** CSS Sanitization: Optimized to avoid over-matching standard HTML attributes */\nconst CSS_KEYWORD_PATTERN = `(?:expression\\\\s*\\\\(|behavior\\\\s*:|-moz-binding\\\\s*:|url\\\\s*\\\\(\\\\s*[\"']?\\\\s*${PROTOCOL_PATTERN}(?!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');\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/** Normalizes a string by decoding entities and stripping control characters. */\nfunction normalize(s: string): string {\n if (typeof s !== 'string') return '';\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.toLowerCase()] ?? '')\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 RE_DANGEROUS_PROTOCOL_CONTEXT.test(s) || RE_DANGEROUS_DATA_URI.test(s);\n}\n\n/** Checks for high-risk HTML content (tags, on* handlers, embedded protocols). */\nfunction isDangerousHtmlContent(s: string): boolean {\n // Use sequential tests for short-circuiting; individual tests are often faster than one giant regex\n return RE_DANGEROUS_TAG.test(s) || RE_UNSAFE_ATTR.test(s) || RE_DANGEROUS_PROTOCOL_GLOBAL.test(s);\n}\n\n/** O(n) scan to skip sanitization for safe strings. */\nfunction needsSanitization(s: string): boolean {\n if (RE_FAST_SCAN.test(s) || s.includes(':')) 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; // a-z\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.\n * Optimized with an early-exit fast-path.\n */\nexport function sanitizeHtml(html: string | null | undefined): string {\n if (!html) return '';\n const sInit = String(html);\n\n if (!needsSanitization(sInit)) return sInit;\n\n let s = normalize(sInit);\n\n // 1. Tag Stripping (Recursive)\n if (s.includes('<')) {\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 // 2. Neutralization (Multi-pass but deterministic)\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 dangerous patterns in URL-bearing attributes or HTML sinks. */\nexport const isDangerousUrl = (attr: string, val: string): boolean => {\n const lowerAttr = attr.toLowerCase();\n if (!URL_ATTRS.has(lowerAttr)) return false;\n\n const normalized = normalize(val);\n\n // srcdoc is effectively an innerHTML sink for iframes\n if (lowerAttr === 'srcdoc') {\n return isDangerousHtmlContent(normalized);\n }\n\n return hasDangerousProtocol(normalized);\n};\n\n/** Checks for protocols/expressions inside CSS. */\nexport const isDangerousCssValue = (val: string): boolean => {\n return RE_DANGEROUS_CSS_SINGLE.test(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 } 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// Internal Helpers\n// ============================================================================\n\n/**\n * Validates attribute or property names against security policies.\n * Returns false if the name is blocked (on* handlers or dangerous sinks).\n */\nfunction isSafeBinding(name: string, isProp: boolean): boolean {\n const lower = name.toLowerCase();\n if (lower.startsWith('on')) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_EVENT_HANDLER(name)}`);\n return false;\n }\n if (isProp && DANGEROUS_PROPS.has(name)) {\n console.warn(`${LOG_PREFIXES.BINDING} ${ERROR_MESSAGES.SECURITY.BLOCKED_PROP(name)}`);\n return false;\n }\n return true;\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 }> = {};\n const cache: Record<string, string | null> = {};\n\n for (const name in attrMap) {\n if (!hasOwn.call(attrMap, name)) continue;\n if (!isSafeBinding(name, false)) continue;\n\n const lower = name.toLowerCase();\n safeMap[name] = attrMap[name]!;\n metaMap[name] = { isAria: lower.startsWith('aria-') };\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 prevValues: Record<string, unknown> = {};\n for (const name in propMap) {\n if (!hasOwn.call(propMap, name)) continue;\n if (!isSafeBinding(name, true)) continue;\n\n safeMap[name] = propMap[name]!;\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":"atom-effect-jquery.min.js","names":["toError"],"sources":["../src/constants.ts","../src/utils/index.ts","../src/utils/debug.ts","../src/core/namespace.ts","../../utils/dist/index.js","../src/core/registry.ts","../src/core/symbols.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/core/navigation.ts","../src/features/route/core.ts","../src/features/route/view.ts","../src/features/route/router.ts","../src/features/route/index.ts","../src/features/fetch.ts","../src/features/nav.ts","../src/features/web-component/utils.ts","../src/features/web-component/setup.ts","../src/features/web-component/state.ts","../src/features/web-component/index.ts","../src/core/jquery-patch.ts","../src/index.ts"],"sourcesContent":["import type { RouteConfig, ValOptions } from './types';\n\n/**\n * Centralized repository for library-wide constants, defaults, and error templates.\n *\n * Logic: Subsystem Organization\n * Consolidates global prefixes, defaults, and error templates into logical\n * namespaces. This organization ensures consistency across the library and\n * provides a central location for modifying system behavior.\n *\n * @internal\n */\n\n/** Constants for the core reactive engine. @internal */\nexport const SYSTEM_CORE = {\n ERRORS: {\n EFFECT_DISPOSE_ERROR: (i?: string) => `Dispose error${i ? `: ${i}` : ''}`,\n },\n} as const;\n\n/** Configuration and error templates for the routing subsystem. @internal */\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) satisfies Partial<RouteConfig>,\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\n/** Configuration and error templates for reactive bindings. @internal */\nexport const SYSTEM_BINDING = {\n PREFIX: '[atom-binding]',\n INPUT_DEFAULTS: Object.freeze({ event: 'input change', debounce: 0 } as const) satisfies Partial<\n ValOptions<unknown>\n >,\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\n/**\n * Constants for the security and sanitization engine.\n *\n * Logic: Sanitization Schema\n * Defines the properties and URI protocols considered inherently dangerous.\n * These constants form the basis of the library's XSS and DOM Clobbering\n * prevention strategy.\n *\n * @internal\n */\nexport const SYSTEM_SECURITY = {\n /** Property names that are blocked to prevent XSS and property hijacking. */\n DANGEROUS_PROPS: [\n 'innerHTML',\n 'outerHTML',\n 'srcdoc',\n '__proto__',\n 'constructor',\n 'prototype',\n ] as const satisfies readonly string[],\n /** Attributes that must be validated for dangerous URI protocols. */\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 satisfies readonly string[],\n /** Pattern for identifying malicious URI protocols. */\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\n/** Error templates for list rendering. @internal */\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\n/** Error templates for component mounting. @internal */\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\n/** Error templates for Web Components. @internal */\nexport const SYSTEM_COMPONENT = {\n PREFIX: '[atom-component]',\n ATTRS: {\n BIND: 'data-aej-bind',\n PART: 'data-aej-part',\n LEGACY_BIND: 'data-bind',\n },\n ERRORS: {\n NOT_REGISTERED: (tagName: string) => `Custom Element <${tagName}> is not registered.`,\n },\n} as const;\n\n/** Defaults for the visual debug system. @internal */\nexport const SYSTEM_DEBUG = {\n DEFAULTS: {\n HIGHLIGHT_DURATION_MS: 500,\n },\n} as const;\n","import type { RouteDefinition } from '@/types';\n\n/**\n * Determines if a value is a Promise or a thenable object.\n *\n * Logic: Duck-Typing\n * Uses a standard thenable check to identify asynchronous objects across\n * different implementation libraries.\n *\n * @internal\n */\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 concise, human-readable CSS selector for a DOM element.\n *\n * Logic: Element Signature\n * Prioritizes tag names, IDs, and class lists to create a reference string\n * for debugging and diagnostic logging.\n *\n * Caution: SVG Compatibility\n * SVG elements use `SVGAnimatedString` for the `className` property. This\n * method detects and unpacks `baseVal` to ensure consistent selector\n * generation across HTML and SVG namespaces.\n *\n * @internal\n */\nexport function getSelector(el: Element): string {\n const { localName: tag, id, className } = el;\n let res = tag;\n if (id) {\n res += `#${id}`;\n }\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) {\n res += `.${trimmed}`;\n }\n }\n\n const type = (el as { type?: string }).type;\n if (type && type !== 'text') {\n res += `.${type}`;\n }\n\n return res;\n}\n\n/**\n * Determines if a route is defined by a template selector.\n * @internal\n */\nexport const isTemplateRoute = (r: RouteDefinition): boolean =>\n r !== null && typeof r === 'object' && typeof r.template === 'string';\n\n/**\n * Determines if a route is defined by a custom render function.\n * @internal\n */\nexport const isRenderRoute = (r: RouteDefinition): boolean =>\n r !== null && typeof r === 'object' && typeof r.render === 'function';\n\n/**\n * Recursively flattens an object into a FormData instance.\n *\n * Logic: Nested Naming\n * Converts nested structures into bracket-notation strings (e.g., 'user[profile][name]')\n * to ensure compatibility with standard form parsers in most backend frameworks.\n *\n * @param fd - The FormData instance to populate.\n * @param prefix - The name prefix for the current path.\n * @param obj - The value to flatten.\n *\n * @internal\n */\nexport function flattenToFormData(fd: FormData, prefix: string, obj: unknown): void {\n if (typeof obj === 'object' && obj !== null && !(obj instanceof File) && !(obj instanceof Blob)) {\n for (const [k, v] of Object.entries(obj)) {\n const key = prefix ? `${prefix}[${k}]` : k;\n flattenToFormData(fd, key, v);\n }\n } else {\n fd.append(prefix, obj instanceof Blob ? obj : String(obj ?? ''));\n }\n}\n","import { SYSTEM_DEBUG } from '@/constants';\nimport { getSelector } from '@/utils';\n\n/** The data attribute used to identify and style elements under debug observation. @internal */\nconst ATTR_MARKER = 'data-atom-debug';\n\n/** Flag indicating if the current environment is a browser. @internal */\nconst IS_BROWSER = typeof window !== 'undefined';\n\n/**\n * Logic: Memory-Safe Animation Tracking\n * Uses `WeakMap` to store active Animation objects, allowing the browser\n * to manage the lifecycle of visual feedback without manual JS timers.\n * @internal\n */\nconst animations = new WeakMap<Element, Animation>();\n\n/** Internal flag to prevent redundant style injections. @internal */\nlet styleInjected = false;\n\n/**\n * Injects CSS utility classes for visual debugging into the document head.\n *\n * Optimization: Lazy Style Injection\n * Styles are injected only once per session and only upon the first\n * debug request. The highlight duration is synchronized with `DEBUG_DEFAULTS`\n * to maintain configuration consistency.\n *\n * @internal\n */\nfunction injectStyle(): void {\n if (styleInjected || !IS_BROWSER) return;\n const css = `\n [${ATTR_MARKER}] { outline: 0px solid transparent; transition: outline 0.1s ease-out; }\n @keyframes atom-flash {\n 0% { outline: 2px solid rgba(255, 68, 68, 0.9); outline-offset: 1px; }\n 100% { outline: 0px solid transparent; outline-offset: 1px; }\n }\n `.replace(/\\s+/g, ' ');\n\n if ('adoptedStyleSheets' in document && 'replaceSync' in CSSStyleSheet.prototype) {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n } else {\n const style = document.createElement('style');\n style.setAttribute(ATTR_MARKER, '');\n style.textContent = css;\n document.head.appendChild(style);\n }\n styleInjected = true;\n}\n\n/**\n * Determines the initial debug state based on environment variables and global flags.\n *\n * Logic: Priority Resolution\n * Precedence is established as: Manual Flag (`__ATOM_DEBUG__`) > Node Environment (`NODE_ENV`).\n *\n * @internal\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__ != null) {\n return !!g.__ATOM_DEBUG__;\n }\n return g.process?.env?.NODE_ENV !== 'production' && g.process?.env?.NODE_ENV != null;\n}\n\nconst IS_DEV = resolveInitialState();\n\n/**\n * Provides visual instrumentation and diagnostic logging for the reactive system.\n *\n * When to use:\n * - To debug reactive updates and DOM mutations in real-time.\n * - To inspect error causes and stack traces within binding hooks.\n *\n * Logic: Runtime Control\n * The `debug.enabled` flag can be toggled at runtime (e.g., via the browser console)\n * to activate or deactivate visual instrumentation without requiring a page reload.\n *\n * @example\n * ```typescript\n * // Enable visual highlights for DOM updates\n * $.debug.enabled = true;\n * ```\n */\nexport const debug = {\n /** Global toggle for the debug system. */\n enabled: IS_DEV,\n\n /** Logs a warning message with the standardized library prefix. */\n warn: (prefix: string, message: string, ...rest: unknown[]) =>\n console.warn(`${prefix} ${message}`, ...rest),\n\n /** Logs an error with the standardized library prefix and the associated cause. */\n error: (prefix: string, message: string, cause: unknown) =>\n console.error(`${prefix} ${message}`, cause),\n\n /**\n * Logs a DOM mutation and triggers a visual highlight on the target element.\n *\n * Logic: Mutation Tracking\n * When enabled, this method logs the property change and its new value to\n * the console, followed by a \"flash\" effect on the element to assist in\n * identifying the source of the mutation.\n *\n * @param prefix - The logging prefix.\n * @param target - The DOM element or JQuery collection that was updated.\n * @param type - The type of mutation (e.g., 'text', 'html', 'attr').\n * @param value - The new value applied to the target.\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\n // Safety: Instrumentation is skipped for elements not currently connected to the document.\n if (el?.nodeType === 1 && (el as Element).isConnected) {\n console.log(`${prefix} DOM updated: ${getSelector(el as Element)}.${type} =`, value);\n triggerVisualHighlight(el as Element);\n }\n },\n};\n\n/**\n * Manages the lifecycle of a visual highlight \"flash\" on a DOM element.\n *\n * Logic: Highlight Orchestration\n * Visual feedback is synchronized with the browser's paint cycle using\n * `requestAnimationFrame`. An idempotent debouncing strategy is implemented\n * using per-element `WeakMap` trackers to handle high-frequency updates\n * by canceling stale timers and animations before restarting the sequence.\n *\n * @param el - The element to highlight.\n * @internal\n */\nfunction triggerVisualHighlight(el: Element): void {\n if (!IS_BROWSER || typeof el.animate !== 'function') return;\n injectStyle();\n\n // Logic: Idempotent Animation Management\n // Cancel any existing debug animation before starting a new one.\n animations.get(el)?.cancel();\n\n if (!el.hasAttribute(ATTR_MARKER)) {\n el.setAttribute(ATTR_MARKER, '');\n }\n\n // Use Web Animations API (ES2015+) to offload timing to the browser.\n const anim = el.animate(\n [\n { outline: '2px solid rgba(255, 68, 68, 0.9)', outlineOffset: '1px' },\n { outline: '0px solid transparent', outlineOffset: '1px' },\n ],\n {\n duration: SYSTEM_DEBUG.DEFAULTS.HIGHLIGHT_DURATION_MS,\n easing: 'ease-out',\n }\n );\n\n animations.set(el, anim);\n anim.onfinish = () => animations.delete(el);\n}\n","import {\n aeNextTick,\n atom,\n atomLens,\n batch,\n composeLens,\n computed,\n effect,\n isAtom,\n isComputed,\n lensFor,\n mergeAtoms,\n mergeLenses,\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 update cycle has completed.\n *\n * When to use:\n * - To perform manual DOM measurements after reactive changes have been applied.\n * - To coordinate external library initializations that depend on the current DOM state.\n *\n * @returns A promise that resolves when the DOM has been synchronized with the latest state.\n */\nexport const nextTick = (): Promise<void> => aeNextTick();\n\n/**\n * Extends the global jQuery namespace with reactive state management primitives.\n *\n * Reason: This unified namespace allows developers to manage both reactive state\n * and DOM manipulation within the familiar `$` context, reducing the need for\n * additional imports and minimizing context switching.\n *\n * @example\n * ```typescript\n * // Reactive state management via the jQuery namespace\n * const count = $.atom(0);\n *\n * $.effect(() => {\n * $('#counter-label').text(`Current count: ${count.value}`);\n * });\n *\n * // Trigger an update\n * count.value++;\n * ```\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 mergeAtoms,\n mergeLenses,\n debug,\n});\n","// src/symbols.ts\nvar OPTION_SYMBOL = /* @__PURE__ */ Symbol.for(\"atom-effect.Option\");\nvar RESULT_SYMBOL = /* @__PURE__ */ Symbol.for(\"atom-effect.Result\");\n\n// src/option.ts\nvar NONE = Object.freeze({\n ok: false,\n value: void 0,\n [OPTION_SYMBOL]: true\n});\nvar Option = {\n /**\n * Creates a {@link Some} instance holding the provided value.\n */\n some: (value) => ({\n ok: true,\n value,\n [OPTION_SYMBOL]: true\n }),\n /**\n * A constant representing the absence of a value.\n */\n none: NONE,\n /**\n * Type guard to check if an {@link Option} contains a value.\n */\n isSome: (opt) => opt.ok,\n /**\n * Type guard to check if an {@link Option} is empty.\n */\n isNone: (opt) => !opt.ok,\n /**\n * Returns the value if present, otherwise throws an error with the provided message.\n */\n expect: (opt, message) => {\n if (opt.ok) return opt.value;\n throw new Error(message);\n },\n /**\n * Extracts the inner value if present.\n */\n unwrap: (opt) => {\n if (!opt.ok) throw new Error(\"Option.unwrap() on None\");\n return opt.value;\n },\n /**\n * Returns the inner value if present, otherwise returns a fallback value.\n */\n unwrapOr: (opt, fallback) => opt.ok ? opt.value : fallback,\n /**\n * Returns the inner value if present, otherwise computes a fallback value.\n */\n unwrapOrElse: (opt, fn) => opt.ok ? opt.value : fn(),\n /**\n * Transforms the inner value using the provided function if present.\n */\n map: (opt, fn) => {\n if (!opt.ok) return opt;\n const next = fn(opt.value);\n return next === opt.value ? opt : Option.some(next);\n },\n /**\n * Chains a function that returns another {@link Option}.\n */\n andThen: (opt, fn) => opt.ok ? fn(opt.value) : opt,\n /**\n * Creates an {@link Option} from a value that might be `null` or `undefined`.\n */\n fromNullable: (value) => value == null ? NONE : Option.some(value),\n /**\n * Executes a branch handler based on whether the option is {@link Some} or {@link None}.\n */\n match: (opt, branches) => opt.ok ? branches.some(opt.value) : branches.none(),\n /**\n * Returns {@link None} if the inner value does not satisfy the predicate.\n */\n filter: (opt, predicate) => opt.ok && predicate(opt.value) ? opt : NONE,\n /**\n * Checks for strict equality between two options.\n */\n equals: (a, b) => {\n if (a === b) return true;\n if (a.ok !== b.ok) return false;\n return !a.ok || a.value === b.value;\n },\n /**\n * Converts an {@link Option} to a nullable type.\n */\n toNullable: (opt) => opt.ok ? opt.value : null,\n /**\n * Converts an {@link Option} to an undefined type.\n */\n toUndefined: (opt) => opt.ok ? opt.value : void 0\n};\n\n// src/result.ts\nvar VOID_SUCCESS = Object.freeze({\n ok: true,\n value: void 0,\n error: void 0,\n [RESULT_SYMBOL]: true\n});\nfunction toError(e) {\n if (e instanceof Error) return e;\n const message = typeof e === \"string\" ? e : String(e ?? \"Unknown error\");\n return new Error(message);\n}\nvar Result = {\n /**\n * Creates a successful Result.\n */\n ok: (value) => {\n if (value === void 0) return VOID_SUCCESS;\n return {\n ok: true,\n value,\n error: void 0,\n [RESULT_SYMBOL]: true\n };\n },\n /**\n * Creates a failed Result.\n */\n err: (error) => ({\n ok: false,\n value: void 0,\n error,\n [RESULT_SYMBOL]: true\n }),\n /**\n * Type guard for Ok variant.\n */\n isOk: (res) => res.ok,\n /**\n * Type guard for Err variant.\n */\n isErr: (res) => !res.ok,\n /**\n * Exhaustively handles both possible states of a Result.\n */\n match: (res, matcher) => res.ok ? matcher.ok(res.value) : matcher.err(res.error),\n /**\n * Extracts the value if Ok, otherwise throws the error.\n */\n unwrap: (res) => {\n if (!res.ok) throw res.error;\n return res.value;\n },\n /**\n * Extracts the value if Ok, otherwise throws with a custom message.\n */\n expect: (res, msg) => {\n if (!res.ok) throw new Error(msg);\n return res.value;\n },\n /**\n * Returns the value if Ok, otherwise returns the fallback value.\n */\n unwrapOr: (res, fallback) => res.ok ? res.value : fallback,\n /**\n * Returns the value if Ok, otherwise computes a fallback via the provided function.\n */\n unwrapOrElse: (res, fn) => res.ok ? res.value : fn(res.error),\n /**\n * Transforms the inner value using the provided function if Ok.\n * Optimization: Returns the original instance if the value remains unchanged.\n */\n map: (res, fn) => {\n if (!res.ok) return res;\n const next = fn(res.value);\n return next === res.value ? res : Result.ok(next);\n },\n /**\n * Transforms the inner error using the provided function if Err.\n */\n mapErr: (res, fn) => res.ok ? res : Result.err(fn(res.error)),\n /**\n * Chains a function that returns another Result if Ok.\n */\n andThen: (res, fn) => res.ok ? fn(res.value) : res,\n /**\n * Wraps a synchronous function call that might throw.\n */\n tryCatch: (fn) => {\n try {\n return Result.ok(fn());\n } catch (e) {\n return Result.err(toError(e));\n }\n },\n /**\n * Wraps an asynchronous operation into a Result-bearing Promise.\n */\n tryAsync: (fn) => {\n try {\n const p = fn();\n return Promise.resolve(p).then(\n (value) => Result.ok(value),\n (error) => Result.err(toError(error))\n );\n } catch (e) {\n return Promise.resolve(Result.err(toError(e)));\n }\n },\n /**\n * Converts a Result to an Option, dropping the error data.\n */\n toOption: (res) => res.ok ? Option.some(res.value) : Option.none\n};\n\n// src/slot-buffer.ts\nvar FIRST_FREE_INDEX = [\n 0,\n 1,\n 0,\n 2,\n 0,\n 1,\n 0,\n 3,\n 0,\n 1,\n 0,\n 2,\n 0,\n 1,\n 0,\n -1\n];\nvar FAST_CAPACITY = 4;\nvar FAST_MASK = 15;\nvar SlotBuffer = class {\n constructor() {\n this._count = 0;\n this._actualCount = 0;\n this._mask = 0;\n this._s0 = null;\n this._s1 = null;\n this._s2 = null;\n this._s3 = null;\n this._overflow = null;\n this._freeIndices = null;\n this._lockCount = 0;\n this._pendingCompact = false;\n }\n /**\n * Optimization: Find the first free fast slot (0-3) using bit scanning.\n * @returns Index 0-3, or -1 if all fast slots are occupied.\n */\n _firstFreeSlot(mask) {\n return FIRST_FREE_INDEX[mask & FAST_MASK];\n }\n /**\n * Logic: Low-level write that synchronizes the occupancy mask.\n * Caution: Does not update _actualCount or _count. Use setAt for high-level operations.\n */\n _rawWrite(index, item) {\n if (index < FAST_CAPACITY) {\n const bit = 1 << index;\n if (item === null) this._mask &= ~bit;\n else this._mask |= bit;\n if (index === 0) this._s0 = item;\n else if (index === 1) this._s1 = item;\n else if (index === 2) this._s2 = item;\n else if (index === 3) this._s3 = item;\n } else {\n if (!this._overflow) this._overflow = [];\n this._overflow[index - FAST_CAPACITY] = item;\n }\n }\n /** Logic: Finds a vacant slot (prioritizing fast lanes) and fills it. */\n _rawAdd(item) {\n const mask = this._mask;\n const fastIdx = this._firstFreeSlot(mask);\n if (fastIdx !== -1) {\n this._mask = mask | 1 << fastIdx;\n if (fastIdx === 0) this._s0 = item;\n else if (fastIdx === 1) this._s1 = item;\n else if (fastIdx === 2) this._s2 = item;\n else this._s3 = item;\n return fastIdx;\n }\n if (!this._overflow) this._overflow = [];\n const ov = this._overflow;\n const free = this._freeIndices;\n if (free?.length) {\n const reuseIdx = free.pop();\n ov[reuseIdx] = item;\n return reuseIdx + FAST_CAPACITY;\n }\n ov.push(item);\n return FAST_CAPACITY - 1 + ov.length;\n }\n /** Swap the contents of two slots. */\n _rawSwap(idxA, idxB) {\n if (idxA === idxB) return;\n const a = this.at(idxA);\n const b = this.at(idxB);\n this._rawWrite(idxA, b);\n this._rawWrite(idxB, a);\n }\n /** Physical capacity (including null gaps). Safe for manual indexed loops. */\n get length() {\n return this._count;\n }\n /** Logical size (number of non-null items). */\n get size() {\n return this._actualCount;\n }\n /**\n * Retrieves the item at the given index.\n * @returns The item, or null if the slot is empty or out of bounds.\n */\n at(index) {\n if (index < FAST_CAPACITY) {\n if (index === 0) return this._s0;\n if (index === 1) return this._s1;\n if (index === 2) return this._s2;\n if (index === 3) return this._s3;\n return null;\n }\n const ov = this._overflow;\n return ov ? ov[index - FAST_CAPACITY] ?? null : null;\n }\n /**\n * Updates the item at a specific index.\n * Caution: Manual indexing can create gaps. Use compact() if order/density matters.\n */\n setAt(index, item) {\n const old = this.at(index);\n if (old === item) return;\n this._rawWrite(index, item);\n if (old === null) this._actualCount++;\n else if (item === null) this._actualCount--;\n if (item !== null) {\n if (index >= this._count) this._count = index + 1;\n } else {\n this._shrinkPhysicalSizeFrom(index);\n }\n }\n /**\n * Optimization: Trims trailing nulls to keep iterations efficient.\n * Logic: Only triggers if the removed item was at the physical tail of the buffer.\n */\n _shrinkPhysicalSizeFrom(index) {\n if (index !== this._count - 1) return;\n this._count--;\n if (this._count > FAST_CAPACITY) {\n const ov = this._overflow;\n while (this._count > FAST_CAPACITY && ov[this._count - (FAST_CAPACITY + 1)] == null) {\n this._count--;\n }\n }\n if (this._count <= FAST_CAPACITY) {\n this._count = 32 - Math.clz32(this._mask);\n }\n }\n /**\n * Efficiently clears all items from the given index to the end.\n */\n truncateFrom(index) {\n const limit = this._count;\n if (index >= limit) return;\n for (let i = index; i < limit; i++) {\n if (this.at(i) !== null) this._actualCount--;\n }\n if (index < FAST_CAPACITY) {\n this._mask &= (1 << index) - 1;\n if (index <= 0) this._s0 = null;\n if (index <= 1) this._s1 = null;\n if (index <= 2) this._s2 = null;\n if (index <= 3) this._s3 = null;\n this._overflow = null;\n } else if (this._overflow) {\n this._overflow.length = index - FAST_CAPACITY;\n }\n this._count = index;\n this._freeIndices = null;\n }\n /**\n * Adds an item to the first available hole or appends it.\n * @returns The index where the item was stored.\n */\n push(item) {\n const idx = this._rawAdd(item);\n if (idx >= this._count) this._count = idx + 1;\n this._actualCount++;\n return idx;\n }\n /**\n * Removes an item by identity.\n * Optimization: Checks fast slots before scanning the overflow array.\n * @returns True if the item was found and removed.\n */\n remove(item) {\n if (this._actualCount === 0) return false;\n const m = this._mask;\n if (m & 1 && this._s0 === item) return this._removeAt(0);\n if (m & 2 && this._s1 === item) return this._removeAt(1);\n if (m & 4 && this._s2 === item) return this._removeAt(2);\n if (m & 8 && this._s3 === item) return this._removeAt(3);\n const ov = this._overflow;\n if (ov) {\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) {\n ov[i] = null;\n this._actualCount--;\n this._shrinkPhysicalSizeFrom(i + FAST_CAPACITY);\n if (!this._freeIndices) this._freeIndices = [];\n this._freeIndices.push(i);\n return true;\n }\n }\n }\n return false;\n }\n _removeAt(index) {\n this._rawWrite(index, null);\n this._actualCount--;\n this._shrinkPhysicalSizeFrom(index);\n return true;\n }\n /** Return true if the buffer contains the given item. */\n has(item) {\n if (this._actualCount === 0) return false;\n const m = this._mask;\n if (m & 1 && this._s0 === item) return true;\n if (m & 2 && this._s1 === item) return true;\n if (m & 4 && this._s2 === item) return true;\n if (m & 8 && this._s3 === item) return true;\n const ov = this._overflow;\n if (ov) {\n for (let i = 0, len = ov.length; i < len; i++) {\n if (ov[i] === item) return true;\n }\n }\n return false;\n }\n /**\n * Iterates through all non-null items in order.\n * Optimization: Uses the occupancy mask to skip null slots in the fast lane.\n */\n forEach(fn) {\n if (this._actualCount === 0) return;\n const m = this._mask;\n if (m & 1) fn(this._s0);\n if (m & 2) fn(this._s1);\n if (m & 4) fn(this._s2);\n if (m & 8) fn(this._s3);\n const ov = this._overflow;\n if (ov) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const item = ov[i];\n if (item != null) fn(item);\n }\n }\n }\n /**\n * Returns true if at least one item satisfies the predicate.\n */\n some(predicate) {\n if (this._actualCount === 0) return false;\n const m = this._mask;\n if (m & 1 && predicate(this._s0)) return true;\n if (m & 2 && predicate(this._s1)) return true;\n if (m & 4 && predicate(this._s2)) return true;\n if (m & 8 && predicate(this._s3)) return true;\n const ov = this._overflow;\n if (ov) {\n for (let i = 0, len = ov.length; i < len; i++) {\n const item = ov[i];\n if (item != null && predicate(item)) return true;\n }\n }\n return false;\n }\n /**\n * Removes all gaps and shifts items toward the front.\n */\n compact() {\n if (this._lockCount > 0) {\n this._pendingCompact = true;\n return;\n }\n const actual = this._actualCount;\n const currentCount = this._count;\n if (actual === currentCount) return;\n if (actual === 0) {\n this.clear();\n return;\n }\n let writeIdx = 0;\n const ov = this._overflow;\n for (let readIdx = 0; readIdx < currentCount; readIdx++) {\n const item = this.at(readIdx);\n if (item !== null) {\n if (readIdx !== writeIdx) {\n this._rawWrite(writeIdx, item);\n this._rawWrite(readIdx, null);\n }\n if (++writeIdx === actual) break;\n }\n }\n this._count = actual;\n if (ov !== null) {\n if (writeIdx <= FAST_CAPACITY) this._overflow = null;\n else ov.length = writeIdx - FAST_CAPACITY;\n }\n this._freeIndices = null;\n this._pendingCompact = false;\n }\n /** Iteration lock. */\n lock() {\n this._lockCount++;\n }\n /** Iteration unlock. */\n unlock() {\n if (--this._lockCount === 0 && this._pendingCompact) {\n this.compact();\n }\n }\n /** Reset the buffer to an empty state. */\n clear() {\n this._s0 = this._s1 = this._s2 = this._s3 = null;\n this._count = 0;\n this._actualCount = 0;\n this._mask = 0;\n this._overflow = null;\n this._freeIndices = null;\n this._pendingCompact = false;\n }\n /** Alias for `clear`. */\n dispose() {\n this.clear();\n }\n /** @internal */\n get isLocked() {\n return this._lockCount > 0;\n }\n};\n\n// src/type-guard.ts\nfunction isPromise(value) {\n if (value instanceof Promise) return true;\n if (value === null || typeof value !== \"object\" && typeof value !== \"function\") {\n return false;\n }\n return typeof value.then === \"function\";\n}\nvar isOption = (val) => val != null && typeof val === \"object\" && val[OPTION_SYMBOL] === true;\nvar isResult = (val) => val != null && typeof val === \"object\" && val[RESULT_SYMBOL] === true;\n\n// src/index.ts\nvar hasOwn = Object.prototype.hasOwnProperty;\nfunction shallowEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (a === null || b === null || typeof a !== \"object\" || typeof b !== \"object\") {\n return false;\n }\n const objA = a;\n const objB = b;\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n 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 return true;\n}\nexport {\n Option,\n Result,\n SlotBuffer,\n hasOwn,\n isOption,\n isPromise,\n isResult,\n shallowEqual\n};\n","import { Option, Result, SlotBuffer } from '@but212/atom-effect-utils';\nimport { SYSTEM_BINDING, SYSTEM_CORE, SYSTEM_MOUNT } from '@/constants';\nimport type { EffectObject } from '@/types';\nimport { getSelector } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n/** Global flag determining if the automated MutationObserver safety net is active. */\nlet isAutoCleanupEnabled = true;\n\n/**\n * Configures whether the automated MutationObserver cleanup system is allowed to run.\n *\n * Logic: This provides explicit control over the global 'safety-net' observer,\n * allowing it to be disabled in environments or scenarios where manual\n * lifecycle management is strictly enforced.\n *\n * @param allowed - True to allow auto-cleanup, false to disable it.\n * @internal\n */\nexport function setAutoCleanupAllowed(allowed: boolean): void {\n isAutoCleanupEnabled = allowed;\n}\n\n/** Marker class used to identify elements with active reactive bindings. @internal */\nconst MARK_BOUND = '_aes-bound';\n/** Marker class used to identify elements hosting managed ShadowRoots. @internal */\nconst MARK_SHADOW = '_aes-has-shadow';\n\n/**\n * Represents the lifecycle metadata for a bound element.\n * @internal\n */\nexport interface BindingRecord {\n /**\n * A collection of individual cleanup tasks (e.g., effect disposals).\n * Optimization: Uses SlotBuffer to minimize heap allocations for small\n * collections (1-4 items), which represents the vast majority of use cases.\n */\n tasks?: SlotBuffer<() => void>;\n /** An optional component-level teardown function. */\n teardown?: (() => void) | undefined;\n}\n\n/**\n * The central registry for managing reactive resources and element lifecycles.\n *\n * Logic: Safety & Memory Management\n * - WeakMap Storage: Binding records are stored in `WeakMap` instances to avoid\n * holding strong references to DOM elements. This allows the garbage collector\n * to reclaim memory even if elements are not explicitly unmounted.\n * - Flag System: `WeakSet` is used for `keep` and `ignored` states to ensure that\n * metadata does not leak for nodes that are removed without a cleanup call.\n * - Performance: The registry uses CSS markers (`_aes-bound`, `_aes-has-shadow`)\n * to perform high-speed scoped queries (`querySelectorAll`) during tree\n * disposal, avoiding expensive full-tree traversals.\n *\n * @internal\n */\nclass BindingRegistry {\n private records = new WeakMap<Element, BindingRecord>();\n\n private kept = new WeakSet<Node>();\n\n private ignored = new WeakSet<Node>();\n\n private shadows = new WeakMap<Element, ShadowRoot>();\n\n private autoCleanupScheduled = false;\n\n /**\n * Marks a node to preserve its reactive resources even if detached from the DOM.\n * (e.g., used by jQuery's `.detach()` method).\n */\n keep(node: Node): void {\n this.kept.add(node);\n }\n\n /** Determines if a node is marked for resource preservation. */\n isKept(node: Node): boolean {\n return this.kept.has(node);\n }\n\n /**\n * Marks a node to be ignored by the next automated cleanup cycle.\n * This prevents redundant cleanup calls during complex DOM manipulations.\n */\n markIgnored(node: Node): void {\n this.ignored.add(node);\n }\n\n /** Determines if a node is currently marked to be ignored. */\n isIgnored(node: Node): boolean {\n return this.ignored.has(node);\n }\n\n /**\n * Removes the 'ignored' flag, re-enabling standard cleanup logic for the node.\n * @internal\n */\n unmarkIgnored(node: Node): void {\n this.ignored.delete(node);\n }\n\n /** @internal */\n isAutoCleanupScheduled(): boolean {\n return this.autoCleanupScheduled;\n }\n\n /** @internal */\n setAutoCleanupScheduled(scheduled: boolean): void {\n this.autoCleanupScheduled = scheduled;\n }\n\n /**\n * Performs a move-aware cleanup of a node and its descendants.\n *\n * Logic: Deferring the cleanup to a microtask allows elements to be\n * disconnected and then immediately reconnected (moved) without\n * losing their reactive state.\n *\n * @param node - The node to tentatively clean up.\n */\n deferCleanup(node: Node): void {\n this.ignored.add(node);\n queueMicrotask(() => {\n if (node.isConnected) {\n this.ignored.delete(node);\n } else {\n this.cleanupTree(node);\n }\n });\n }\n\n /**\n * Registers a ShadowRoot to a host element for AEJ lifecycle tracking.\n *\n * @param host - The host element.\n * @param sr - The ShadowRoot (can be 'open' or 'closed').\n * @internal\n */\n registerShadow(host: Element, sr: ShadowRoot): void {\n this.shadows.set(host, sr);\n }\n\n /**\n * Safely adds a CSS marker to an element, deferring if it's currently being constructed.\n */\n private safeMark(element: Element, className: string): void {\n if (element.isConnected) {\n element.classList.add(className);\n } else {\n // Logic: Defer class modification to avoid NotSupportedError/DOMException\n // during Custom Element construction (attributes cannot be set in constructor).\n queueMicrotask(() => element.classList.add(className));\n }\n }\n\n /**\n * Marks a host element to indicate it possesses a managed ShadowRoot.\n *\n * Optimization: This adds a CSS marker used by `cleanupDescendants` to\n * locate isolated Shadow DOM trees efficiently without full-tree traversal.\n *\n * @param host - The host element to mark.\n * @internal\n */\n markHost(host: Element): void {\n this.safeMark(host, MARK_SHADOW);\n }\n\n /**\n * Retrieves the ShadowRoot for a host element, including tracked 'closed' roots.\n * @internal\n */\n getShadow(host: Element): ShadowRoot | null {\n return Option.unwrapOr(\n Option.fromNullable(host.shadowRoot),\n Option.toNullable(Option.fromNullable(this.shadows.get(host)))\n );\n }\n\n /**\n * Retrieves or initializes the binding record for a specific element.\n *\n * Logic: The auto-cleanup MutationObserver is lazily initialized when\n * the first reactive binding is registered in the document.\n */\n private getOrCreateRecord(element: Element): BindingRecord {\n if (\n isAutoCleanupEnabled &&\n !this.autoCleanupScheduled &&\n typeof document !== 'undefined' &&\n document.body\n ) {\n this.autoCleanupScheduled = true;\n enableAutoCleanup(document.body);\n }\n\n return Option.unwrapOrElse(Option.fromNullable(this.records.get(element)), () => {\n const result: BindingRecord = {};\n this.records.set(element, result);\n this.safeMark(element, MARK_BOUND);\n return result;\n });\n }\n\n /** Internal helper to append a cleanup task to an element's record. */\n private addCleanup(element: Element, cleanupFunction: () => void): void {\n const record = this.getOrCreateRecord(element);\n if (!record.tasks) {\n record.tasks = new SlotBuffer<() => void>();\n }\n record.tasks.push(cleanupFunction);\n }\n\n /**\n * Registers a reactive effect to be tracked and disposed with the element.\n *\n * Constraint: Effects must be registered to ensure synchronous disposal\n * when the host element is destroyed or unmounted.\n *\n * @param element - The host element.\n * @param effect - The reactive effect object.\n */\n trackEffect(element: Element, effect: EffectObject): void {\n const selector = getSelector(element);\n this.addCleanup(element, () => {\n const res = Result.tryCatch(() => effect.dispose());\n if (!res.ok) {\n debug.error(\n SYSTEM_BINDING.PREFIX,\n SYSTEM_CORE.ERRORS.EFFECT_DISPOSE_ERROR(selector),\n res.error\n );\n }\n });\n }\n\n /** Registers a generic cleanup function to be executed with the element. @internal */\n onCleanup(element: Element, cleanupFunction: () => void): void {\n const selector = getSelector(element);\n this.addCleanup(element, () => {\n const res = Result.tryCatch(() => cleanupFunction());\n if (!res.ok) {\n debug.error(\n SYSTEM_BINDING.PREFIX,\n SYSTEM_BINDING.ERRORS.CLEANUP_ERROR(selector),\n res.error\n );\n }\n });\n }\n\n /** Assigns a component-level teardown function to an element. @internal */\n setTeardown(element: Element, teardownFunction: (() => void) | undefined): void {\n this.getOrCreateRecord(element).teardown = teardownFunction;\n }\n\n /** Determines if an element has any active bindings. */\n hasBind(element: Element): boolean {\n return this.records.has(element);\n }\n\n /**\n * Disposes of all reactive resources associated with a single node.\n *\n * @param node - The node to clean up.\n */\n cleanup(node: Node): void {\n this.kept.delete(node);\n this.ignored.delete(node);\n\n if (node.nodeType !== 1) return;\n const element = node as Element;\n\n const recordOpt = Option.fromNullable(this.records.get(element));\n\n if (Option.isSome(recordOpt)) {\n const record = recordOpt.value;\n this.records.delete(element);\n element.classList.remove(MARK_BOUND);\n\n // Execute component teardown if present\n Option.match(Option.fromNullable(record.teardown), {\n some: (teardown) => {\n const res = Result.tryCatch(() => teardown());\n if (!res.ok) {\n const selector = getSelector(element);\n debug.error(\n SYSTEM_MOUNT.PREFIX,\n SYSTEM_MOUNT.ERRORS.CLEANUP_ERROR(selector),\n res.error\n );\n }\n },\n none: () => {},\n });\n\n // Execute and dispose of all cleanup tasks\n Option.match(Option.fromNullable(record.tasks), {\n some: (tasks) => {\n tasks.forEach((cleanupFunction) => cleanupFunction());\n tasks.dispose();\n },\n none: () => {},\n });\n } else {\n // Logic: Ensure idempotency. If no record exists, just remove the marker class.\n element.classList.remove(MARK_BOUND);\n }\n }\n\n /**\n * Efficiently cleans up reactive bindings within a DOM subtree.\n *\n * Logic: Snapshot Strategy\n * This method uses `querySelectorAll` to obtain a static snapshot of bound\n * elements before iteration begins. This ensures stability and prevents\n * missed nodes if the DOM structure or classes are modified during cleanup.\n *\n * @param root - The root of the subtree or fragment to clean up.\n */\n cleanupDescendants(root: Element | DocumentFragment | ShadowRoot): void {\n const nodes = root.querySelectorAll(`.${MARK_BOUND}`);\n\n for (let i = 0, length = nodes.length; i < length; i++) {\n const node = nodes[i];\n if (node) {\n this.cleanup(node);\n }\n }\n\n // Optimization: Marker-based traversal\n // Instead of a full-tree walk, we jump directly to hosts known to possess\n // managed ShadowRoots to perform recursive cleanup.\n const shadowHosts = root.querySelectorAll(`.${MARK_SHADOW}`);\n for (let i = 0, length = shadowHosts.length; i < length; i++) {\n const el = shadowHosts[i] as Element;\n const sr = this.getShadow(el);\n if (sr) {\n this.cleanupTree(sr);\n }\n }\n }\n\n /**\n * Performs a deep recursive cleanup of a node and all its internal subtrees (including Shadow DOM).\n * @internal\n */\n cleanupTree(node: Node): void {\n if (node.nodeType === 1 || node.nodeType === 11) {\n const root = node as Element | DocumentFragment | ShadowRoot;\n this.cleanupDescendants(root);\n\n // Constraint: Shadow DOM trees must be cleaned recursively as they are\n // isolated from standard query selectors.\n if (node.nodeType === 1) {\n const sr = this.getShadow(node as Element);\n if (sr) {\n this.cleanupTree(sr);\n }\n }\n }\n this.cleanup(node);\n }\n}\n\n/** The global instance of the BindingRegistry. */\nexport const registry = new BindingRegistry();\n\n/** Mapping of root nodes to their associated MutationObservers for auto-cleanup. */\nconst observerMap = new Map<Node, MutationObserver>();\n\n/**\n * Initializes an automated MutationObserver safety net for a specific root.\n *\n * Logic: DOM Safety Net\n * Standard browser operations (e.g., setting `innerHTML = ''`) bypass jQuery's\n * internal hooks. This observer acts as a fallback, detecting removed nodes\n * that were not processed by patched jQuery methods.\n *\n * @param root - The DOM element or fragment to monitor.\n * @internal\n */\nexport function enableAutoCleanup(root: Element | ShadowRoot | DocumentFragment): void {\n if (observerMap.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: Clean up only elements that are genuinely disconnected\n // from the document and are not marked for preservation.\n if (node.nodeType !== 1 || (node as Element).isConnected) {\n continue;\n }\n\n const element = node as Element;\n if (registry.isKept(element) || registry.isIgnored(element)) {\n continue;\n }\n\n registry.cleanupTree(element);\n }\n }\n });\n\n observer.observe(root, { childList: true, subtree: true });\n observerMap.set(root, observer);\n}\n\n/**\n * Disconnects and destroys all registered auto-cleanup observers.\n * @internal\n */\nexport function disableAutoCleanup(): void {\n observerMap.forEach((observer) => observer.disconnect());\n observerMap.clear();\n registry.setAutoCleanupScheduled(false);\n}\n\n/**\n * Disconnects the auto-cleanup observer for a specific root node.\n *\n * Logic: Scoped Disposal\n * This is used to release strong references held by the registry to specific\n * boundaries (e.g., ShadowRoots) to prevent memory leaks when components\n * are permanently removed.\n *\n * @param root - The specific node to stop monitoring.\n * @internal\n */\nexport function disableAutoCleanupFor(root: Node): void {\n const observer = observerMap.get(root);\n if (observer) {\n observer.disconnect();\n observerMap.delete(root);\n }\n}\n","/** Symbol used to mark a DOM element as hydrated with reactive bindings. */\nexport const HYDRATION_MARKER = Symbol.for('aej:hydrated');\n\n/** Symbol used to indicate that an element has an active lifecycle MutationObserver attached. */\nexport const CLEANUP_MARKER = Symbol.for('aej:cleanup-enabled');\n\n/**\n * Event name used for the bubbling context discovery mechanism.\n *\n * Logic: Dependency Injection\n * Descendant elements dispatch this event to locate reactive providers\n * higher in the DOM tree, including across Shadow DOM boundaries.\n */\nexport const CONTEXT_REQUEST = 'aej:context-request';\n\n/**\n * Payload structure for context discovery events.\n * @internal\n */\nexport interface ContextRequestDetail {\n /** The unique key or symbol of the requested context. */\n key: string | symbol;\n /** A callback executed by the provider to deliver the reactive value. */\n callback: (atom: unknown) => void;\n}\n\n/**\n * A unique symbol used to mark event handlers as already wrapped in a batch.\n *\n * Reason: Batch Coalescing\n * This prevents redundant nested `batch()` calls when re-binding\n * handlers or during multiple patch cycles, maintaining flat execution stacks.\n *\n * @internal\n */\nexport const INTERNAL_HANDLER = Symbol.for('atom-effect-internal');\n","import type {\n AtomOptions as BaseAtomOptions,\n ComputedAtom,\n ComputedOptions,\n Dependency,\n EffectObject,\n MergedDependencyValue,\n ReadonlyAtom,\n WritableAtom,\n} from '@but212/atom-effect';\n\n/** A function that performs cleanup tasks for a reactive effect or component. */\nexport type EffectCleanup = () => void;\n\n/** Represents the unmounting phase of a component's lifecycle. */\nexport interface ComponentLifecycle {\n /** Cleanup task executed during the unmount phase. */\n unmount: EffectCleanup;\n}\n\n/** The result of a reactive effect function, which may include cleanup logic. */\nexport type EffectResult = undefined | EffectCleanup | ComponentLifecycle;\n\n/** A function used to determine equality between two reactive values. */\nexport type EqualFn<T> = (a: T, b: T) => boolean;\n\n/**\n * Configuration options for creating reactive atoms.\n *\n * @public\n */\nexport interface AtomOptions extends BaseAtomOptions {\n /** Optional name for debugging and diagnostic purposes. */\n name?: string;\n /** Whether to trigger updates synchronously. Default is false (batched). */\n sync?: boolean;\n}\n\n/**\n * A value that can be a static literal, a reactive atom, or a getter function.\n *\n * Logic: Polymorphic Input\n * Supports raw values for static initialization, reactive atoms for state-driven\n * updates, or functional getters for deferred execution of complex logic.\n *\n * @public\n */\nexport type ReactiveValue<T> = T | ReadonlyAtom<T> | (() => T);\n\n/**\n * A value that can be a static literal, a reactive atom, a promise, or a getter\n * function that returns any of these.\n *\n * When to use:\n * - CSS or Attribute bindings that require data from an asynchronous source.\n * - Integration with fetch-based reactive atoms where values resolve over time.\n *\n * @public\n */\nexport type AsyncReactiveValue<T> =\n | T\n | ReadonlyAtom<T | Promise<T>>\n | Promise<T>\n | (() => T | Promise<T>);\n\n/** Supported primitive types for attribute and property bindings. */\nexport type PrimitiveValue = string | number | boolean | null | undefined;\n\n/** A CSS property value or a tuple containing a value and its unit (e.g., [10, 'px']). */\nexport type CssValue =\n | AsyncReactiveValue<string | number>\n | [source: AsyncReactiveValue<number>, unit: string];\n\n/** A mapping of CSS property names to their reactive values. */\nexport type CssBindings = Record<string, CssValue>;\n\n/**\n * Declaration of reactive bindings for a DOM element.\n *\n * Logic: Binding Strategy Map\n * Maps reactive sources to specific DOM manipulation strategies (text, class,\n * val, etc.). This declarative structure allows the engine to batch updates\n * and optimize resource cleanup automatically.\n *\n * @public\n */\nexport interface BindingOptions<T = unknown> {\n /** Binds the element's text content. Can include an optional formatter. */\n text?:\n | AsyncReactiveValue<unknown>\n | [source: AsyncReactiveValue<unknown>, formatter: (v: unknown) => string];\n /** Binds the element's inner HTML. Use with caution for untrusted content. */\n html?: AsyncReactiveValue<string>;\n /** Toggles CSS classes based on reactive conditions. */\n class?: Record<string, AsyncReactiveValue<boolean>>;\n /** Binds CSS styles reactively. */\n css?: CssBindings;\n /** Binds HTML attributes reactively. */\n attr?: Record<string, AsyncReactiveValue<PrimitiveValue>>;\n /** Binds DOM properties reactively. */\n prop?: Record<string, AsyncReactiveValue<unknown>>;\n /** Toggles element visibility (`display: block/none`) based on a condition. */\n show?: AsyncReactiveValue<boolean>;\n /** Hides the element (`display: none`) when the condition is true. */\n hide?: AsyncReactiveValue<boolean>;\n /** Two-way binding for form input values. */\n val?: WritableAtom<T> | [atom: WritableAtom<T>, options: ValOptions<T>];\n /** Two-way binding for checkbox and radio checked states. */\n checked?: WritableAtom<boolean>;\n /** Orchestrates two-way bindings for an entire form element. */\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 /** Registers event listeners with automatic lifecycle management. */\n on?: Record<string, (e: JQuery.Event) => void>;\n}\n\n/** A writable atom that includes an explicit disposal mechanism. @internal */\nexport interface DisposableWritableAtom<T> extends WritableAtom<T> {\n /** Releases all reactive resources and observers associated with the atom. */\n dispose(): void;\n}\n\n/** Supported key types for identifying items in a reactive list. */\nexport type ListKey = string | number;\n\n/** Valid return types for a list item render function. */\nexport type ListRenderResult = string | Element | DocumentFragment | JQuery;\n\n/** A function that extracts a unique identity key from a list item. */\nexport type ListKeyFn<T> = (item: T, index: number) => ListKey;\n\n/**\n * Configuration options for reactive list rendering.\n *\n * Optimization: DOM Reconciliation\n * Uses unique keys for identity tracking to minimize DOM churn by reordering\n * existing elements instead of re-rendering the entire list when data changes.\n *\n * @public\n */\nexport interface ListOptions<T> {\n /** The property name or function used to extract unique keys. */\n key: keyof T | ListKeyFn<T>;\n /** Function to generate the DOM representation for an item. */\n render: (item: T, index: number) => ListRenderResult;\n /** Optional callback to apply bindings to the rendered element. */\n bind?: ($el: JQuery, item: T, index: number) => void;\n /** Optional callback triggered when an item's data is updated. */\n update?: ($el: JQuery, item: T, index: number) => void;\n /** Callback triggered when a new element is added to the list. */\n onAdd?: ($el: JQuery) => void;\n /** Callback triggered when an element is removed (can be used for transitions). */\n onRemove?: ($el: JQuery) => Promise<void> | void;\n /** Content to display when the list is empty. */\n empty?: ListRenderResult;\n /** Event handlers bound to individual list items. */\n events?: Record<string, (item: T, index: number, e: JQuery.TriggeredEvent) => void>;\n /** Optional function for custom item equality checks. */\n isEqual?: (a: T, b: T) => boolean;\n}\n\n/** Options for customizing two-way value bindings. */\nexport interface ValOptions<T> {\n /** Time in milliseconds to delay atom synchronization after user input. */\n debounce?: number;\n /** The DOM event used to trigger synchronization (e.g., 'change'). */\n event?: string;\n /** Function to parse the DOM string value into the atom's type. */\n parse?: (v: string) => T;\n /** Function to format the atom's value for DOM display. */\n format?: (v: T) => string;\n /** Function for custom value equality checks. */\n equal?: EqualFn<T>;\n}\n\n/** Options for orchestrating form-wide reactive synchronization. */\nexport interface FormOptions<T> extends ValOptions<T> {\n /** Function to transform field values based on their object path before synchronization. */\n transform?: (path: string, value: unknown) => unknown;\n /** Callback triggered whenever any field in the form changes. */\n onChange?: (path: string, value: unknown) => void;\n /** Reactive validation schema mapping paths to validators. */\n validation?: Record<string, (val: unknown) => string | boolean>;\n}\n\n/** Configuration for reactive AJAX requests. */\nexport interface FetchOptions<T> {\n /** The value returned while the request is pending or if it fails. */\n defaultValue: T;\n /** Optional name for debugging and diagnostic logging. */\n name?: string;\n /** HTTP method to use for the request. */\n method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'HEAD' | 'OPTIONS' | (string & {});\n /** Custom HTTP headers to include in the request. */\n headers?: Record<string, string>;\n /** Function to transform the raw response before it is stored in the atom. */\n transform?: (raw: unknown, xhr: JQuery.jqXHR) => T | Promise<T>;\n /** Direct overrides for the underlying jQuery AJAX settings. */\n ajaxOptions?: JQuery.AjaxSettings | (() => JQuery.AjaxSettings);\n /** Callback triggered when the request fails. */\n onError?: (err: unknown) => void;\n /** Whether to trigger the initial request immediately upon creation. */\n eager?: boolean;\n}\n\n/** An error object containing the source jqXHR for diagnostic purposes. */\nexport interface FetchError extends Error {\n /** The underlying jQuery XHR object that caused the error. */\n jqXHR?: JQuery.jqXHR;\n}\n\n/** Definition for a mountable component that manages its own reactive lifecycle. */\nexport type ComponentFn<P = Record<string, unknown>> = ($el: JQuery, props: P) => EffectResult;\n\n/** Lifecycle hooks for navigating between application routes. */\nexport interface RouteLifecycle {\n /**\n * Hook triggered before entering a route.\n * Returning false aborts the navigation.\n */\n onEnter?: (\n params: Record<string, string>,\n router: Router\n ) => Record<string, string> | undefined | false;\n /**\n * Hook triggered before leaving the current route.\n * Returning false prevents navigation away.\n */\n onLeave?: (router: Router) => boolean | undefined;\n /** Optional document title for the route. */\n title?: string;\n /** Optional metadata tags for the route (e.g., description, keywords). */\n meta?: Record<string, string>;\n}\n\n/** Definition of a specific application route and its rendering logic. */\nexport interface RouteDefinition extends RouteLifecycle {\n /** Selector for a template fragment to be cloned and rendered. */\n template?: string;\n /** Custom function to render the route content into the container. */\n render?: (\n container: HTMLElement,\n route: string,\n params: Record<string, string>,\n onUnmount: (cleanupFn: () => void) => void,\n router: Router\n ) => void;\n /** Callback triggered after the route content has been mounted to the DOM. */\n onMount?: ($content: JQuery, onUnmount: (cleanupFn: () => void) => void, router: Router) => void;\n}\n\n/** Global configuration for the reactive router. */\nexport interface RouteConfig {\n /** The root element or selector where route content will be injected. */\n target: string | JQuery<HTMLElement> | HTMLElement;\n /** The default path to navigate to if no route matches. */\n default?: string;\n /** Mapping of path patterns to route definitions. */\n routes?: Record<string, RouteDefinition>;\n /** Synchronization mode: 'hash' or HTML5 'history' API. */\n mode?: 'hash' | 'history';\n /** Base path for the application (useful for history mode). */\n basePath?: string;\n /** Path to navigate to when a requested route is not found. */\n notFound?: string;\n /** Whether to automatically intercept and route link clicks. */\n autoBindLinks?: boolean;\n /** CSS class applied to navigation elements matching the active route. */\n activeClass?: string;\n /** Callback triggered immediately before a navigation transition starts. */\n beforeTransition?: (from: string, to: string) => void;\n /** Callback triggered after a navigation transition has completed. */\n afterTransition?: (from: string, to: string) => void;\n}\n\n/** Represents a structured navigation location. */\nexport interface RouteLocation {\n /** The normalized path part of the URL. */\n path: string;\n /** Key-value pairs of query string parameters. */\n query: Record<string, string>;\n /** Extracted parameters from dynamic segments (e.g., :id). */\n params: Record<string, string>;\n}\n\n/** Interface for programmatically interacting with the application router. */\nexport interface Router {\n /** Reactive atom containing the current route name. */\n currentRoute: ReadonlyAtom<string>;\n /** Reactive atom containing the current query string parameters. */\n queryParams: ReadonlyAtom<Record<string, string>>;\n /** Reactive atom containing the extracted path parameters. */\n params: ReadonlyAtom<Record<string, string>>;\n /** Reactive atom providing a unified snapshot of the current location. */\n location: ReadonlyAtom<RouteLocation>;\n /** Programmatically navigates to the specified path or location object. */\n navigate: (to: string | Partial<RouteLocation>) => void;\n /** Shuts down the router and releases all observers. */\n destroy: () => void;\n}\n\n/** Options for AJAX-based fragment navigation. */\nexport interface AtomNavOptions {\n /** The target container for injected content. */\n target: string | JQuery<HTMLElement> | HTMLElement;\n /** Optional sub-selector to extract from the loaded document. */\n selector?: string;\n /** Custom HTTP headers for navigation requests. */\n headers?: Record<string, string>;\n /** Hook triggered before a navigation request is initiated. */\n onBeforeLoad?: (url: string) => boolean | undefined | Promise<boolean | undefined>;\n /** Callback triggered after the content has been injected. */\n onMount?: ($container: JQuery, url: string) => void;\n /** Callback triggered before content is replaced. */\n onUnmount?: ($container: JQuery, oldUrl: string) => void;\n /** Callback for handling navigation errors. */\n onError?: (err: unknown, url: string) => boolean | undefined;\n /** Whether to reset scroll position to the top after navigation. */\n scrollToTop?: boolean;\n /** Whether to synchronize the document title with the loaded page. */\n syncTitle?: boolean;\n /** Optional window context for cross-origin navigation. */\n window?: Window & typeof globalThis;\n}\n\n/** Interface for managing AJAX fragment navigation. */\nexport interface AtomNav {\n /** Reactive atom containing the currently loaded URL. */\n currentUrl: ReadonlyAtom<string>;\n /** Reactive atom indicating whether a navigation request is in progress. */\n isPending: ReadonlyAtom<boolean>;\n /** Reactive atom indicating whether the last navigation failed. */\n hasError: ReadonlyAtom<boolean>;\n /** Navigates to a specific URL and replaces the container content. */\n navigate(url: string, options?: { replace?: boolean }): Promise<void>;\n /** Disposes of the navigation manager and observers. */\n destroy: () => void;\n}\n\n/**\n * Internal state flags for two-way bindings.\n *\n * Logic: Feedback Loop Protection\n * Prevents recursive update loops between the DOM and reactive atoms\n * during two-way data flow (e.g., IME composition or rapid input events).\n *\n * @internal\n */\nexport enum BindingFlags {\n /** No active synchronization or interaction. */\n None = 0,\n /** The input element is currently focused by the user. */\n Focused = 1 << 0,\n /** The user is currently performing IME composition. */\n Composing = 1 << 1,\n /** Synchronization from DOM to Atom is currently active. */\n SyncingToAtom = 1 << 2,\n /** Synchronization from Atom to DOM is currently active. */\n SyncingToDom = 1 << 3,\n /** The binding is considered busy and will ignore external updates. */\n Busy = Composing | SyncingToAtom | SyncingToDom,\n}\n\n/**\n * Options for customizing jQuery core method overrides.\n *\n * @public\n */\nexport interface PatchOptions {\n /**\n * Automatically wraps .on()/.one() callbacks in $.batch() for reactivity.\n * @default true\n */\n events?: boolean;\n /**\n * Hooks .remove()/.empty()/.detach() for automatic resource cleanup.\n * @default true\n */\n lifecycle?: boolean;\n}\n\n/**\n * Global configuration settings for the library.\n *\n * @public\n */\nexport interface AEJConfig {\n /**\n * Configuration for jQuery prototype patches.\n * Set to false to disable all automated overrides.\n */\n patch?: boolean | PatchOptions;\n /**\n * Configuration for the automated MutationObserver cleanup system.\n * Set to false to manage reactive resource disposal manually.\n */\n autoCleanup?: boolean | { root: Element | ShadowRoot | DocumentFragment };\n}\n\n/**\n * A scoped version of the jQuery selector function.\n *\n * Logic: Scope Enforcement\n * Restricts element selection to the component's internal DOM tree (ShadowRoot\n * or host container) to ensure encapsulation and prevent cross-component leaks.\n *\n * @public\n */\nexport type JQueryScopedSelector = (\n selector: string | JQuery | HTMLElement,\n context?: Element | Document | JQuery | ShadowRoot | DocumentFragment\n) => JQuery;\n\n/**\n * Composition-based controller for managing a component's reactive lifecycle.\n *\n * When to use:\n * - To build Custom Elements that require reactive attribute and slot synchronization.\n * - To manage complex component lifecycles with automated resource disposal.\n * - To provide or inject reactive state across Shadow DOM boundaries.\n *\n * @public\n */\nexport interface AtomComponentController {\n /** The raw host element of the component. */\n readonly host: HTMLElement;\n /** The active root node (ShadowRoot or Host container). */\n readonly root: Node | null;\n /**\n * Scoped jQuery selector.\n * Limited to selecting elements within the component's encapsulated DOM.\n */\n readonly $: JQueryScopedSelector;\n\n /**\n * Factory function that returns a reactive lens atom for a specific HTML attribute.\n * Accessing a name returns a WritableAtom<string | null>.\n */\n readonly attrs: (name: string) => WritableAtom<string | null>;\n\n /**\n * Factory function that returns a reactive lens atom for a specific Shadow DOM slot.\n * Provides ReadonlyAtom<Node[]> for each named slot (or 'default' for unnamed).\n */\n readonly slots: (name: string) => ReadonlyAtom<Node[]>;\n\n /**\n * Access to the component's internal state and accessibility properties via ElementInternals.\n * Available only if the browser supports attachInternals().\n */\n readonly internals?: ElementInternals | undefined;\n\n /** Registers a reactive provider on this element for dependency injection. */\n provideAtom<T = unknown>(key: string | symbol, val: T): void;\n /** Injects a reactive value provided by an ancestor element. */\n injectAtom<T = unknown>(key: string | symbol): WritableAtom<T> | null;\n\n /**\n * Initializes the component's reactive lifecycle and observers.\n *\n * Logic: Hybrid Options\n * Accepts a raw ShadowRoot for traditional usage or a configuration object\n * for declarative hydration and automatic event dispatching.\n *\n * @param options - ShadowRoot or configuration object for hydration and event dispatching.\n */\n setup(\n options?:\n | ShadowRoot\n | {\n shadowRoot?: ShadowRoot;\n /** Maps event names to atoms or getter functions for automatic dispatching. */\n dispatch?: Record<string, ReactiveValue<unknown>>;\n /** Maps data-bind keys to atoms for declarative DOM hydration. */\n bind?: Record<string, ReadonlyAtom<unknown>>;\n /**\n * Constructable stylesheets to be shared across instances.\n * Strings are automatically converted to shared CSSStyleSheet objects.\n */\n styles?: (string | CSSStyleSheet)[];\n /**\n * Reactive accessibility bindings via AriaMixin (ElementInternals).\n * Maps ARIA properties (e.g., 'ariaExpanded') to atoms.\n */\n aria?: Record<string, ReadonlyAtom<unknown>>;\n /**\n * Reactive CSS Part bindings.\n * Maps element selectors or data-aej-part keys to atoms for dynamic part names.\n */\n parts?: Record<string, ReadonlyAtom<string | string[] | Record<string, boolean>>>;\n /**\n * Reactive value for Form-Associated Custom Elements (FACE).\n * Automatically synchronized with the native <form> via internals.setFormValue().\n */\n value?:\n | ReadonlyAtom<unknown>\n | { val: ReadonlyAtom<unknown>; state?: ReadonlyAtom<unknown> };\n /**\n * Reactive validation logic for Form-Associated Custom Elements (FACE).\n * Can be a validation message string, a ValidityStateFlags object, or an atom/function returning either.\n */\n validation?:\n | ReadonlyAtom<ValidityStateFlags | string>\n | ((val: unknown) => ValidityStateFlags | string);\n }\n ): void;\n\n /**\n * Tears down all reactive bindings and observers.\n * Disconnects observers immediately; actual cleanup is deferred to a microtask.\n *\n * Logic: Cleanup Mechanism\n * Releases all listeners, observers, and effects created during setup() or\n * through reactive property access (attrs/slots).\n */\n teardown(): void;\n}\n\n/**\n * Represents an HTMLElement that has been enhanced with an AEJ controller.\n *\n * @public\n */\nexport type AtomComponentElement<T extends HTMLElement = HTMLElement> = T & {\n readonly aej: AtomComponentController;\n};\n\n/**\n * Declarative specification for Atom-Effect components.\n * @internal\n */\nexport interface AtomComponentStatic {\n aejStyles?: (string | CSSStyleSheet)[];\n aejBind?: Record<string, ReadonlyAtom<unknown>>;\n aejAria?: Record<string, ReadonlyAtom<unknown>>;\n aejParts?: Record<string, ReadonlyAtom<string | string[] | Record<string, boolean>>>;\n aejDispatch?: Record<string, ReactiveValue<unknown>>;\n aejValue?: ReadonlyAtom<unknown> | { val: ReadonlyAtom<unknown>; state?: ReadonlyAtom<unknown> };\n aejValidation?:\n | ReadonlyAtom<ValidityStateFlags | string>\n | ((val: unknown) => ValidityStateFlags | string);\n}\n\nexport type {\n ComputedAtom,\n ComputedOptions,\n Dependency,\n EffectObject,\n MergedDependencyValue,\n ReadonlyAtom,\n WritableAtom,\n};\n","import { effect, untracked } from '@but212/atom-effect';\nimport { SYSTEM_BINDING } from '@/constants';\nimport { INTERNAL_HANDLER } from '@/core/symbols';\nimport type { EffectObject, ValOptions, WritableAtom } from '@/types';\nimport { BindingFlags } from '@/types';\nimport { debug } from '@/utils/debug';\n\n/** Internal counter used to generate unique event namespaces for each binding instance. */\nlet instanceCounter = 0;\n\n/** Supported form control types. @internal */\ntype FormElement = HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement;\n\n/**\n * Marks a function as an internal atom-effect handler.\n *\n * Reason: This bypasses the global jQuery batching patch, preventing redundant\n * update cycles. Since synchronization is already governed by internal\n * `BindingFlags` bitmasks, additional batching at the jQuery level is\n * unnecessary and would degrade performance.\n *\n * @param handlerFunction - The handler function to mark.\n * @internal\n */\nfunction markInternal(handlerFunction: Function): void {\n (handlerFunction as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n}\n\n/** Represents a specialized synchronization strategy for different form element types. @internal */\ninterface BindingStrategy<T> {\n readonly read: (el: FormElement, $el: JQuery, parse?: (v: string) => T) => T;\n readonly write: (el: FormElement, $el: JQuery, value: T, formatted: string) => void;\n readonly equal: (a: T, b: T, baseEqual: (a: T, b: T) => boolean) => boolean;\n readonly format: (value: T, customFormat?: (v: T) => string) => string;\n}\n\n/** Registry of binding strategies for various form controls. @internal */\nconst STRATEGIES = {\n multipleSelect: {\n read: (el: FormElement): unknown => {\n if (!(el instanceof HTMLSelectElement)) return [];\n const options = el.selectedOptions;\n const result: string[] = [];\n for (let i = 0, len = options.length; i < len; i++) {\n result.push(options[i]!.value);\n }\n return result;\n },\n write: (_: FormElement, $el: JQuery, value: unknown) => {\n $el.val(value as string[]);\n },\n equal: (a: unknown, b: unknown, baseEqual: (a: unknown, b: unknown) => boolean) => {\n if (baseEqual(a, b)) return true;\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false;\n for (let i = 0, len = a.length; i < len; i++) {\n if (!Object.is(a[i], b[i])) return false;\n }\n return true;\n },\n format: (v: unknown, custom?: (v: unknown) => string) => {\n if (custom) return custom(v);\n return Array.isArray(v) ? v.join(',') : String(v ?? '');\n },\n } as BindingStrategy<unknown>,\n\n default: {\n read: (el: FormElement, _: JQuery, parse?: (v: string) => unknown) => {\n return parse ? parse(el.value) : el.value;\n },\n write: (el: FormElement, _: JQuery, __: unknown, formatted: string) => {\n if (\n (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) &&\n document.activeElement === el\n ) {\n const input = el 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 el.value = formatted;\n }\n },\n equal: (a: unknown, b: unknown, baseEqual: (a: unknown, b: unknown) => boolean) =>\n baseEqual(a, b),\n format: (v: unknown, custom?: (v: unknown) => string) => {\n if (custom) return custom(v);\n return String(v ?? '');\n },\n } as BindingStrategy<unknown>,\n} as const;\n\n/**\n * The internal engine coordinating two-way synchronization between DOM inputs and reactive atoms.\n *\n * Optimization: Strategy Selection\n * Read, write, equality, and formatting strategies are resolved at construction time.\n * This ensures monomorphic execution paths and avoids conditional branching\n * within high-frequency synchronization loops.\n *\n * Logic: Input Stability\n * - Composition Safety: Manages IME composition states to prevent partial\n * synchronization during multi-stroke input.\n * - Cursor Stability: Preserves selection ranges during atom-to-DOM updates\n * to maintain focus state.\n * - Recursion Control: Utilizes bitmask flags to prevent infinite update cycles.\n *\n * @internal\n */\nclass InputBinding<T> {\n private readonly $element: JQuery;\n private readonly readValue: () => T;\n private readonly writeToDom: (value: T, formatted: string) => void;\n private readonly areEqual: (a: T, b: T) => boolean;\n private readonly formatValue: (value: T) => string;\n private readonly eventNamespace: string;\n private readonly abortController = new AbortController();\n\n private flags = BindingFlags.None;\n private debounceTimer: ReturnType<typeof setTimeout> | undefined;\n\n constructor(\n $element: JQuery,\n private readonly atom: WritableAtom<T>,\n private readonly options: ValOptions<T>\n ) {\n this.atom = atom;\n this.options = options;\n this.$element = $element;\n this.eventNamespace = `.atomBind-${++instanceCounter}`;\n const element = $element[0] as FormElement;\n const isMultipleSelect =\n element.tagName === 'SELECT' && (element as HTMLSelectElement).multiple;\n\n const strategy = (\n isMultipleSelect ? STRATEGIES.multipleSelect : STRATEGIES.default\n ) as BindingStrategy<T>;\n const parse = options.parse;\n const baseEqual = options.equal ?? Object.is;\n\n this.readValue = () => (strategy as BindingStrategy<T>).read(element, this.$element, parse);\n this.writeToDom = (value, formatted) =>\n strategy.write(element, this.$element, value, formatted);\n this.areEqual = (a, b) => strategy.equal(a, b, baseEqual);\n this.formatValue = (value) => strategy.format(value, options.format);\n\n this.initializeEvents();\n }\n\n /** Normalizes and attaches all required DOM event listeners for the binding. */\n private initializeEvents(): void {\n const namespace = this.eventNamespace;\n const debounce = this.options.debounce ?? SYSTEM_BINDING.INPUT_DEFAULTS.debounce;\n\n const syncToAtomDelegate = (e?: Event | JQuery.TriggeredEvent) => {\n const native = (e && 'originalEvent' in e ? e.originalEvent : e) as InputEvent;\n // Logic: Synchronization is deferred while an IME composition is active (Standard InputEvent).\n if (native?.isComposing) return;\n this.syncToAtom();\n };\n\n const handleInput =\n debounce > 0\n ? (e: JQuery.TriggeredEvent) => {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => syncToAtomDelegate(e), debounce);\n }\n : syncToAtomDelegate;\n\n const onFocus = () => (this.flags |= BindingFlags.Focused);\n const onBlur = () => this.handleBlur();\n\n [onFocus, onBlur, handleInput].forEach(markInternal);\n\n const rawEventNames = this.options.event ?? SYSTEM_BINDING.INPUT_DEFAULTS.event;\n const names = rawEventNames.trim().split(/\\s+/);\n let eventNames = '';\n for (let i = 0, len = names.length; i < len; i++) {\n eventNames += (i > 0 ? ' ' : '') + names[i] + namespace;\n }\n\n // Use jQuery .on() for compatibility with $el.trigger().\n this.$element\n .on(`focus${namespace}`, onFocus)\n .on(`blur${namespace}`, onBlur)\n .on(eventNames, handleInput as JQuery.EventHandler<HTMLElement>);\n }\n\n /** Handles final synchronization and value normalization when the control loses focus. */\n private handleBlur(): void {\n this.flags &= ~BindingFlags.Focused;\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = undefined;\n }\n this.syncToAtom();\n\n // Logic: Value normalization ensures that the physical DOM value exactly\n // matches the reactive state once user interaction has concluded.\n const atomValue = this.atom.peek();\n if (!this.isDomUpToDate(atomValue)) {\n this.writeToDom(atomValue, this.formatValue(atomValue));\n }\n }\n\n /** Reads from the DOM and updates the reactive atom if the value has changed. */\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 } catch (err) {\n debug.warn(SYSTEM_BINDING.PREFIX, 'syncToAtom failed:', err);\n }\n this.flags &= ~BindingFlags.SyncingToAtom;\n }\n\n /** Synchronizes the atom's current value back to the physical DOM element. */\n public readonly syncToDom = () => {\n const atomValue = this.atom.value;\n // Logic: The bitmask gate is critical to prevent infinite feedback loops\n // triggered by DOM change events that occur during synchronization.\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(SYSTEM_BINDING.PREFIX, this.$element, 'val', formatted);\n } catch (err) {\n debug.warn(SYSTEM_BINDING.PREFIX, 'syncToDom failed:', err);\n }\n this.flags &= ~BindingFlags.SyncingToDom;\n });\n };\n\n /** Determines if the current DOM value matches the reactive state. */\n private isDomUpToDate(atomValue: T): boolean {\n if (!this.areEqual(this.readValue(), atomValue)) return false;\n\n // Logic: While the input is focused, we allow minor discrepancies (e.g.,\n // \"1.0\" in DOM vs 1 in Atom) to avoid disruptive formatting while the user is typing.\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 /** Cleans up all event listeners and timers associated with the binding. */\n public cleanup(): void {\n // Logic: Multiple cleanup mechanisms for maximum resilience.\n this.$element.off(this.eventNamespace);\n this.abortController.abort();\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n }\n}\n\n/**\n * Applies a two-way reactive binding to a form input element.\n *\n * This function handles text inputs, textareas, and select menus, ensuring\n * stability during IME composition and maintaining cursor positions during\n * background state updates.\n *\n * When to use:\n * - To synchronize a form control with a `WritableAtom` state.\n * - To implement debounced or custom-formatted input fields.\n *\n * @param $element - The jQuery collection containing the target form element.\n * @param atom - The writable atom to synchronize with.\n * @param options - Configuration for debouncing, event triggers, and data transformation.\n * @returns A handle containing the reactive effect and a cleanup function.\n *\n * @example\n * ```typescript\n * const name = atom('John');\n * const { cleanup } = applyInputBinding($('#name-input'), name, {\n * debounce: 200,\n * format: (v) => v.toUpperCase()\n * });\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 { SYSTEM_BINDING } from '@/constants';\nimport { registry } from '@/core/registry';\nimport type { AsyncReactiveValue } from '@/types';\nimport { isPromise } from '@/utils';\nimport { debug } from '@/utils/debug';\n\n/**\n * Enumeration of binding types for debugging and performance tracking.\n * @internal\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 * Creates an execution wrapper that manages asynchronous race conditions.\n *\n * Logic: Monotonic ID Tracking\n * Every update request is assigned a unique, incrementing ID. If a promise resolves\n * but its ID no longer matches the latest issued ID, the result is discarded.\n *\n * @param el - The target element for the update.\n * @param debugType - The type of binding for logging purposes.\n * @param updater - The callback to execute when a value is ready.\n * @returns A function that accepts a value or a promise.\n * @internal\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.onCleanup(el, () => {\n isDisposed = true;\n });\n\n return (value: T | Promise<T>) => {\n const currentId = ++latestId;\n\n if (!isPromise(value)) {\n // Sync Path: Direct execution to minimize overhead\n if (isDisposed || currentId !== latestId) return;\n\n untracked(() => {\n try {\n updater(value);\n debug.domUpdated(SYSTEM_BINDING.PREFIX, el, debugType, value);\n } catch (error) {\n debug.error(\n SYSTEM_BINDING.PREFIX,\n SYSTEM_BINDING.ERRORS.UPDATER_ERROR(debugType, true),\n error\n );\n }\n });\n return;\n }\n\n // Async Path\n value.then(\n (resolved) => {\n if (isDisposed || currentId !== latestId) return;\n untracked(() => {\n try {\n updater(resolved);\n debug.domUpdated(SYSTEM_BINDING.PREFIX, el, `${debugType} (async)`, resolved);\n } catch (error) {\n debug.error(\n SYSTEM_BINDING.PREFIX,\n SYSTEM_BINDING.ERRORS.UPDATER_ERROR(debugType, false),\n error\n );\n }\n });\n },\n (error) => {\n // Caution: Network or source errors are logged if they are still relevant.\n if (currentId === latestId && !isDisposed) {\n debug.error(SYSTEM_BINDING.PREFIX, SYSTEM_BINDING.ERRORS.UPDATER_ERROR(debugType), error);\n }\n }\n );\n };\n}\n\n/**\n * Establishes a reactive effect between a single source and a DOM element.\n *\n * Lifecycle: The created effect is automatically registered with the global\n * `registry` and linked to the target element.\n *\n * @param el - The target DOM element.\n * @param source - The reactive atom, function, or static value.\n * @param updater - The function that applies the value to the DOM.\n * @param debugType - Metadata for debugging.\n * @internal\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 isReactive = isAtom(source);\n const isFunction = typeof source === 'function';\n\n if (isReactive || isFunction) {\n registry.trackEffect(\n el,\n effect(\n () => {\n const value = isReactive\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 * Establishes a reactive effect between a map of sources and a DOM element.\n *\n * Optimization: Single-pass Collection\n * Replaces multiple array methods (map/filter/forEach) with a single for-loop\n * to reduce memory allocation and GC pressure on every state change.\n *\n * @param el - The target DOM element.\n * @param sourceMap - A record of property keys and reactive values.\n * @param updater - The function that applies the entire map to the DOM.\n * @param debugType - Metadata for debugging.\n * @internal\n */\nexport function registerMapEffect<T>(\n el: Element,\n sourceMap: 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 keys = Object.keys(sourceMap);\n const len = keys.length;\n\n /** Pre-check if any source in the map is reactive. */\n let hasReactive = false;\n for (let i = 0; i < len; i++) {\n const val = sourceMap[keys[i]!];\n if (isAtom(val) || typeof val === 'function') {\n hasReactive = true;\n break;\n }\n }\n\n /** Collects current values from the map in a single pass. */\n const collect = () => {\n const resolved: Record<string, T> = {};\n const promises: Promise<{ key: string; value: T }>[] = [];\n\n for (let i = 0; i < len; i++) {\n const key = keys[i]!;\n const source = sourceMap[key];\n\n let value: T | Promise<T>;\n if (isAtom(source)) {\n value = (source as ReadonlyAtom<T | Promise<T>>).value;\n } else if (typeof source === 'function') {\n value = (source as Function)();\n } else {\n value = source as T | Promise<T>;\n }\n\n if (isPromise(value)) {\n promises.push(value.then((v) => ({ key, value: v })));\n } else {\n resolved[key] = value as T;\n }\n }\n\n if (promises.length > 0) {\n return Promise.all(promises).then((results) => {\n for (let i = 0, rLen = results.length; i < rLen; i++) {\n const res = results[i]!;\n resolved[res.key] = res.value;\n }\n return resolved;\n });\n }\n return resolved;\n };\n\n if (hasReactive) {\n registry.trackEffect(\n el,\n effect(() => runner(collect()), { name: debugType })\n );\n } else {\n runner(collect());\n }\n}\n","import { SYSTEM_SECURITY } from '@/constants';\n\n/**\n * Configuration for the HTML sanitization engine.\n */\nexport interface SanitizationPolicy {\n /** List of attribute names whose values should be validated as URIs. */\n readonly urlAttributes: string[];\n /** List of element local names that should be neutralized or stripped. */\n readonly blacklistedTags: string[];\n}\n\n/**\n * The standard sanitization policy used by the library.\n *\n * Logic: Strict Isolation\n * Targets executable elements (script, iframe), metadata (base, meta),\n * and layout-breaking tags (body, title).\n */\nexport const DEFAULT_POLICY: SanitizationPolicy = {\n urlAttributes: [\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 blacklistedTags: [\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 'isindex',\n 'body',\n ],\n};\n\n// ─── Internal Constants ──────────────────────────────────────────────────────\n\n/**\n * @internal\n * Dictionaries for entity mapping and DOM protection.\n */\nconst DICT = {\n /** Map of safe replacements for common HTML entities. */\n ENTITIES: {\n colon: ':',\n tab: '\\t',\n newline: '\\n',\n lt: '<',\n gt: '>',\n amp: '&',\n quot: '\"',\n apos: \"'\",\n } as Record<string, string>,\n /** Values targeted for DOM Clobbering prevention. */\n CLOBBER: {\n ATTRS: ['id', 'name'],\n VALUES: [\n 'attributes',\n 'tagname',\n 'nodename',\n 'innerhtml',\n 'parentnode',\n 'childnodes',\n 'lastchild',\n 'firstchild',\n 'nextsibling',\n 'previoussibling',\n ],\n },\n /** SVG/SMIL attributes that can be used for XSS via animation. */\n SENSITIVE: ['attributename', 'from', 'to', 'values'],\n} as const;\n\n/**\n * @internal\n * Regular expressions for security pattern matching.\n */\nconst REGEX = {\n /** Captures numeric HTML entities (hex or decimal). */\n NUMERIC_ENTITY: /&#x([0-9a-f]+);?|&#([0-9]+);?/gi,\n /** Captures named HTML entities defined in DICT.ENTITIES. */\n NAMED_ENTITY: new RegExp(`&(${Object.keys(DICT.ENTITIES).join('|')});?`, 'gi'),\n /**\n * Security: Filter Evasion\n * Captures control characters often used to break regex-based filters.\n */\n // biome-ignore lint/suspicious/noControlCharactersInRegex: security requirement\n CONTROL_CHARS: /[\\x00-\\x1f\\x7f\\ufffd\\u0000]/g,\n /** Detects malicious data-URIs with active content types. */\n DATA_URI:\n /data\\s*:\\s*(?:text\\/(?:html|javascript|vbscript|xml)|application\\/(?:javascript|xhtml\\+xml|xml|x-shockwave-flash)|image\\/svg\\+xml)/i,\n /** Detects dangerous protocols including obfuscated variations. */\n PROTOCOL: new RegExp(\n `(?:^|url\\\\s*\\\\(\\\\s*[\"']?)\\\\s*${SYSTEM_SECURITY.DANGEROUS_PROTOCOL_PATTERN}\\\\s*:`,\n 'i'\n ),\n /** Strips CSS comments to prevent bypasses hidden within them. */\n CSS_CLEAN: /\\/\\*[\\s\\S]*?\\*\\//g,\n} as const;\n\n// ─── DOM Bridge (Low-level Primitives) ───────────────────────────────────────\n\n/**\n * @internal\n * Low-level DOM bridge using proto-bound methods to bypass potential DOM Clobbering.\n *\n * Security: Prototype Hardening\n * Uses Function.prototype.call to invoke methods directly from the prototype,\n * preventing attackers from shadowing these methods on the instance.\n */\nconst _call = Function.prototype.call.bind(Function.prototype.call);\nconst _get = (p: object, k: string) => Object.getOwnPropertyDescriptor(p, k)?.get;\n\n/** @internal */\nconst DOM = {\n /** Retrieves all attributes of an element reliably. */\n getAttributes: (el: Element) => {\n const getter = _get(Element.prototype, 'attributes');\n return Array.from((getter ? _call(getter, el) : el.attributes) as NamedNodeMap);\n },\n /** Sets an attribute value bypassing instance-level shadowing. */\n setAttribute: (el: Element, key: string, val: string) =>\n _call(Element.prototype.setAttribute, el, key, val),\n /** Removes an attribute bypassing instance-level shadowing. */\n removeAttribute: (el: Element, key: string) => _call(Element.prototype.removeAttribute, el, key),\n /** Replaces one node with another in the DOM tree. */\n replaceNode: (oldNode: Node, newNode: Node) => {\n if (oldNode.parentNode) {\n oldNode.parentNode.replaceChild(newNode, oldNode);\n return true;\n }\n return false;\n },\n /** Retrieves the lowercase local name of an element reliably. */\n getLocalName: (node: Node) => {\n if (node.nodeType !== Node.ELEMENT_NODE) return '';\n const el = node as Element;\n const getter = _get(Element.prototype, 'localName') ?? _get(Node.prototype, 'nodeName');\n return (getter ? (_call(getter, el) as string) : (el.localName ?? '')).toLowerCase();\n },\n /** Creates an HTMLElement in the current document context. */\n createElement: <T extends HTMLElement>(tag: string) => document.createElement(tag) as T,\n};\n\n// ─── Guard Logic (Pure Security Functions) ───────────────────────────────────\n\n/**\n * @internal\n * Logic: Multi-pass Normalization\n * Performs recursive decoding and filtering to expose hidden payloads.\n */\nconst Guard = {\n /** Resolves HTML entities to their literal characters. */\n decodeEntities(val: string): string {\n return val\n .replace(REGEX.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(REGEX.NAMED_ENTITY, (_, name) => DICT.ENTITIES[name.toLowerCase()] ?? '');\n },\n\n /**\n * Security: Normalization\n * Normalizes a string by decoding entities twice (to catch double-encoding)\n * and stripping non-printable/control characters.\n */\n normalize(val: string): string {\n if (typeof val !== 'string') return '';\n return this.decodeEntities(this.decodeEntities(val)).replace(REGEX.CONTROL_CHARS, '');\n },\n\n /** Validates if a URI contains dangerous protocols or data types. */\n isDangerousUri(val: string): boolean {\n const clean = this.normalize(val).replace(/\\s+/g, '');\n return REGEX.PROTOCOL.test(clean) || REGEX.DATA_URI.test(clean);\n },\n\n /**\n * Security: CSS Filtering\n * Detects script injection patterns in CSS declarations (e.g., expression, url(javascript)).\n */\n isDangerousCss(val: string): boolean {\n const clean = this.normalize(val).replace(REGEX.CSS_CLEAN, '').toLowerCase();\n if (['javascript:', 'expression(', '-moz-binding'].some((s) => clean.includes(s))) return true;\n const url = clean.match(/url\\s*\\(\\s*[\"']?([^\"')]*)[\"']?\\s*\\)/i)?.[1];\n return !!url && this.isDangerousUri(url);\n },\n};\n\n/**\n * @internal\n * Logic: Core Sanitization Engine\n * Implementation for recursive and fragment-based sanitization.\n *\n * Security: Re-entrancy\n * Does not use global singletons for parser/serializer to ensure that\n * recursive calls (e.g., for srcdoc) do not corrupt the state of\n * outer sanitization cycles.\n */\nfunction _sanitize(html: string, policy: SanitizationPolicy): string {\n const parser = DOM.createElement<HTMLTemplateElement>('template');\n const serializer = document.createElement('div');\n\n parser.innerHTML = html;\n walkTree(parser.content, policy);\n\n serializer.innerHTML = '';\n serializer.appendChild(parser.content);\n return serializer.innerHTML;\n}\n\n// ─── Rule Engine ─────────────────────────────────────────────────────────────\n\n/** @internal */\ninterface DefenseRule {\n match: (key: string, val: string, policy: SanitizationPolicy) => boolean;\n action: (el: HTMLElement, key: string, val: string, policy: SanitizationPolicy) => void;\n}\n\n/**\n * @internal\n * Orchestrates attribute-level defense logic.\n *\n * Logic: Rule Specificity & Priority\n * Rules are ordered from most specific (e.g., Style, URL) to most general (Catch-all).\n * This ensures that data with potential for partial recovery (like CSS) is sanitized\n * rather than discarded, while still enforcing a strict security boundary.\n */\nconst DEFENSE_RULES: DefenseRule[] = [\n {\n // Logic: Style Sanitization\n // Filters CSS properties to allow safe styles while neutralizing dangerous declarations.\n match: (k, _v, _p) => k === 'style',\n action: (el, k, v) => {\n const safeStyles = v\n .split(';')\n .map((p) => p.trim())\n .filter((p) => p && !Guard.isDangerousCss(p));\n DOM.setAttribute(el, k, safeStyles.length ? `${safeStyles.join('; ')};` : 'data-unsafe-css:');\n },\n },\n {\n // Logic: HTML Sinks (srcdoc)\n // Performs recursive sanitization on srcdoc content to ensure nested safety.\n match: (k) => k === 'srcdoc',\n action: (el, k, v, p) => DOM.setAttribute(el, k, _sanitize(v, p)),\n },\n {\n // Logic: Multi-URI Attributes (srcset)\n // Validates each URI segment within a srcset attribute.\n match: (k) => k === 'srcset',\n action: (el, k, v) => {\n const parts = v.split(',').map((part) => {\n const trimmed = part.trim();\n if (!trimmed) return part;\n const [url, ...meta] = trimmed.split(/\\s+/);\n return Guard.isDangerousUri(url!)\n ? ['data-unsafe-protocol:', ...meta].join(' ')\n : [Guard.normalize(url!), ...meta].join(' ');\n });\n DOM.setAttribute(el, k, parts.join(', '));\n },\n },\n {\n // Logic: URI Enforcement\n // Enforces protocol white-listing on URI-carrying attributes.\n match: (k, v, p) => p.urlAttributes.includes(k) && Guard.isDangerousUri(v),\n action: (el, k) => DOM.setAttribute(el, k, 'data-unsafe-protocol:'),\n },\n {\n // Security: DOM Clobbering / SVG Injection\n // Blocks attributes that attempt to shadow native element properties or trigger SMIL-based XSS.\n match: (k, v, _p) =>\n ((DICT.SENSITIVE as readonly string[]).includes(k) &&\n (v.startsWith('on') || Guard.isDangerousUri(v))) ||\n ((DICT.CLOBBER.ATTRS as readonly string[]).includes(k) &&\n (DICT.CLOBBER.VALUES as readonly string[]).includes(v.toLowerCase())),\n action: (el, k) => DOM.removeAttribute(el, k),\n },\n {\n // Security: Event Handlers\n // Blocks all inline event handlers (on*).\n match: (k, _v, _p) => k.startsWith('on'),\n action: (el, k) => DOM.removeAttribute(el, k),\n },\n {\n // Security: Catch-all Protection\n // Identifies and blocks malicious keywords in both attribute names and values.\n match: (k, v, _p) =>\n k.includes('javascript') ||\n k.includes('expression') ||\n Guard.isDangerousUri(v) ||\n v.includes('javascript') ||\n v.includes('expression'),\n action: (el, k) => DOM.removeAttribute(el, k),\n },\n];\n\n// ─── Traversal & Processing ──────────────────────────────────────────────────\n\n/**\n * @internal\n * Logic: Attribute Scrubbing\n * Iterates through all attributes of an element and applies defense rules.\n */\nfunction scrubElement(el: HTMLElement, policy: SanitizationPolicy): void {\n const attrs = DOM.getAttributes(el);\n const detectedEvents = attrs\n .filter((a) => a.name.toLowerCase().startsWith('on'))\n .map((a) => a.name);\n\n for (const { name, value } of attrs) {\n const key = name.toLowerCase();\n for (const rule of DEFENSE_RULES) {\n if (rule.match(key, value, policy)) {\n rule.action(el, name, value, policy);\n break;\n }\n }\n }\n\n if (detectedEvents.length) {\n DOM.setAttribute(el, 'data-unsafe-attr', detectedEvents.join(','));\n }\n}\n\n/**\n * @internal\n * Logic: Node Processing\n * Analyzes and transforms a node into its safe representation.\n */\nfunction processNode(node: Node, policy: SanitizationPolicy): Node {\n // 1. Logic: Text Node Sanitization\n // Detects and neutralizes encoded tags hidden within text content to prevent bypasses.\n if (node.nodeType === Node.TEXT_NODE) {\n const content = node.textContent ?? '';\n if (\n policy.blacklistedTags.some((tag) =>\n Guard.normalize(content).toLowerCase().includes(`<${tag}`)\n )\n ) {\n const span = DOM.createElement('span');\n /**\n * Logic: Structural Neutralization\n * Replaces tag delimiters (<, >) with safe brackets ([, ]).\n * This approach ensures the content remains inert across all parsing contexts\n * without relying on complex HTML entity encoding/decoding cycles,\n * which are subject to browser-specific interpretation quirks.\n */\n span.textContent = content.replace(/</g, '[').replace(/>/g, ']');\n return DOM.replaceNode(node, span) ? span : node;\n }\n return node;\n }\n\n // 2. Logic: Element Processing\n if (node.nodeType !== Node.ELEMENT_NODE) return node;\n const el = node as HTMLElement;\n const tag = DOM.getLocalName(el);\n\n scrubElement(el, policy);\n\n // 3. Logic: Blacklist Neutralization\n // Replaces forbidden elements with <span> while preserving attributes and children.\n if (policy.blacklistedTags.includes(tag)) {\n const span = DOM.createElement('span');\n // Simplified attribute mirroring.\n DOM.getAttributes(el).forEach((a) => span.setAttribute(a.name, a.value));\n scrubElement(span, policy);\n\n // Security: Recursive Style Protection\n if (tag === 'style' && Guard.isDangerousCss(el.textContent ?? '')) {\n span.textContent = '/* blocked */';\n } else {\n while (el.firstChild) span.appendChild(el.firstChild);\n }\n\n return DOM.replaceNode(el, span) ? span : el;\n }\n\n return el;\n}\n\n/**\n * @internal\n * Logic: DOM Tree Traversal using native TreeWalker.\n */\nfunction walkTree(root: Node, policy: SanitizationPolicy): void {\n // Use native TreeWalker for efficient, non-recursive traversal.\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT);\n\n let node: Node | null = root;\n while (node) {\n const nextNode = walker.nextNode();\n processNode(node, policy);\n\n // Template content must be handled separately as they are inert fragments.\n if (node.nodeType === Node.ELEMENT_NODE && DOM.getLocalName(node) === 'template') {\n walkTree((node as HTMLTemplateElement).content, policy);\n }\n node = nextNode;\n }\n}\n\n// ─── Public APIs ─────────────────────────────────────────────────────────────\n\n/**\n * Sanitizes an HTML string based on a security policy.\n *\n * When to use:\n * - Before injecting untrusted HTML content into the DOM via `atomHtml` or jQuery methods.\n * - To filter potentially malicious attributes, event handlers, and active scripts.\n *\n * @param html The raw HTML string to be sanitized.\n * @param policy Custom sanitization policy. Defaults to `DEFAULT_POLICY`.\n *\n * @returns A safe HTML string with dangerous elements neutralized and attributes scrubbed.\n *\n * @example\n * const safeHtml = sanitizeHtml('<img src=x onerror=alert(1)>');\n * // Returns: '<img src=\"x\" data-unsafe-attr=\"onerror\">'\n */\nexport function sanitizeHtml(\n html: string | null | undefined,\n policy: SanitizationPolicy = DEFAULT_POLICY\n): string {\n if (!html) return '';\n return _sanitize(String(html), policy);\n}\n\n/**\n * Validates if a specific attribute/value pair is considered dangerous under the policy.\n *\n * @param attr The attribute name to check.\n * @param val The value to validate.\n * @param policy The policy defining URL-carrying attributes.\n *\n * @returns True if the value contains a dangerous protocol or is a restricted sink.\n */\nexport const isDangerousUrl = (\n attr: string,\n val: string,\n policy: SanitizationPolicy = DEFAULT_POLICY\n): boolean => {\n const key = attr.toLowerCase();\n return (key === 'srcdoc' || policy.urlAttributes.includes(key)) && Guard.isDangerousUri(val);\n};\n\n/**\n * Validates if a CSS value contains dangerous patterns.\n *\n * @param val The CSS property value to check.\n * @returns True if dangerous patterns (e.g., expression, javascript) are detected.\n */\nexport const isDangerousCssValue = (val: string): boolean => Guard.isDangerousCss(val);\n","import { effect, untracked } from '@but212/atom-effect';\nimport { Option } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport { applyInputBinding } from '@/bindings/input-binding';\nimport { SYSTEM_BINDING, SYSTEM_SECURITY } from '@/constants';\nimport { registerMapEffect, registerReactiveEffect } from '@/core/effect-factory';\nimport { registry } from '@/core/registry';\nimport { INTERNAL_HANDLER } from '@/core/symbols';\nimport type {\n AsyncReactiveValue,\n BindingOptions,\n CssValue,\n PrimitiveValue,\n ReactiveValue,\n ValOptions,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\nimport { isDangerousCssValue, isDangerousUrl, sanitizeHtml } from '@/utils/sanitize';\n\n/**\n * Converts a camelCase property name to kebab-case.\n * @internal\n */\nfunction toKebab(str: string): string {\n return str.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n\n/**\n * Validates whether a property or attribute name is safe for reactive binding.\n *\n * Logic: This utility prevents XSS attacks by blocking 'on*' event attributes\n * and sensitive properties like `innerHTML` from being manipulated via\n * standard attribute or property bindings.\n *\n * @param name - The name of the property or attribute.\n * @param isProperty - True if checking a DOM property, false for attributes.\n * @returns True if the binding is considered safe.\n * @internal\n */\nfunction isSafeBinding(name: string, isProperty: boolean): boolean {\n const lowerName = name.toLowerCase();\n if (lowerName.startsWith('on')) {\n console.warn(`${SYSTEM_BINDING.PREFIX} ${SYSTEM_SECURITY.ERRORS.BLOCKED_EVENT_HANDLER(name)}`);\n return false;\n }\n if (isProperty && (SYSTEM_SECURITY.DANGEROUS_PROPS as readonly string[]).includes(name)) {\n console.warn(`${SYSTEM_BINDING.PREFIX} ${SYSTEM_SECURITY.ERRORS.BLOCKED_PROP(name)}`);\n return false;\n }\n return true;\n}\n\n/**\n * Binds the text content of an element to a reactive source.\n *\n * When to use:\n * - To synchronize labels or counts with an atom without the risk of XSS.\n *\n * @param element - The target HTMLElement.\n * @param value - The reactive source atom or computed.\n * @param formatter - An optional function to format the value before display.\n * @internal\n */\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 (val) => {\n const textContent = Option.unwrapOr(\n Option.map(Option.fromNullable(formatter), (fn: Function) => fn(val)),\n String(val ?? '')\n );\n if (element.textContent !== textContent) {\n element.textContent = textContent;\n }\n },\n 'text'\n );\n}\n\n/**\n * Binds the HTML content of an element to a reactive source.\n *\n * Logic: To prevent memory leaks from detached nodes, all reactive bindings\n * within the element's descendants are automatically cleaned up via the\n * registry before the `innerHTML` is overwritten.\n *\n * Caution: Even with sanitization, rendering user-provided HTML remains a\n * security risk. Prefer `bindText` whenever possible.\n *\n * When to use:\n * - To render trusted templates or rich text containing formatting tags.\n *\n * @param element - The target HTMLElement.\n * @param value - The reactive source containing the HTML string.\n * @internal\n */\nexport function bindHtml(element: HTMLElement, value: AsyncReactiveValue<string>): void {\n let prevHtml: string | null = null;\n\n registerReactiveEffect(\n element,\n value,\n (val) => {\n const sanitized = sanitizeHtml(val as string);\n if (prevHtml !== sanitized) {\n registry.cleanupDescendants(element);\n element.innerHTML = sanitized;\n prevHtml = sanitized;\n }\n },\n 'html'\n );\n}\n\n/**\n * Binds a set of CSS classes to reactive conditions.\n *\n * Logic: Token Management\n * - Supports space-separated class names within keys.\n * - Active tokens are tracked in a `Set` to ensure classes are only removed\n * if no other active definition within the map requires them.\n *\n * @param element - The target HTMLElement.\n * @param classMap - A record mapping class names to reactive boolean conditions.\n * @internal\n */\nexport function bindClass(\n element: HTMLElement,\n classMap: Record<string, AsyncReactiveValue<boolean>>\n): void {\n const tokensMap = new Map<string, string[]>();\n\n Object.keys(classMap).forEach((key) => {\n const trimmed = key.trim();\n tokensMap.set(key, trimmed.includes(' ') ? trimmed.split(/\\s+/).filter(Boolean) : [trimmed]);\n });\n\n registerMapEffect(\n element,\n classMap,\n (states) => {\n // Logic: Aggregate all active tokens to handle overlapping definitions.\n const activeTokens = new Set<string>();\n for (const [key, isActive] of Object.entries(states)) {\n if (isActive) {\n tokensMap.get(key)?.forEach((t) => activeTokens.add(t));\n }\n }\n\n // Logic: Atomic toggle using native classList API.\n Array.from(tokensMap.values())\n .flat()\n .forEach((token) => {\n element.classList.toggle(token, activeTokens.has(token));\n });\n },\n 'class'\n );\n}\n\n/**\n * Binds inline CSS styles to reactive sources.\n *\n * Security: Dangerous CSS values (e.g., `url()` containing javascript: protocols)\n * are blocked to prevent XSS and style-based injection attacks.\n *\n * @param element - The target HTMLElement.\n * @param cssMap - A record mapping style properties to reactive values.\n * @internal\n */\nexport function bindCss(element: HTMLElement, cssMap: Record<string, CssValue>): void {\n const { style } = element;\n const reactiveMap: Record<string, ReactiveValue<unknown>> = {};\n const metaMap: Record<string, string> = {};\n const prev = new Map<string, string>();\n\n Object.entries(cssMap).forEach(([property, value]) => {\n const [source, unit] = Array.isArray(value) ? value : [value, ''];\n reactiveMap[property] = source;\n metaMap[property] = unit;\n });\n\n registerMapEffect(\n element,\n reactiveMap,\n (states) => {\n Object.entries(states).forEach(([property, value]) => {\n const unit = metaMap[property] ?? '';\n const str = unit ? `${value}${unit}` : String(value);\n\n if (prev.get(property) !== str) {\n if (!isDangerousCssValue(str)) {\n style.setProperty(toKebab(property), str);\n }\n prev.set(property, str);\n }\n });\n },\n 'css'\n );\n}\n\n/**\n * Binds HTML attributes to reactive sources.\n *\n * Logic: Attribute Transformation Pipeline\n * Implements a unified transformation flow for different attribute categories:\n * - Boolean Attributes: Automatically removed when the condition is `false`.\n * - ARIA Attributes: Boolean values are mapped to 'true'/'false' strings.\n * - Standard Attributes: Values are coerced to strings.\n *\n * Security: Protocol Validation\n * Validates 'href' and 'src' attributes against dangerous URL protocols to\n * mitigate potential XSS vectors.\n *\n * @param element - The target HTMLElement.\n * @param attrMap - A record mapping attribute names to reactive values.\n * @internal\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 metaMap: Record<string, { isAria: boolean }> = {};\n const prev: Record<string, string | null> = {};\n\n for (const [name] of safeEntries) {\n metaMap[name] = { isAria: name.toLowerCase().startsWith('aria-') };\n prev[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 meta = metaMap[name];\n if (!meta) continue;\n\n const attrVal = Option.unwrapOr(\n Option.map(Option.fromNullable(value), (val) => {\n if (val === true) return meta.isAria ? 'true' : name;\n if (val === false) return meta.isAria ? 'false' : null;\n return String(val);\n }),\n null\n );\n\n // 2. Validate and Apply\n if (attrVal !== null && isDangerousUrl(name, attrVal as string)) {\n console.warn(`${SYSTEM_BINDING.PREFIX} ${SYSTEM_SECURITY.ERRORS.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n if (prev[name] !== attrVal) {\n if (attrVal === null) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, attrVal as string);\n }\n prev[name] = attrVal as string | null;\n }\n }\n },\n 'attr'\n );\n}\n\n/**\n * Binds DOM properties directly to reactive sources.\n *\n * Security: Blocks sensitive properties (e.g., `innerHTML`, event handlers)\n * and validates URL-based properties to prevent prototype pollution or XSS.\n *\n * @param element - The target HTMLElement.\n * @param propMap - A record mapping property names to reactive values.\n * @internal\n */\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(`${SYSTEM_BINDING.PREFIX} ${SYSTEM_SECURITY.ERRORS.BLOCKED_PROTOCOL(name)}`);\n continue;\n }\n\n target[name] = value;\n previousValues[name] = value;\n }\n },\n 'prop'\n );\n}\n\n/**\n * Manages element visibility based on a reactive condition.\n *\n * Logic: Layout Preservation\n * Transitions between 'visible' and 'hidden' states while preserving the\n * element's original 'display' mode (e.g., flex, grid) when restored.\n *\n * @param element - The target HTMLElement.\n * @param condition - The reactive boolean condition governing visibility.\n * @param invert - If true, hides the element when the condition is met.\n * @internal\n */\nexport function bindVisibility(\n element: HTMLElement,\n condition: AsyncReactiveValue<boolean>,\n invert: boolean\n): void {\n // Capture initial display state, excluding 'none'.\n let baseDisplay = element.style.display === 'none' ? '' : element.style.display;\n\n registerReactiveEffect(\n element,\n condition,\n (value) => {\n const isVisible = invert !== !!value;\n const current = element.style.display;\n\n // Data-centric state application:\n if (isVisible) {\n if (current === 'none') {\n element.style.display = baseDisplay;\n }\n } else if (current !== 'none') {\n baseDisplay = current;\n element.style.display = 'none';\n }\n },\n invert ? 'hide' : 'show'\n );\n}\n\n/**\n * Binds a form control's value to a writable atom.\n *\n * When to use:\n * - To implement two-way synchronization for inputs, selects, and textareas.\n *\n * @param element - The form control element.\n * @param atom - The writable atom to synchronize with.\n * @param options - Configuration for debouncing and transformation.\n * @internal\n */\nexport function bindVal(\n element: HTMLElement,\n atom: WritableAtom<unknown>,\n options: ValOptions<unknown> = {}\n): void {\n const tagName = element.tagName.toLowerCase();\n const isValidTag =\n (SYSTEM_BINDING.VALID_INPUT_TAGS as readonly string[]).includes(tagName) ||\n tagName.includes('-'); // Support Custom Elements (FACE)\n\n if (!isValidTag) {\n console.warn(\n `${SYSTEM_BINDING.PREFIX} ${SYSTEM_BINDING.ERRORS.INVALID_INPUT_ELEMENT(tagName)}`\n );\n return;\n }\n const { reactiveEffect, cleanup } = applyInputBinding($(element), atom, options);\n registry.trackEffect(element, reactiveEffect);\n registry.onCleanup(element, cleanup);\n}\n\n/**\n * Synchronizes the visual state of a radio button group.\n *\n * Logic: Native radio buttons do not fire 'change' events when they are\n * unchecked by the selection of another radio button in the same group.\n * This utility manually triggers synchronization for the entire group\n * to ensure reactive consistency.\n *\n * @param element - The radio input element that was recently selected.\n * @internal\n */\nfunction syncRadios(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/**\n * Binds a checkbox or radio button's checked state to a writable atom.\n *\n * @param element - The target input element.\n * @param atom - The writable atom to synchronize with the checked state.\n * @internal\n */\nexport function bindChecked(element: HTMLElement, atom: WritableAtom<boolean>): void {\n if (!(element instanceof HTMLInputElement)) {\n console.warn(`${SYSTEM_BINDING.PREFIX} atomChecked called on non-input element`);\n return;\n }\n const inputElement = element;\n const $element = $(inputElement);\n\n const onChange = () => {\n if (atom.peek() !== inputElement.checked) {\n atom.value = inputElement.checked;\n syncRadios(inputElement);\n }\n };\n (onChange as unknown as Record<symbol, boolean>)[INTERNAL_HANDLER] = true;\n\n $element.on('change change.atomRadioSync', onChange);\n registry.onCleanup(inputElement, () => $element.off('change change.atomRadioSync', onChange));\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(SYSTEM_BINDING.PREFIX, inputElement, 'checked', isChecked);\n if (isChecked) syncRadios(inputElement);\n }\n });\n })\n );\n}\n\n/**\n * Binds a mapping of event listeners to an element.\n *\n * @param element - The target HTMLElement.\n * @param eventMap - A record mapping event names to handler functions.\n * @internal\n */\nexport function bindEvents(\n element: HTMLElement,\n eventMap: NonNullable<BindingOptions['on']>\n): void {\n const $element = $(element);\n $element.on(eventMap);\n registry.onCleanup(element, () => $element.off(eventMap));\n}\n\n/**\n * Binds a single event listener to an element.\n *\n * @param element - The target HTMLElement.\n * @param event - The name of the event.\n * @param handler - The handler function to execute.\n * @internal\n */\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.onCleanup(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 { registry } from '@/core/registry';\nimport { INTERNAL_HANDLER } from '@/core/symbols';\nimport type { FormOptions } from '@/types';\nimport { bindVal } from './unified';\n\n/**\n * Represents an internal entry for a specific form field and its associated lens.\n *\n * Logic: Reference Counting\n * Tracks multiple form controls bound to the same property path to ensure\n * lens atoms are only disposed when the last associated control is removed.\n *\n * @internal\n */\ninterface FieldEntry {\n /** The reactive lens atom providing access to a specific nested property. */\n atom: WritableAtom<unknown>;\n\n /** The unique name of the field derived from the `name` attribute. */\n name: string;\n\n /** Reference count for lifecycle management. */\n refCount: number;\n}\n\n/**\n * Selector used for identifying form-associated elements and custom elements.\n * @internal\n */\nconst SELECTOR = 'input, select, textarea, [name]';\n\n/**\n * Orchestrates the synchronization between a complex reactive object and an HTML Form.\n *\n * This class implements a two-way binding system that maps form controls (via `name`\n * attributes) to nested properties of a source atom using lenses. It ensures\n * that the DOM and the reactive state remain consistent even as the form structure\n * changes dynamically.\n *\n * Logic: Hybrid Discovery\n * Combines initial scanning with a MutationObserver to maintain bindings for\n * dynamically added elements or attribute changes.\n *\n * @internal\n */\nclass FormBinder<T extends object> {\n /** A map of field names to their corresponding reactive entries. */\n private entries = new Map<string, FieldEntry>();\n\n /** A mapping of DOM elements to their current 'name' identifier for reconciliation. */\n private names = new WeakMap<Element, string>();\n\n constructor(\n /** The target form element. */\n private form: HTMLFormElement,\n /** The writable atom containing the form's state object. */\n private atom: WritableAtom<T>,\n /** Configuration for transformations and change callbacks. */\n private options: FormOptions<unknown> = {}\n ) {\n this.init();\n }\n\n /** Initializes the binder by scanning the form and starting the mutation observer. */\n private init(): void {\n this.bindSubtree(this.form);\n this.observe();\n }\n\n /**\n * Scans a DOM subtree for form controls and establishes reactive bindings.\n *\n * @param el - The root element of the subtree to scan.\n */\n public bindSubtree(el: Element): void {\n if (el === this.form) {\n const elements = this.form.elements;\n for (let i = 0, len = elements.length; i < len; i++) {\n this.bindField(elements[i]! as Element);\n }\n } else if (el.matches?.(SELECTOR)) {\n this.bindField(el);\n } else {\n const targets = (el as HTMLElement).querySelectorAll?.(SELECTOR);\n if (targets) {\n for (let i = 0, len = targets.length; i < len; i++) {\n this.bindField(targets[i]! as Element);\n }\n }\n }\n }\n\n /**\n * Establishes a two-way binding for an individual form control.\n *\n * Logic: Field Identification\n * Identification is based on the control's `name` attribute. If the name attribute\n * changes, the previous binding is cleaned up and a new lens is established.\n *\n * @param el - The form control element to bind.\n */\n private bindField(el: Element): void {\n const control = el as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\n const name = control.name || el.getAttribute('name');\n if (!name) return;\n\n const oldName = this.names.get(control);\n if (oldName !== undefined && oldName !== name) {\n registry.cleanup(control);\n }\n\n if (this.names.has(control) && this.names.get(control) === name) return;\n\n const entry = this.ensureField(name);\n this.names.set(control, name);\n\n // Logic: Resource Cleanup\n registry.onCleanup(control, () => this.unbindField(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 this.applyValidation(control, name, entry.atom);\n }\n\n /**\n * Integrates declarative validation for a specific form control.\n *\n * Logic: Constraint Validation Bridge\n * Maps validation results from the reactive schema to the browser's native\n * Constraint Validation API (`setCustomValidity`).\n */\n private applyValidation(\n control: HTMLFormElement['elements'][number],\n name: string,\n atom: WritableAtom<unknown>\n ): void {\n const validate = this.options.validation?.[name];\n if (!validate) return;\n\n registry.trackEffect(\n control,\n effect(() => {\n try {\n const res = validate(atom.value);\n let msg = '';\n if (typeof res === 'string') {\n msg = res;\n } else if (res === false) {\n msg = 'Invalid';\n }\n (control as HTMLInputElement).setCustomValidity?.(msg);\n } catch (err) {\n console.error(`Validation error in field \"${name}\":`, err);\n (control as HTMLInputElement).setCustomValidity?.('Validation failed');\n }\n })\n );\n }\n\n /**\n * Specifically handles two-way binding for toggleable controls (checkboxes and radios).\n *\n * Logic: Multi-checkbox Arrays\n * For checkboxes bound to an array, synchronization is performed by maintaining\n * a Set of values, ensuring order-independent updates and preventing\n * duplicate entries during reactive flushes.\n */\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\n if (isCheck && Array.isArray(curr)) {\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 // Logic: Batch Coalescing\n // Marks the handler as an internal AEJ handler to prevent redundant\n // wrapping during multiple patch cycles, maintaining a flat execution stack.\n (handler as unknown as { [INTERNAL_HANDLER]: boolean })[INTERNAL_HANDLER] = true;\n $(el).on('change', handler);\n registry.onCleanup(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 * Retrieves or creates a reactive entry for a specific field name.\n *\n * Logic: Path Transformation\n * Flat HTML 'name' attributes (e.g., 'user.profile[0].name') are converted\n * into dot-separated paths compatible with the `atomLens` structural sharing engine.\n */\n private ensureField(name: string): FieldEntry {\n let entry = this.entries.get(name);\n if (entry) {\n entry.refCount++;\n return entry;\n }\n\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 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) {\n untracked(() => onChange(name, transformed));\n }\n },\n });\n\n entry = { atom: customLens as WritableAtom<unknown>, name, refCount: 1 };\n this.entries.set(name, entry);\n return entry;\n }\n\n /**\n * Releases a field binding and disposes of the associated lens if no other\n * controls are referencing it.\n */\n private unbindField(el: Element, name: string): void {\n const entry = this.entries.get(name);\n if (entry && --entry.refCount <= 0) {\n const disposableAtom = entry.atom as Partial<{ dispose: () => void }>;\n if (typeof disposableAtom.dispose === 'function') {\n disposableAtom.dispose();\n }\n this.entries.delete(name);\n }\n registry.cleanup(el);\n }\n\n /**\n * Monitors the form for structural changes using a MutationObserver.\n */\n private observe(): 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 const added = m.addedNodes;\n for (let j = 0, jLen = added.length; j < jLen; j++) {\n const node = added[j]!;\n if (node.nodeType === Node.ELEMENT_NODE) {\n this.bindSubtree(node as Element);\n }\n }\n } else if (m.attributeName === 'name') {\n this.bindSubtree(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.onCleanup(this.form, () => observer.disconnect());\n }\n}\n\n/**\n * Establishes a two-way reactive binding between a `<form>` and an object atom.\n *\n * When to use:\n * - Recommended for synchronizing standard HTML forms with complex, nested\n * reactive state objects.\n * - Suitable for scenarios requiring declarative validation integrated with\n * browser-native APIs.\n *\n * @param form - The target form element to bind.\n * @param atom - A writable atom containing the state model.\n * @param options - Configuration for transformations and reactive validation.\n *\n * @example\n * ```typescript\n * const user = $.atom({ profile: { name: 'Alice' }, items: [] });\n *\n * $.bindForm($('form')[0], user, {\n * validation: {\n * 'profile.name': (v) => v ? true : 'Name is required'\n * },\n * onChange: (path, val) => console.log(`${path} changed to ${val}`)\n * });\n * ```\n */\nexport function bindForm<T extends object>(\n form: HTMLFormElement,\n atom: WritableAtom<T>,\n options: FormOptions<unknown> = {}\n): void {\n registry.cleanup(form);\n new FormBinder(form, atom, options);\n}\n","/**\n * Iterates over a jQuery collection and executes a callback for each HTMLElement.\n *\n * Reason: jQuery collections can contain non-element nodes (e.g., text or\n * comment nodes). This utility provides a safe, element-only iteration path\n * required for establishing reactive bindings and event listeners.\n *\n * @param jq - The jQuery collection to iterate over.\n * @param fn - The callback function to execute for each element.\n * @returns The original jQuery collection for chaining.\n * @internal\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 if (node && node.nodeType === Node.ELEMENT_NODE) {\n fn(node as HTMLElement);\n }\n }\n return jq;\n}\n\n/**\n * Normalizes a binding source into a tuple containing the source and optional configuration.\n *\n * Logic: This utility uses heuristics to determine if an input represents a\n * configuration tuple (e.g., `[source, options]`) or a simple array-based\n * data value. This is used in unified bindings to support overloaded signatures.\n *\n * @param val - The value or tuple to unpack.\n * @returns A tuple where the first element is the source and the second is optional config.\n * @internal\n */\nexport function unpack<T, O>(val: T | [T, O]): [T, O?] {\n if (!Array.isArray(val) || val.length !== 2) {\n return [val as T];\n }\n\n const second = val[1];\n if (second === null || second === undefined) {\n return [val as T];\n }\n\n // Logic: Check if the second element qualifies as a configuration object or function.\n const isTuple =\n typeof second === 'function' ||\n (typeof second === 'object' && !('value' in second) && !('then' in second));\n\n return isTuple ? (val as [T, O]) : ([val as T] as [T, O?]);\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 { SYSTEM_BINDING } 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 overloaded arguments (key-value pair or mapping object) into a consistent Record.\n *\n * Logic: Argument Normalization\n * Standardizes jQuery-style overloads into a uniform data structure for\n * downstream binding operations.\n *\n * @param keyOrMap - A property name string or a mapping object.\n * @param value - The reactive value (required if `keyOrMap` is a string).\n * @returns A normalized Record map, or null if invalid.\n * @internal\n */\nfunction resolveArgs<V>(\n keyOrMap: string | Record<string, V>,\n value: V | undefined\n): Record<string, V> | null {\n if (typeof keyOrMap === 'object' && keyOrMap !== null) {\n return keyOrMap;\n }\n if (typeof keyOrMap === 'string' && value !== undefined) {\n return { [keyOrMap]: value };\n }\n return null;\n}\n\n/**\n * Binds the text content of elements to a reactive source.\n *\n * When to use:\n * - To synchronize labels, counters, or status messages with an atom's value.\n * - To display formatted strings derived from reactive data.\n *\n * @param source - The reactive atom or computed value.\n * @param formatter - An optional function to transform the value into a string.\n * @returns The original jQuery collection for chaining.\n *\n * @example\n * ```typescript\n * $('.count-display').atomText(counterAtom, (val) => `Total: ${val}`);\n * ```\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 the HTML content of elements to a reactive source.\n *\n * Caution: Ensure the source data is trusted and sanitized. Rendering unsanitized\n * HTML from user input can lead to XSS vulnerabilities.\n *\n * When to use:\n * - To render complex markup or rich text that requires formatting tags.\n *\n * @param source - The reactive atom containing the HTML string.\n * @returns The original jQuery collection for chaining.\n */\n$.fn.atomHtml = function (source: AsyncReactiveValue<string>): JQuery {\n return atomEachElement(this, (el) => bindHtml(el, source));\n};\n\n/**\n * Factory for creating chainable jQuery methods with unified argument resolution.\n *\n * Logic: Method HOC\n * Encapsulates argument normalization and element iteration to provide a\n * declarative interface for chainable plugin methods.\n *\n * @param binder - The underlying binding function.\n * @param errorMsg - Error message to display if arguments are invalid.\n * @internal\n */\nfunction createChainableMethod<V>(\n binder: (el: HTMLElement, map: Record<string, V>) => void,\n errorMsg: string\n) {\n return function (this: JQuery, keyOrMap: string | Record<string, V>, value?: V): JQuery {\n const map = resolveArgs(keyOrMap, value);\n if (!map) {\n console.warn(`${SYSTEM_BINDING.PREFIX} ${errorMsg}`);\n return this;\n }\n return atomEachElement(this, (el) => binder(el, map));\n };\n}\n\n/**\n * Binds CSS classes to reactive conditions.\n *\n * Logic: Class Toggling\n * Supports both toggling a single class based on a condition and managing\n * multiple classes through a mapping object.\n *\n * When to use:\n * - To toggle stateful classes (e.g., 'is-active', 'is-loading').\n * - To manage complex UI states defined by multiple simultaneous flags.\n *\n * @param classNameOrMap - A class name string or a map of `{ className: conditionAtom }`.\n * @param condition - The condition for the class (required if `classNameOrMap` is a string).\n * @returns The original jQuery collection for chaining.\n *\n * @example\n * ```typescript\n * $('.tab').atomClass('active', activeAtom);\n * ```\n */\n$.fn.atomClass = createChainableMethod(\n bindClass,\n SYSTEM_BINDING.ERRORS.MISSING_CONDITION('atomClass')\n);\n\n/**\n * Binds HTML attributes to reactive sources.\n *\n * @example\n * ```typescript\n * $('.link').atomAttr('href', urlAtom);\n * ```\n */\n$.fn.atomAttr = createChainableMethod(bindAttr, SYSTEM_BINDING.ERRORS.MISSING_SOURCE('atomAttr'));\n\n/**\n * Binds DOM properties directly to reactive sources.\n *\n * @example\n * ```typescript\n * $('.input').atomProp('disabled', disabledAtom);\n * ```\n */\n$.fn.atomProp = createChainableMethod(\n bindProp as (el: HTMLElement, map: Record<string, AsyncReactiveValue<unknown>>) => void,\n SYSTEM_BINDING.ERRORS.MISSING_SOURCE('atomProp')\n);\n\n/**\n * Binds inline CSS properties to reactive sources.\n *\n * Note: Specialized implementation to handle optional units.\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 = resolveArgs<CssValue>(propOrMap, value);\n\n if (!map) {\n console.warn(`${SYSTEM_BINDING.PREFIX} ${SYSTEM_BINDING.ERRORS.MISSING_SOURCE('atomCss')}`);\n return this;\n }\n\n return atomEachElement(this, (el) => bindCss(el, map as CssBindings));\n};\n\n/**\n * Controls the visibility of elements based on a reactive condition.\n *\n * When to use:\n * - To show elements when a condition is met (using `display: block` or previous display value).\n *\n * @param condition - The reactive condition governing visibility.\n * @returns The original jQuery collection for chaining.\n */\n$.fn.atomShow = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (el) => bindVisibility(el, condition, false));\n};\n\n/**\n * Controls the invisibility of elements based on a reactive condition.\n *\n * When to use:\n * - To hide elements when a condition is met (using `display: none`).\n *\n * @param condition - The reactive condition governing invisibility.\n * @returns The original jQuery collection for chaining.\n */\n$.fn.atomHide = function (condition: AsyncReactiveValue<boolean>): JQuery {\n return atomEachElement(this, (el) => bindVisibility(el, condition, true));\n};\n\n/**\n * Performs two-way binding for form input values.\n *\n * Logic: Synchronizes the input's `value` with a writable atom. This handles\n * both atom-to-DOM updates and DOM-to-atom changes (via `input` or `change` events).\n *\n * When to use:\n * - To manage state for text inputs, textareas, and select menus.\n *\n * @param atom - The writable atom to synchronize with the input value.\n * @param options - Configuration for debouncing or event triggers.\n * @returns The original jQuery collection for chaining.\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/**\n * Performs two-way binding for checkbox and radio button checked states.\n *\n * @param atom - The writable atom to synchronize with the checked state.\n * @returns The original jQuery collection for chaining.\n */\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 element.\n *\n * Logic: Maps form fields (identified by their `name` attributes) to nested\n * properties within a reactive object atom.\n *\n * When to use:\n * - To synchronize a complex data model with a standard HTML form.\n *\n * @param atom - The writable atom containing the form's data model.\n * @param options - Configuration for validation or submission handling.\n * @returns The original jQuery collection for chaining.\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(SYSTEM_BINDING.PREFIX, 'Skipping non-Form element for atomForm');\n }\n });\n};\n\n/**\n * Binds a reactive event listener to elements.\n *\n * @param event - The name of the DOM event.\n * @param handler - The event handler function.\n * @returns The original jQuery collection for chaining.\n */\n$.fn.atomOn = function (event: string, handler: (e: JQuery.Event) => void): JQuery {\n return atomEachElement(this, (el) => bindOn(el, event, handler));\n};\n\n/** @internal */\ninterface BindingTask {\n key: keyof BindingOptions<unknown>;\n run: (el: HTMLElement, val: unknown) => void;\n}\n\n/**\n * A registry of specialized binding tasks for the unified `.atomBind()` method.\n *\n * Optimization: The order of execution in this array ensures consistent and\n * predictable rendering results (e.g., text content is set before class toggling).\n * @internal\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 * A unified entry point for declaring multiple reactive bindings in a single call.\n *\n * Logic: This method iterates through the provided configuration and executes\n * the corresponding binding tasks in a deterministic order.\n *\n * When to use:\n * - To initialize multiple reactive bindings on an element efficiently.\n * - To maintain organized and readable binding declarations in complex UIs.\n *\n * @param options - A configuration object defining multiple bindings.\n * @returns The original jQuery collection for chaining.\n *\n * @example\n * ```typescript\n * $('.submit-btn').atomBind({\n * text: labelAtom,\n * class: { 'is-loading': loadingAtom },\n * on: { click: handleSubmit }\n * });\n * ```\n */\n$.fn.atomBind = function <T>(this: JQuery, options: BindingOptions<T>): JQuery {\n const opt = options as Record<string, unknown>;\n\n // Check if there are any valid tasks to run.\n const activeTasks: BindingTask[] = [];\n for (let i = 0, len = BINDING_TASKS.length; i < len; i++) {\n const task = BINDING_TASKS[i]!;\n if (opt[task.key] !== undefined) {\n activeTasks.push(task);\n }\n }\n\n if (activeTasks.length === 0) return this;\n\n return atomEachElement(this, (el) => {\n for (let i = 0, len = activeTasks.length; i < len; i++) {\n const task = activeTasks[i]!;\n task.run(el, opt[task.key]);\n }\n });\n};\n\n/**\n * Removes all reactive bindings and cleans up resources for elements in the collection.\n *\n * Caution: This method should be called when elements are permanently removed\n * from the DOM to prevent memory leaks associated with active effects.\n *\n * @returns The original jQuery collection for chaining.\n */\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 a raw DOM element or a jQuery collection into a standard jQuery object.\n *\n * @param $el - The element or collection to normalize.\n * @returns A standard jQuery object.\n * @internal\n */\nexport function wrap($el: Element | JQuery<Element>): JQuery {\n return ($el instanceof Element ? $($el) : $el) as unknown as JQuery;\n}\n\n/**\n * Assigns or removes a stable reactive identifier on a DOM node or collection.\n *\n * Logic: The `data-atom-key` attribute serves as the primary stable identifier\n * for DOM nodes within the list reconciliation engine. This allows the diffing\n * algorithm to perform O(N) re-ordering and node reuse, avoiding the overhead\n * of positional comparisons.\n *\n * @param node - The DOM element, Node, or jQuery collection.\n * @param key - The unique string key to assign, or null to remove the identifier.\n * @internal\n */\nexport function setAtomKey(node: Element | Node | JQuery, key: string | null): void {\n if (node instanceof Element) {\n if (key === null) {\n node.removeAttribute('data-atom-key');\n } else {\n node.setAttribute('data-atom-key', key);\n }\n } else if (!(node as Node).nodeType) {\n const jq = node as JQuery;\n for (let i = 0, len = jq.length; i < len; i++) {\n const el = jq[i];\n if (el instanceof Element) {\n if (key === null) {\n el.removeAttribute('data-atom-key');\n } else {\n el.setAttribute('data-atom-key', key);\n }\n }\n }\n }\n}\n\n/**\n * Performs a deep recursive cleanup of reactive resources associated with a DOM tree.\n *\n * Caution: This method must be executed before an element is permanently detached\n * from the DOM or replaced. Failure to do so may result in \"zombie\" reactive\n * effects remaining in the registry, leading to significant memory leaks.\n *\n * @param node - The root element or jQuery collection to clean up.\n * @internal\n */\nexport function cleanupNodes(node: Element | JQuery): void {\n if (node instanceof Element) {\n registry.cleanupTree(node);\n } else {\n const jq = node as JQuery;\n for (let i = 0, len = jq.length; i < len; i++) {\n const el = jq[i];\n if (el instanceof Element) {\n registry.cleanupTree(el);\n }\n }\n }\n}\n","import type { EffectObject, ListKey } from '@/types';\nimport { setAtomKey } from './utils';\n\n/**\n * Manages the reconciliation state and lifecycle for the `$.fn.atomList` binding.\n *\n * This context tracks historical DOM nodes and keys to enable efficient diffing.\n * Its primary responsibility is coordinating asynchronous item removals (e.g., animations)\n * while ensuring that elements reused in the same cycle are not accidentally destroyed.\n *\n * @internal\n */\nexport class ListContext<T> {\n private _oldKeys: ListKey[] = [];\n private _oldItems: T[] = [];\n private _oldNodes: (Element | JQuery | undefined)[] = [];\n private readonly _removingKeys = new Set<ListKey>();\n private _emptyEl: JQuery | null = null;\n private readonly _keyToIndex = new Map<ListKey, number>();\n\n public 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 get oldKeys() {\n return this._oldKeys;\n }\n set oldKeys(v) {\n this._oldKeys = v;\n }\n get oldItems() {\n return this._oldItems;\n }\n set oldItems(v) {\n this._oldItems = v;\n }\n get oldNodes() {\n return this._oldNodes;\n }\n set oldNodes(v) {\n this._oldNodes = v;\n }\n get removingKeys() {\n return this._removingKeys;\n }\n get keyToIndex() {\n return this._keyToIndex;\n }\n get $emptyEl() {\n return this._emptyEl;\n }\n set $emptyEl(v) {\n this._emptyEl = v;\n }\n\n /**\n * Retrieves the index of a key, supporting string-to-number normalization.\n *\n * Reason: DOM attributes (like `data-atom-key`) are always returned as strings,\n * but the internal `_keyToIndex` map might use numbers.\n */\n getIndex(key: ListKey | string): number | undefined {\n const idx = this._keyToIndex.get(key as ListKey);\n if (idx !== undefined) return idx;\n\n if (typeof key === 'string') {\n const n = Number(key);\n if (!Number.isNaN(n)) return this._keyToIndex.get(n);\n }\n return undefined;\n }\n\n /**\n * Orchestrates the physical removal of an element from the DOM.\n *\n * Logic:\n * 1. If `onRemove` returns a Promise, it waits for completion (e.g., a fade-out animation).\n * 2. Constraint: Before calling `.remove()`, it checks if the element has been \"resurrected\"\n * (assigned a new `data-atom-key`) by a subsequent render cycle.\n */\n scheduleRemoval(k: ListKey, $el: JQuery): void {\n const commit = () => {\n if (this.fx?.isDisposed) return;\n // Why: Prevent removing an element that was reused/resurrected during the removal delay.\n if ($el[0] instanceof Element && $el[0].hasAttribute('data-atom-key')) return;\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) {\n res.then(commit, commit);\n } else {\n commit();\n }\n }\n\n /**\n * Marks a key as \"removing\" and initiates the removal sequence.\n *\n * Note: The `data-atom-key` attribute is cleared immediately to prevent the reconciler\n * from finding this \"ghost\" element via DOM lookups while animations are still running.\n */\n removeItem(k: ListKey, $el: JQuery): void {\n setAtomKey($el, null);\n this._removingKeys.add(k);\n this.scheduleRemoval(k, $el);\n }\n\n /**\n * Performs full cleanup of the list state and event listeners.\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 this.$container.off('.atomList');\n }\n}\n","import type { ListKey, ListKeyFn, ListOptions } from '@/types';\n\nexport type { ListKey, ListKeyFn };\n\n/**\n * Enumeration of lifecycle flags representing the reconciliation status of a list item.\n *\n * These flags are used by the internal DOM synchronizer to determine the minimum\n * required action (skipping, patching, or re-rendering) for each element.\n *\n * When to use:\n * - Internal orchestration of DOM updates within the `atomList` binding engine.\n *\n * @internal\n */\nexport const ItemState = {\n /**\n * Logic: The item's key and data are identical to the previous state.\n * Optimization: No DOM manipulation is required; this is the fastest execution path.\n */\n Unchanged: 0,\n\n /**\n * Logic: The key has been identified in the previous state, but its position\n * or data may require a patch or an update callback execution.\n */\n Existing: 1 << 0,\n\n /**\n * Logic: The item's key was not found in the previous state.\n * Action: A fresh DOM node must be created and inserted.\n */\n New: 1 << 1,\n\n /**\n * Logic: The key matched, but the item's data has changed and no custom\n * `update` callback was provided by the user.\n * Action: Requires a full destruction of the existing node followed by a\n * re-creation to ensure the DOM accurately reflects the new data.\n */\n ForceReplace: 1 << 2,\n} as const;\n\nexport type ItemState = (typeof ItemState)[keyof typeof ItemState];\n\n/**\n * A reconciliation plan generated by the diffing algorithm.\n *\n * Logic: This interface provides index-based buffers and metadata required by\n * the DOM synchronizer to perform atomic mutations with minimal overhead.\n *\n * @internal\n */\nexport interface PreparedDiff<T> {\n /** The collection of unique keys for the new item set. */\n newKeys: ListKey[];\n /** The collection of data items for the new state. */\n newItems: T[];\n /** A set containing all unique keys used for duplicate detection. */\n newKeySet: Set<ListKey>;\n /** A map of new indices to their corresponding indices in the previous state. */\n newIndices: number[];\n /** The reconciliation state assigned to each item. */\n newStates: ItemState[];\n /** The current DOM handles (Element or jQuery) for each item. */\n newNodes: (Element | JQuery | undefined)[];\n\n /**\n * A collection of items that require new DOM construction or HTML parsing\n * during this rendering cycle.\n */\n toRender: { key: ListKey; item: T; index: number }[];\n\n /** The starting index of the \"dirty\" middle section after prefix optimization. */\n startIndex: number;\n /** The ending index of the \"dirty\" section relative to the old list state. */\n oldEndIndex: number;\n /** The ending index of the \"dirty\" section relative to the new list state. */\n newEndIndex: number;\n}\n\n/**\n * A collection of user-provided lifecycle hooks and event configurations.\n *\n * @internal\n */\nexport interface PlaceCallbacks<T> {\n /** Invoked once when an element is first bound to a reactive item. */\n bind?: (($el: JQuery, item: T, index: number) => void) | undefined;\n /** Invoked on subsequent updates when item data changes. */\n update?: (($el: JQuery, item: T, index: number) => void) | undefined;\n /** Invoked when a new item is physically added to the DOM. */\n onAdd?: (($el: JQuery) => void) | undefined;\n /** Invoked to manage the removal of an item, supporting asynchronous transitions. */\n onRemove?: ListOptions<T>['onRemove'] | undefined;\n /** Delegated event listeners for the list container. */\n events?: ListOptions<T>['events'] | undefined;\n}\n","import { shallowEqual } from '@but212/atom-effect-utils';\nimport { SYSTEM_LIST } from '@/constants';\nimport type { ListKey, ListKeyFn, ListOptions } from '@/types';\nimport { debug } from '@/utils/debug';\nimport type { ListContext } from './context';\nimport { ItemState, type PreparedDiff } from './types';\n\n/**\n * Generates a reconciliation plan by calculating the difference between the\n * current list state and the new item set.\n *\n * Logic: This function implements a double-ended diffing algorithm to identify\n * reusable DOM nodes, new entries, and required replacements. It optimizes\n * performance by isolating the \"dirty\" range — skipping unchanged items at\n * both the head and tail of the list.\n *\n * When to use:\n * - Internal orchestration of DOM mutations for the `atomList` binding.\n *\n * @param ctx - The current list context containing historical DOM state.\n * @param items - The new set of items to render.\n * @param itemCount - The total number of new items.\n * @param getKey - A function to derive a unique key for each item.\n * @param update - An optional callback used to patch existing DOM nodes.\n * @param isEqual - An optional equality comparator for items.\n * @returns A detailed diff plan used to execute DOM updates.\n *\n * @example\n * ```typescript\n * const diff = buildIndices(context, nextItems, nextItems.length, getKey, onUpdate, onEqual);\n * ```\n *\n * @internal\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 let oldEndIndex = oldLen - 1;\n let 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: Fast-forward through identical items at the start of the list.\n // This bypasses the mapping and diffing logic for static sections of the list.\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 // Optimization: Fast-forward through identical items at the end of the list.\n // Narrowing the \"dirty\" middle range minimizes the complexity of the O(N) mapping phase.\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 // Logic: Re-populate unchanged head items into the new state buffers.\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\n // Logic: Re-populate unchanged tail items into the new state buffers.\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 const oldIndexMap = new Map<ListKey, number>();\n for (let i = startIndex; i <= oldEndIndex; i++) {\n oldIndexMap.set(oldKeys[i]!, i);\n }\n\n // Logic: Reconcile the remaining \"dirty\" middle section of the list.\n for (let i = startIndex; i <= newEndIndex; i++) {\n const item = items[i]!;\n const 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(SYSTEM_LIST.PREFIX, SYSTEM_LIST.ERRORS.DUPLICATE_KEY(k, i));\n newIndices[i] = -1;\n continue;\n }\n newKeySet.add(k);\n\n const foundIdx = oldIndexMap.get(k);\n\n // Caution: Reclaiming animating nodes.\n // If a key is present in `removingKeys`, its DOM node is currently undergoing\n // a removal transition. To prevent inconsistent UI states, we treat this\n // as a 'New' item (forcing a fresh node creation) rather than attempting\n // to reclaim the transitioning 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\n // Logic: Node reuse strategy.\n // If no custom `update` callback is provided and the item content has changed,\n // the existing DOM node cannot be patched. In this case, we trigger a\n // 'ForceReplace' state to ensure the node is fully re-rendered.\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 { SYSTEM_LIST } 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 * A low-level DOM utility for inserting elements before a specific reference node.\n *\n * This helper supports both raw `Element` instances and jQuery collections,\n * ensuring consistent insertion behavior regardless of the input type.\n *\n * @param elOrJq - The element or jQuery collection to insert.\n * @param nextNode - The reference node to insert before. If null, appends to the container.\n * @param container - The parent container element.\n * @internal\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 } else {\n for (let i = 0, len = elOrJq.length; i < len; i++) {\n const el = elOrJq[i];\n if (el) container.insertBefore(el, nextNode);\n }\n }\n}\n\n/**\n * Orchestrates the cleanup of a list container and the rendering of empty placeholders.\n *\n * Logic: If an `onRemove` callback is provided, the function performs asynchronous\n * removals for each item to allow for exit animations. Otherwise, it executes a\n * destructive `empty()` on the container for efficiency.\n *\n * When to use:\n * - To reset a list container during reconciliation or when the data source becomes empty.\n *\n * @param ctx - The list context containing historical state.\n * @param itemCount - The number of items in the new data set.\n * @param $container - The jQuery-wrapped container.\n * @param empty - The template or element to display when the list is empty.\n * @internal\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 { onRemove } = ctx;\n if (!onRemove) {\n $container.empty();\n } else {\n // Reason: Coordinated exit animations are triggered for every existing row\n // to maintain visual consistency during batch updates.\n ctx.oldKeys.forEach((k, i) => {\n const node = ctx.oldNodes[i];\n if (node) {\n ctx.removeItem(k, wrap(node as Element | JQuery<Element>));\n }\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 * Transforms items into DOM handles based on the reconciliation plan.\n *\n * Optimization: If all items utilize string templates and the list is undergoing\n * an initial render (cold start), the function returns sanitized HTML fragments\n * for direct `innerHTML` injection, bypassing the overhead of individual jQuery\n * object construction.\n *\n * When to use:\n * - Internal processing of new items within the `atomList` lifecycle.\n *\n * @param diff - The prepared diff plan.\n * @param options - Configuration options for the list.\n * @param isInitial - Indicates whether this is the first render of the list.\n * @returns An array of sanitized HTML strings if the fast-path is applicable; otherwise null.\n * @internal\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 = toRender.map((entry) => options.render(entry.item, entry.index));\n const htmlParts = results.filter((raw): raw is string => typeof raw === 'string');\n const isAllStrings = htmlParts.length === renderCount;\n\n let sanitized: string[] | null = null;\n if (htmlParts.length > 0) sanitized = batchSanitize(htmlParts);\n\n // Optimization: Fast-path for initial renders using string-only templates without custom bindings.\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, len = toRender.length; i < len; i++) {\n const entry = toRender[i]!;\n const { key, index: targetIdx } = entry;\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 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 * Sanitizes a batch of HTML strings in a single pass to improve performance.\n *\n * Reason: Reduces the overhead of the sanitization engine (e.g., DOMPurify)\n * by merging multiple fragments into a single string separated by unique sentinels.\n *\n * @param parts - An array of HTML strings to sanitize.\n * @returns An array of sanitized HTML strings.\n * @internal\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\n return sanitizeHtml(parts.join(sep)).split(sep);\n}\n\n/**\n * Identifies and removes items that are no longer present in the reactive data set.\n *\n * Logic: Iterates through the historical key set and triggers the removal\n * lifecycle for any key that is not found in the new state.\n *\n * @param ctx - The list context containing historical state.\n * @param diff - The prepared diff plan.\n * @internal\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 within the head/tail optimization range are excluded.\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 * Strategically places item nodes into the DOM container based on the reconciliation plan.\n *\n * Logic: This function selects the most efficient injection path (innerHTML,\n * Fragment, or complex Moves) based on the current state of the container.\n *\n * Optimization: When performing moves, the loop iterates backwards to use\n * `insertBefore(nextNode)`, which is more efficient across most JS engines\n * than forward insertions.\n *\n * @param ctx - The list context.\n * @param diff - The prepared diff plan.\n * @param container - The parent DOM element.\n * @param callbacks - User-provided hooks for binding and updates.\n * @param htmlFragments - Optional pre-rendered HTML strings from the fast-path.\n * @internal\n */\nconst ACTION_TABLE: Record<number, (keyof PlaceCallbacks<unknown>)[]> = {\n [ItemState.Unchanged]: [],\n [ItemState.Existing]: ['update'],\n [ItemState.New]: ['bind', 'onAdd'],\n [ItemState.ForceReplace]: ['bind'],\n};\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 if (htmlFragments) {\n container.innerHTML = htmlFragments.join('');\n let el = container.firstElementChild;\n newKeys.forEach((key, i) => {\n if (!el) return;\n const $el = $(el) as unknown as JQuery;\n el.setAttribute('data-atom-key', String(key));\n newNodes[i] = el;\n newStates[i] = ItemState.Existing;\n debug.domUpdated(SYSTEM_LIST.PREFIX, $el, '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 < count; i++) {\n const node = newNodes[i];\n if (!node) continue;\n if (node instanceof Element) {\n frag.appendChild(node);\n } else {\n for (let j = 0, jLen = node.length; j < jLen; j++) {\n const entry = node[j];\n if (entry) frag.appendChild(entry);\n }\n }\n }\n container.innerHTML = '';\n container.appendChild(frag);\n } else {\n let next: Node | null = null;\n let min = Infinity;\n for (let i = count - 1; i >= 0; i--) {\n const idx = newIndices[i]!;\n const node = newNodes[i];\n if (!node) continue;\n\n const first = node instanceof Element ? node : (node as JQuery)[0];\n if (first) {\n if (idx !== -1 && idx < min) {\n min = idx;\n } else {\n insertOrAppend(node as Element | JQuery, next, container);\n }\n next = first;\n }\n }\n }\n\n const { onAdd, bind, update } = callbacks;\n for (let i = 0; i < count; i++) {\n const state = newStates[i]!;\n const actions = ACTION_TABLE[state] ?? [];\n const node = newNodes[i];\n if (actions.length === 0 || !node) continue;\n\n const $el = wrap(node as Element | JQuery<Element>);\n const item = newItems[i]!;\n\n for (let j = 0, aLen = actions.length; j < aLen; j++) {\n const action = actions[j]!;\n if (action === 'onAdd' && onAdd) {\n onAdd($el);\n ctx.removingKeys.delete(newKeys[i]!);\n debug.domUpdated(SYSTEM_LIST.PREFIX, $el, 'list.add', item);\n } else if (action === 'bind' && bind) {\n bind($el, item, i);\n } else if (action === 'update' && update) {\n update($el, item, i);\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 } from '@/utils';\nimport { ListContext } from './context';\nimport { buildIndices } from './diff';\nimport { cleanupRemoved, handleEmpty, placeItems, renderItems } from './dom';\nimport type { PlaceCallbacks } from './types';\n\n/**\n * Internal WeakMap storage used to associate DOM elements with their persistent\n * list contexts and controlling effects.\n */\nconst instances = new WeakMap<Element, { fx: EffectObject; ctx: ListContext<unknown> }>();\n\ninterface EventBinding {\n type: string;\n selector: string;\n callback: Function;\n}\n\n/**\n * Synchronizes a reactive atom array with a jQuery container for automated list rendering.\n *\n * This function establishes a reactive connection between a data source and the\n * DOM tree. It utilizes a persistent `ListContext` to track state across updates\n * and wraps the reconciliation logic within a reactive effect to ensure the\n * view automatically stays in sync with the data.\n *\n * When to use:\n * - To render dynamic lists that require high-performance updates and reordering.\n * - To implement state-driven UI components such as data grids, dashboards, or real-time feeds.\n *\n * Optimization:\n * - Employs a double-ended diffing algorithm to minimize DOM mutations during list updates.\n * - Supports sanitized batch-rendering for optimized initial renders (cold starts).\n *\n * @param source - The reactive atom containing the array of items.\n * @param options - Configuration options for item keys, rendering, and lifecycle hooks.\n * @returns The original jQuery collection for chaining.\n *\n * @example\n * ```typescript\n * import { atom } from '@but212/atom-effect';\n *\n * const items = atom([{ id: 1, text: 'A' }, { id: 2, text: 'B' }]);\n *\n * $('#list').atomList(items, {\n * key: 'id',\n * render: (item) => `<li>${item.text}</li>`,\n * events: {\n * 'click li': (item) => console.log('Clicked:', item.text)\n * }\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 const eventBindings: EventBinding[] = options.events\n ? Object.entries(options.events).map(([eventKey, callback]) => {\n const [type, ...selectorParts] = eventKey.trim().split(/\\s+/);\n return {\n type: type!,\n selector: selectorParts.length > 0 ? selectorParts.join(' ') : '> *',\n callback: callback!,\n };\n })\n : [];\n\n for (let i = 0, len = this.length; i < len; i++) {\n const element = this[i]!;\n const $c = $(element);\n\n const prev = instances.get(element);\n if (prev) {\n prev.fx.dispose();\n prev.ctx.dispose();\n }\n\n const ctx = new ListContext<T>($c, getSelector(element), options.onRemove);\n const fx = effect(() => {\n const items = source.value;\n const count = items.length;\n\n untracked(() => {\n handleEmpty(ctx, count, $c, options.empty);\n if (count === 0) return;\n\n const isInitial = 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 fragment = renderItems(diff, options, isInitial);\n\n cleanupRemoved(ctx, diff);\n placeItems(ctx, diff, element, callbacks, fragment);\n\n ctx.oldKeys = diff.newKeys;\n ctx.oldItems = diff.newItems;\n ctx.oldNodes = diff.newNodes;\n });\n });\n\n ctx.fx = fx;\n if (eventBindings.length > 0) setupEvents(ctx, $c, eventBindings);\n\n registry.trackEffect(element, fx);\n instances.set(element, { fx, ctx });\n\n registry.onCleanup(element, () => {\n ctx.dispose();\n instances.delete(element);\n });\n }\n return this;\n}\n\nfunction setupEvents<T>(ctx: ListContext<T>, $container: JQuery, bindings: EventBinding[]): void {\n for (let i = 0, len = bindings.length; i < len; i++) {\n const { type, selector, callback } = bindings[i]!;\n\n $container.on(\n `${type}.atomList`,\n selector,\n function (this: HTMLElement, e: JQuery.TriggeredEvent) {\n const target = (e.target as HTMLElement).closest?.('[data-atom-key]') as HTMLElement | null;\n if (!target) return;\n\n const rawKey = target.getAttribute('data-atom-key');\n if (rawKey === null) return;\n\n const index = ctx.getIndex(rawKey);\n if (index !== undefined) {\n callback.call(target, ctx.oldItems[index]!, index, e);\n }\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\n/**\n * A frozen empty object used as the default fallback for component properties.\n * @internal\n */\nconst DEFAULT_PROPS = Object.freeze({});\n\n/**\n * Orchestrates the lifecycle and mounting of a reactive UI component onto a jQuery collection.\n *\n * This function manages the initialization, reactive isolation, and teardown\n * registration for discrete UI units. It ensures that components are executed\n * within a safe window to prevent dependency leaks and that their resources\n * are automatically released when the element is removed from the DOM.\n *\n * When to use:\n * - To initialize complex UI modules that manage internal reactive effects,\n * event listeners, or child bindings.\n * - To build reusable \"Logic Units\" that require dedicated cleanup phases.\n *\n * Lifecycle:\n * 1. Cleanup: Existing reactive bindings on the target elements are destroyed to prevent conflicts.\n * 2. Isolation: The component is executed within `untracked` and `batch` scopes to\n * prevent the parent context from tracking the component's internal dependencies.\n * 3. Registration: The returned cleanup function (or unmount hook) is registered\n * in the global registry for automatic execution during disposal.\n *\n * @param component - The component function to initialize.\n * @param props - Optional properties to pass to the component.\n * @returns The original jQuery collection for chaining.\n *\n * @example\n * ```typescript\n * import { atom, effect } from '@but212/atom-effect';\n *\n * // 1. Define a component\n * const MyCounter = ($el, props) => {\n * const count = atom(0);\n * const fx = effect(() => $el.text(`${props.title}: ${count.value}`));\n *\n * // Return a teardown function\n * return () => fx.dispose();\n * };\n *\n * // 2. Mount the component\n * $('.counter-host').atomMount(MyCounter, { title: 'Click Count' });\n * ```\n */\n$.fn.atomMount = function <P>(this: JQuery, component: ComponentFn<P>, props?: P): JQuery {\n const mergedProps = (props ?? DEFAULT_PROPS) as P;\n\n return atomEachElement(this, (element) => {\n // Reason: Existing bindings are cleaned up first to prevent memory leaks and\n // conflicting reactive effects if mounting on a non-empty element.\n registry.cleanupTree(element);\n\n // Logic: 'untracked' ensures the component's initialization logic does not\n // establish dependency loops with the parent caller. 'batch' ensures that\n // initial DOM manipulations occur atomically.\n const hook = untracked(() => batch(() => component($(element), mergedProps)));\n\n if (hook) {\n const teardown = typeof hook === 'function' ? hook : hook.unmount;\n registry.setTeardown(element, teardown);\n }\n });\n};\n\n/**\n * Manually triggers the unmounting and resource cleanup for elements in the collection.\n *\n * When to use:\n * - To explicitly destroy a mounted component and its associated reactive effects.\n *\n * @returns The original jQuery collection for chaining.\n */\n$.fn.atomUnmount = function (this: JQuery): JQuery {\n return atomEachElement(this, (element) => registry.cleanupTree(element));\n};\n","import { Option, Result } from '@but212/atom-effect-utils';\nimport { debug } from '@/utils/debug';\nimport { registry } from './registry';\n\n/** @internal */\nexport type NavigationType = 'init' | 'push' | 'replace' | 'pop';\n\n/** @internal */\nexport interface 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\n/** @internal Attributes that must persist during navigation to maintain SPA state/identity. */\nconst ATTR_PRESERVE = new Set(['id', 'data-atom-nav-target']);\n\nconst ATTR_EXTRACT_EXCLUDE = new Set(['id']);\n\nconst PARSER = new DOMParser();\n\n/** @internal */\nexport const normalizePath = (path: string): string => {\n const len = path.length;\n if (len === 0) return path;\n let start = 0;\n while (start < len && path[start] === '/') start++;\n let end = len;\n while (end > start && path[end - 1] === '/') end--;\n return start === 0 && end === len ? path : path.slice(start, end);\n};\n\n/** @internal */\nexport const splitPath = (path: string): { route: string; query: Option<string> } => {\n const idx = path.indexOf('?');\n if (idx === -1) {\n return { route: normalizePath(path), query: Option.none };\n }\n return {\n route: normalizePath(path.substring(0, idx)),\n query: Option.some(path.substring(idx + 1)),\n };\n};\n\n/** @internal */\nexport const parseQuery = (raw: string): Record<string, string> =>\n Object.fromEntries(new URLSearchParams(raw));\n\n/** @internal */\nexport const getAbsoluteUrl = (url: string, base: string): Result<URL, Error> =>\n Result.tryCatch(() => new URL(url, base));\n\n/**\n * SEO Metadata Schema\n * Defines the mapping between internal state keys and physical HTML tags.\n */\nexport const META_SCHEMA = [\n {\n selector: 'meta[name=\"description\"]',\n tag: 'meta',\n attr: 'content',\n key: 'description',\n staticAttrs: { name: 'description' },\n },\n {\n selector: 'meta[name=\"keywords\"]',\n tag: 'meta',\n attr: 'content',\n key: 'keywords',\n staticAttrs: { name: 'keywords' },\n },\n {\n selector: 'link[rel=\"canonical\"]',\n tag: 'link',\n attr: 'href',\n key: 'canonical',\n staticAttrs: { rel: 'canonical' },\n },\n] as const;\n\n/**\n * Synchronizes document head metadata with the provided state.\n *\n * Why: Ensures SEO-critical tags stay in sync during SPA transitions\n * without a full page reload.\n *\n * Side Effect: Creates missing tags in `<head>` if defined in `meta` record.\n */\nexport function syncMetaData(win: Window, meta?: Record<string, string>): void {\n const doc = win.document;\n const head = doc.head;\n for (let i = 0; i < META_SCHEMA.length; i++) {\n const s = META_SCHEMA[i];\n if (!s) continue;\n const value = meta ? meta[s.key] : undefined;\n const el = head.querySelector(s.selector) as HTMLElement | null;\n\n if (value === undefined) {\n if (el) el.remove();\n continue;\n }\n\n const target = el || head.appendChild(doc.createElement(s.tag));\n if (!el) {\n const sAttrs = s.staticAttrs as Record<string, string>;\n for (const k in sAttrs) {\n const val = sAttrs[k];\n if (val !== undefined) target.setAttribute(k, val);\n }\n }\n if (target.getAttribute(s.attr) !== value) {\n target.setAttribute(s.attr, value);\n }\n }\n}\n\n/**\n * Updates element attributes while preserving internal tracking IDs.\n *\n * Constraint: Attributes in `ATTR_PRESERVE` (like `id`) are never removed,\n * even if missing from the next state, to prevent breaking DOM references.\n */\nexport function updateAttributes(el: HTMLElement, next: Record<string, string>): void {\n const attrs = el.attributes;\n for (let i = attrs.length - 1; i >= 0; i--) {\n const attr = attrs[i];\n if (!attr) continue;\n const name = attr.name;\n if (!ATTR_PRESERVE.has(name) && !(name in next)) {\n el.removeAttribute(name);\n }\n }\n\n for (const name in next) {\n const value = next[name];\n if (value !== undefined && el.getAttribute(name) !== value) {\n el.setAttribute(name, value);\n }\n }\n}\n\n/**\n * Manages viewport scrolling after a navigation event.\n * Priority: Hash element > Window top (if fallback enabled).\n */\nexport function performScroll(win: Window, hash?: string, fallbackToTop = false): void {\n const id = decodeURIComponent(hash || '');\n const el = id ? win.document.getElementById(id) : null;\n if (el) {\n el.scrollIntoView({ behavior: 'auto', block: 'start' });\n } else if (!hash || fallbackToTop) {\n win.scrollTo(0, 0);\n }\n}\n\n/** @internal */\ninterface NavEventLike {\n defaultPrevented?: boolean;\n isDefaultPrevented?: () => boolean;\n originalEvent?: NavEventLike;\n ctrlKey?: boolean;\n metaKey?: boolean;\n altKey?: boolean;\n shiftKey?: boolean;\n button?: number;\n}\n\n/**\n * Filters click events to determine if they should trigger client-side navigation.\n *\n * Why: Ignores modified clicks (Ctrl+Click) or right-clicks to preserve native\n * browser features (e.g., \"Open in new tab\").\n */\nexport function isNavigationClick(e: MouseEvent | JQuery.TriggeredEvent): boolean {\n const ne = e as NavEventLike;\n const me = ne.originalEvent || ne;\n\n if (ne.defaultPrevented || ne.isDefaultPrevented?.() || me.defaultPrevented) {\n return false;\n }\n // Reason: Modified clicks imply native browser intent (new tab, bookmark, etc).\n if (me.ctrlKey || me.metaKey || me.altKey || me.shiftKey) {\n return false;\n }\n return me.button === 0 || me.button === undefined;\n}\n\n/** @internal Priority-ordered rules for link interception. */\nconst INTERCEPT_RULES: Array<{\n match: (el: Element, win: Window) => boolean;\n result: boolean;\n}> = [\n { match: (el) => el.getAttribute('data-nav') === 'false', result: false },\n { match: (el) => ['data-ignore', 'download'].some((a) => el.hasAttribute(a)), result: false },\n {\n match: (el) =>\n el.getAttribute('rel') === 'external' || (el as HTMLAnchorElement).rel === 'external',\n result: false,\n },\n { match: (el) => ['data-route', 'data-path'].some((a) => el.hasAttribute(a)), result: true },\n {\n match: (el) => !!el.getAttribute('target') && el.getAttribute('target') !== '_self',\n result: false,\n },\n { match: (el) => el.tagName.toUpperCase() !== 'A', result: false },\n {\n match: (el, win) => {\n // Logic: If origins differ or protocol isn't web-standard, let the browser handle it.\n const a = el as HTMLAnchorElement;\n const hrefAttr = a.getAttribute('href');\n if (!hrefAttr || hrefAttr[0] === '#') return true;\n\n const loc = win.location;\n if (a.origin !== loc.origin || !/^https?:/.test(a.protocol)) return true;\n\n // Note: Pure hash changes within the same path should NOT be intercepted\n // by the router to allow native hashchange behavior.\n return a.pathname === loc.pathname && a.search === loc.search && a.hash.startsWith('#');\n },\n result: false,\n },\n];\n\n/**\n * Determines if a link click should be intercepted by the SPA router.\n *\n * Example:\n * ```ts\n * $(document).on('click', 'a', (e) => {\n * if (isInterceptee(e.currentTarget)) {\n * e.preventDefault();\n * navigate(e.currentTarget.href);\n * }\n * });\n * ```\n */\nexport function isInterceptee(el: Element, win: Window = window): boolean {\n for (const rule of INTERCEPT_RULES) {\n if (rule.match(el, win)) return rule.result;\n }\n return true;\n}\n\n/** @internal */\nexport function getUrlParts(url: string, base: string): { pathAndSearch: string; hash: string } {\n const res = getAbsoluteUrl(url, base);\n if (Result.isErr(res)) return { pathAndSearch: url, hash: '' };\n const obj = Result.unwrap(res);\n return {\n pathAndSearch: obj.pathname + obj.search,\n hash: obj.hash.slice(1),\n };\n}\n\n/**\n * Calculates whether the viewport should scroll after a navigation transition.\n *\n * Why: Prevents jarring scroll jumps during 'Pop' (Back/Forward) events while\n * ensuring 'Push' events start at the top of the new content.\n */\nexport function getScrollDecision(params: {\n hash: string;\n type: NavigationType;\n isNewTarget: boolean;\n prevHash: string;\n scrollToTop: boolean;\n}): { shouldScroll: boolean; resetScroll: boolean } {\n const { hash, type, isNewTarget, prevHash, scrollToTop } = params;\n const isPop = type === 'pop';\n const isHashRemoval = !hash && prevHash !== '';\n\n const shouldScroll = !!hash || (!isPop && (isHashRemoval || (isNewTarget && scrollToTop)));\n const resetScroll = !isPop && isNewTarget && scrollToTop;\n\n return { shouldScroll, resetScroll };\n}\n\n/** @internal */\nexport function extractMetaData(doc: Document | Element): Record<string, string> {\n const meta: Record<string, string> = {};\n for (const schema of META_SCHEMA) {\n if (!schema) continue;\n const el = doc.querySelector(schema.selector);\n const value = el?.getAttribute(schema.attr);\n if (value) meta[schema.key] = value;\n }\n return meta;\n}\n\n/** @internal Extracts path relative to a base for routing logic. */\nexport function resolveAnchorPath(el: Element, base?: string): string {\n const attr = el.getAttribute('href') || el.getAttribute('xlink:href') || '';\n if (attr.startsWith('#')) return normalizePath(attr.substring(1));\n\n let p: string;\n let s: string;\n\n if (el instanceof HTMLAnchorElement && el.href) {\n p = el.pathname;\n s = el.search;\n } else {\n const baseUrl = location.href.startsWith('http') ? `${location.origin}/` : 'http://localhost/';\n const res = getAbsoluteUrl(attr, baseUrl);\n if (Result.isErr(res)) return '';\n const url = Result.unwrap(res);\n p = url.pathname;\n s = url.search;\n }\n\n if (!p.startsWith('/')) p = `/${p}`;\n if (base) {\n const b = base.endsWith('/') ? base : `${base}/`;\n const normalizedP = p.endsWith('/') ? p : `${p}/`;\n if (normalizedP.startsWith(b)) p = p.substring(base.length);\n }\n return normalizePath(p) + s;\n}\n\n/**\n * Parses raw HTML strings into a structured `ContentState`.\n *\n * Why: Allows the router to perform \"Fragment Extraction\" — extracting\n * only specific container content and page metadata from a full server response.\n */\nexport function extractContent(params: {\n html: string;\n selector?: string | undefined;\n redirectUrl?: string | null | undefined;\n}): ContentState {\n const { html, selector, redirectUrl } = params;\n const doc = PARSER.parseFromString(html, 'text/html');\n\n const titleEl = doc.querySelector('title');\n const title = titleEl ? (titleEl.textContent?.trim() ?? null) : null;\n\n const meta = extractMetaData(doc);\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 const attrs = contentNode.attributes;\n for (let i = 0, len = attrs.length; i < len; i++) {\n const attr = attrs[i];\n if (attr && !ATTR_EXTRACT_EXCLUDE.has(attr.name)) {\n attributes[attr.name] = attr.value;\n }\n }\n }\n\n return {\n html: rawHtml.trim(),\n title,\n attributes,\n redirectUrl,\n meta,\n };\n}\n\n/** @internal */\nexport function updateActiveState(params: {\n el: Element;\n active: boolean;\n activeClass: string;\n}): void {\n const { el, active, activeClass } = params;\n el.classList.toggle(activeClass, active);\n if (active) el.setAttribute('aria-current', 'page');\n else el.removeAttribute('aria-current');\n}\n\n/** @internal SPA Link Recognition Specification */\nexport const NAV_SPEC = {\n selectors: 'a, [data-route]',\n attributes: ['href', 'data-route', 'xlink:href'],\n} as const;\n\n/** @internal */\nexport type NavFeatureType = 'nav' | 'router';\n\n/** @internal */\ninterface NavManager {\n type: NavFeatureType;\n canLeave?: (() => boolean) | undefined;\n}\n\n/**\n * Coordination layer to prevent feature collisions.\n *\n * Why: Prevents race conditions when both `atomNav` and `$.route` are applied\n * to the same DOM element. It also aggregates 'Leave' guards for the entire tree.\n *\n * @internal\n */\nclass NavigationCoordinator {\n private managers = new Map<Element, NavManager>();\n\n /**\n * Registers a navigation manager.\n * Warning: Throws a console warning if a target is double-managed by\n * different navigation features.\n */\n register(target: Element, type: NavFeatureType, canLeave?: () => boolean): void {\n const existing = this.managers.get(target);\n if (existing && existing.type !== type) {\n debug.warn(\n '[atom-navigation]',\n `Target collision detected! Element is already managed by ${existing.type}. ` +\n `Mixing atomNav and $.route on the same container leads to unpredictable state.`\n );\n }\n\n this.managers.set(target, { type, canLeave });\n\n registry.onCleanup(target, () => {\n this.managers.delete(target);\n });\n }\n\n /**\n * Checks if navigation is allowed by scanning all registered guards\n * within the container.\n */\n canLeaveWithin(container: Element): boolean {\n if (this.managers.size === 0) return true;\n for (const [el, manager] of this.managers) {\n if (manager.canLeave && container.contains(el)) {\n if (manager.canLeave() === false) return false;\n }\n }\n return true;\n }\n\n /** @internal */\n isNestedIn(el: Element, type: NavFeatureType): boolean {\n let curr: Element | null = el.parentElement;\n while (curr) {\n const manager = this.managers.get(curr);\n if (manager?.type === type) return true;\n curr = curr.parentElement;\n }\n return false;\n }\n\n /** @internal */\n getManagerType(target: Element): NavFeatureType | undefined {\n return this.managers.get(target)?.type;\n }\n}\n\n/** Global singleton for managing cross-component navigation lifecycle. */\nexport const navCoordinator = new NavigationCoordinator();\n","import { untracked } from '@but212/atom-effect';\nimport { Option, Result } from '@but212/atom-effect-utils';\nimport { normalizePath, parseQuery, resolveAnchorPath, splitPath } from '@/core/navigation';\nimport type { RouteDefinition, Router } from '@/types';\nimport type { MatchEntry, MatchResult, UrlAdapter } from './types';\n\n/**\n * Logic: History API Adapter\n * Orchestrates modern URL synchronization using window.history.\n */\nconst HISTORY_ADAPTER: UrlAdapter = {\n get: (base) => {\n let p = location.pathname;\n // Constraint: Strips the base path to ensure route matching is relative to the app root.\n if (base && p.startsWith(base)) p = p.substring(base.length);\n return {\n path: normalizePath(p),\n query: parseQuery(location.search.substring(1)),\n url: location.pathname + location.search,\n };\n },\n commit: (fullPath, base) => {\n const { route, query } = splitPath(fullPath);\n const url = new URL(route, `${location.origin}${base}/`.replace(/\\/+$/, '/'));\n Option.map(query, (q) => (url.search = q));\n const urlStr = url.pathname + url.search;\n Result.tryCatch(() => history.pushState(null, '', urlStr));\n return { path: normalizePath(route), query: Object.fromEntries(url.searchParams), url: urlStr };\n },\n revert: (prev) => {\n // Reason: Prevents redundant state pushes if the location already matches the target.\n if (location.pathname + location.search !== prev) {\n Result.tryCatch(() => history.replaceState(null, '', prev));\n }\n },\n resolveAnchor: (el, base) => resolveAnchorPath(el, base),\n setupListener: (h) => {\n window.addEventListener('popstate', h);\n return () => window.removeEventListener('popstate', h);\n },\n};\n\n/**\n * Logic: Hash Adapter\n * Legacy/Compatibility mode for static hosting or environments without URL rewrite support.\n */\nconst HASH_ADAPTER: UrlAdapter = {\n get: () => {\n const { route, query } = splitPath(location.hash.slice(1));\n return { path: route, query: parseQuery(Option.unwrapOr(query, '')), url: location.hash };\n },\n commit: (fullPath) => {\n const { route, query } = splitPath(fullPath);\n const url = `#${Option.isSome(query) ? `${route}?${Option.unwrap(query)}` : route}`;\n location.hash = url;\n return { path: normalizePath(route), query: parseQuery(Option.unwrapOr(query, '')), url };\n },\n revert: (prev) => {\n if (location.hash !== prev) location.hash = prev;\n },\n resolveAnchor: (el, base) => HISTORY_ADAPTER.resolveAnchor(el, base),\n setupListener: (h) => {\n window.addEventListener('hashchange', h);\n return () => window.removeEventListener('hashchange', h);\n },\n};\n\n/**\n * Factory for creating a URL adapter based on the application's routing strategy.\n *\n * When to use:\n * - Use 'history' for clean URLs (requires server-side fallback to index.html).\n * - Use 'hash' for legacy support or environments where the server is not configurable.\n *\n * @param mode - 'history' or 'hash'.\n * @param basePath - Optional root segment (e.g., '/admin') if the app is not at domain root.\n *\n * @example\n * const adapter = createAdapter('history', '/my-app');\n */\nexport const createAdapter = (mode: 'history' | 'hash', basePath?: string) => {\n const adapter = mode === 'history' ? HISTORY_ADAPTER : HASH_ADAPTER;\n const base = basePath ? `/${normalizePath(basePath)}` : '';\n return {\n get: () => adapter.get(base),\n commit: (path: string) => adapter.commit(path, base),\n revert: (prev: string) => adapter.revert(prev),\n resolveAnchor: (el: Element) => adapter.resolveAnchor(el, base),\n setupListener: (h: () => void) => adapter.setupListener(h),\n };\n};\n\nexport interface RouteMatcher {\n readonly exact: Map<string, MatchEntry>;\n readonly dynamic: MatchEntry[];\n}\n\nconst SUPPORTS_URL_PATTERN = typeof URLPattern !== 'undefined';\n\n/**\n * Optimization: Tiered Compilation Strategy\n * Routes are compiled into the most efficient matcher possible to minimize matching overhead.\n */\nconst COMPILERS: Array<{\n test: (pattern: string) => boolean;\n compile: (pattern: string, def: RouteDefinition) => MatchEntry;\n}> = [\n // Tier 1: Static Routes\n // Logic: Direct string equality for patterns without placeholders.\n {\n test: (p) => !p.includes(':'),\n compile: (pattern, def) => {\n const result = Option.some({ route: { pattern, def }, params: {} });\n return {\n pattern,\n def,\n match: (path) => (path === pattern ? result : Option.none),\n };\n },\n },\n // Tier 2: Native URLPattern API\n // Logic: Leverages modern browser internals for high-performance complex matching.\n {\n test: () => SUPPORTS_URL_PATTERN,\n compile: (pattern, def) => {\n const urlPattern = new URLPattern({ pathname: `/${pattern}` });\n return {\n pattern,\n def,\n match: (path) => {\n const result = urlPattern.exec({ pathname: `/${path}` });\n if (!result) return Option.none;\n const params: Record<string, string> = {};\n const groups = result.pathname.groups;\n for (const key in groups) {\n const val = groups[key];\n if (val != null) params[key] = val;\n }\n return Option.some({ route: { pattern, def }, params });\n },\n };\n },\n },\n // Tier 3: Regex Fallback\n // Logic: Robust, universal matching for legacy browsers or complex edge cases.\n {\n test: () => true,\n compile: (pattern, def) => {\n const paramNames: string[] = [];\n const regex = new RegExp(\n `^${pattern.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&').replace(/:(\\w+)/g, (_, name) => {\n paramNames.push(name);\n return '([^/]+)';\n })}$`\n );\n return {\n pattern,\n def,\n match: (path) => {\n const match = path.match(regex);\n if (!match) return Option.none;\n const params: Record<string, string> = {};\n for (let i = 0, len = paramNames.length; i < len; i++) {\n const val = match[i + 1] || '';\n if (val.indexOf('%') !== -1) {\n try {\n params[paramNames[i]!] = decodeURIComponent(val);\n continue;\n } catch {\n /* fallback to raw value if decoding fails */\n }\n }\n params[paramNames[i]!] = val;\n }\n return Option.some({ route: { pattern, def }, params });\n },\n };\n },\n },\n];\n\n/**\n * Selects and executes the optimal compiler for a given pattern.\n */\nfunction compile(pattern: string, def: RouteDefinition): MatchEntry {\n for (let i = 0, len = COMPILERS.length; i < len; i++) {\n const compiler = COMPILERS[i]!;\n if (compiler.test(pattern)) return compiler.compile(pattern, def);\n }\n return COMPILERS[COMPILERS.length - 1]!.compile(pattern, def);\n}\n\n/**\n * Optimization: Separation of Concerns\n * Partitions routes into 'exact' and 'dynamic' buckets to enable O(1) lookups for static paths.\n */\nexport function createRouteMatcher(routes: Record<string, RouteDefinition>): RouteMatcher {\n const exact = new Map<string, MatchEntry>();\n const dynamic: MatchEntry[] = [];\n for (const path in routes) {\n const def = routes[path];\n if (def === undefined) continue;\n const normalized = normalizePath(path);\n const entry = compile(normalized, def);\n if (normalized.includes(':')) dynamic.push(entry);\n else exact.set(normalized, entry);\n }\n return { exact, dynamic };\n}\n\n/**\n * Attempts to match a path against the compiled routing table.\n */\nexport function matchRoute(matcher: RouteMatcher, path: string): MatchResult {\n const exactMatch = matcher.exact.get(path);\n if (exactMatch) return exactMatch.match(path);\n for (let i = 0, len = matcher.dynamic.length; i < len; i++) {\n const result = matcher.dynamic[i]!.match(path);\n if (Option.isSome(result)) return result;\n }\n return Option.none;\n}\n\n/**\n * Finds the canonical route pattern for a given resolved path.\n */\nexport function getRoutePattern(matcher: RouteMatcher, path: string): string {\n return Option.unwrapOr(\n Option.map(matchRoute(matcher, path), (m) => m.route.pattern),\n ''\n );\n}\n\n/**\n * Resolves a raw path into a matched route definition with parameters and 404 fallback logic.\n */\nexport function resolveRoute(\n matcher: RouteMatcher,\n path: string,\n routes: Record<string, RouteDefinition>,\n notFoundPath?: string\n) {\n const normalized = normalizePath(path);\n const match = matchRoute(matcher, normalized);\n if (Option.isSome(match)) {\n const m = Option.unwrap(match);\n return { def: m.route.def, pattern: m.route.pattern, params: m.params, isMatch: true };\n }\n const fallback = notFoundPath ? routes[notFoundPath] : undefined;\n return { def: fallback, pattern: normalized, params: {}, isMatch: false };\n}\n\n/**\n * Logic: Navigation Pipeline Orchestration\n * Coordinates the full transition sequence: matching, parameter merging, and guard execution.\n *\n * When to use:\n * - Invoked internally by the router during navigation requests.\n *\n * Caution:\n * - Guards (`onEnter`) must be side-effect free relative to the router's internal state.\n */\nexport function resolveNavigation(\n matcher: RouteMatcher,\n config: { routes: Record<string, RouteDefinition>; default: string; notFound: string },\n path: string,\n query: Record<string, string>,\n router: Router\n) {\n const {\n def,\n pattern: routeName,\n params: matchParams,\n isMatch,\n } = resolveRoute(matcher, path || config.default, config.routes, config.notFound);\n const params = { ...query, ...matchParams };\n\n if (!def && !isMatch) {\n return { success: true, path: routeName, query, params, def: undefined };\n }\n\n if (def?.onEnter) {\n // Logic: Guard Execution\n // Guards are executed 'untracked' to prevent the router from becoming a dependency\n // of whatever reactive state the guard happens to read.\n const res = untracked(() => def.onEnter!(params, router));\n if (res === false) return { success: false };\n if (res) Object.assign(params, res);\n }\n\n return {\n success: true,\n path: !path || path === '/' ? routeName : path,\n query,\n params,\n def,\n };\n}\n","import { computed, effect, type ReadonlyAtom, untracked } from '@but212/atom-effect';\nimport { Result, SlotBuffer } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport { SYSTEM_COMPONENT } from '@/constants';\nimport {\n isInterceptee,\n isNavigationClick,\n NAV_SPEC,\n navCoordinator,\n normalizePath,\n performScroll,\n splitPath,\n syncMetaData,\n updateActiveState,\n} from '@/core/navigation';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, RouteDefinition, Router } from '@/types';\nimport { debug } from '@/utils/debug';\nimport { type createAdapter, getRoutePattern, type RouteMatcher } from './core';\n\ntype RenderStrategy = (\n container: HTMLElement,\n def: RouteDefinition,\n routeName: string,\n params: Record<string, string>,\n onUnmount: (fn: () => void) => void,\n router: Router\n) => void;\n\n/**\n * Logic: Polymorphic Rendering\n * Decouples the view definition from the actual mounting logic.\n * Supports both manual JS rendering and declarative HTML templates.\n */\nconst RENDER_STRATEGIES: Record<string, RenderStrategy> = {\n render: (container, def, routeName, params, onUnmount, router) => {\n def.render?.(container, routeName, params, onUnmount, router);\n },\n template: (container, def, _, __, onUnmount, router) => {\n if (!def.template) return;\n const tmpl = document.querySelector(def.template);\n if (tmpl instanceof HTMLTemplateElement) {\n container.appendChild(tmpl.content.cloneNode(true));\n def.onMount?.($(container).children(), onUnmount, router);\n }\n },\n};\n\n/**\n * State container for a specific routing target.\n */\nexport interface RouteRenderer {\n $target: JQuery<HTMLElement>;\n config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> };\n urlAdapter: ReturnType<typeof createAdapter>;\n cleanups: SlotBuffer<() => void>;\n previousPath: string;\n}\n\n/**\n * Initializes a renderer state for a target element.\n */\nexport function createRouteRenderer(\n $target: JQuery<HTMLElement>,\n config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> },\n urlAdapter: ReturnType<typeof createAdapter>\n): RouteRenderer {\n return { $target, config, urlAdapter, cleanups: new SlotBuffer(), previousPath: '' };\n}\n\n/**\n * Orchestrates the transition between views within a target container.\n *\n * When to use:\n * - Invoked by the router whenever a route match is confirmed.\n *\n * Logic: View Update Pipeline\n * 1. Synchronizes document metadata (Title/Meta).\n * 2. Clears the container and triggers previous view cleanups.\n * 3. Renders the new content using the defined strategy.\n * 4. Manages focus and scroll for Accessibility compliance.\n *\n * @example\n * renderRoute(renderer, homeDef, '/home', {}, routerInstance);\n */\nexport function renderRoute(\n renderer: RouteRenderer,\n def: RouteDefinition,\n routeName: string,\n params: Record<string, string>,\n router: Router\n) {\n const container = renderer.$target[0];\n if (!container) return;\n\n untracked(() => renderer.config.beforeTransition(renderer.previousPath, routeName));\n if (def.title) document.title = def.title;\n if (def.meta) syncMetaData(window, def.meta);\n\n // Logic: DOM Refresh\n // Ensures a clean slate and resets the cleanup buffer for the new view lifecycle.\n container.replaceChildren();\n const onUnmount = (fn: () => void) => renderer.cleanups.push(fn);\n\n const strategy = def.render ? 'render' : def.template ? 'template' : null;\n const handler = strategy ? RENDER_STRATEGIES[strategy] : null;\n if (handler) {\n handler(container, def, routeName, params, onUnmount, router);\n }\n\n // Security & DX: Validate that all components in the new view are registered.\n // Prevents \"silent failures\" where custom elements appear as empty tags.\n if (debug.enabled && typeof customElements !== 'undefined') {\n container.querySelectorAll(':not(:defined)').forEach((el) => {\n const tagName = el.tagName.toLowerCase();\n if (tagName.includes('-')) {\n debug.warn(SYSTEM_COMPONENT.PREFIX, SYSTEM_COMPONENT.ERRORS.NOT_REGISTERED(tagName));\n }\n });\n }\n\n untracked(() => renderer.config.afterTransition(renderer.previousPath, routeName));\n\n window.dispatchEvent(\n new CustomEvent('route-change', {\n detail: { from: renderer.previousPath, to: routeName, params },\n })\n );\n\n // Constraint: Scroll/Focus Ownership\n // If this renderer is nested within a higher-level navigation component (like atomNav),\n // the parent owns the initial page-load transition concerns.\n const isInitialRender = renderer.previousPath === '';\n const skipScrollAndFocus = isInitialRender && navCoordinator.isNestedIn(container, 'nav');\n\n if (!skipScrollAndFocus) {\n // Constraint: Accessibility (A11y)\n // Moves focus to the new content to ensure Screen Readers start reading the updated view.\n const focusTarget =\n (container.querySelector('h1, [role=\"heading\"]') as HTMLElement) || container;\n focusTarget.tabIndex = -1;\n focusTarget.focus();\n }\n\n renderer.previousPath = routeName;\n\n if (!skipScrollAndFocus) {\n if (location.hash) performScroll(window, location.hash.substring(1));\n else window.scrollTo(0, 0);\n }\n}\n\n/**\n * Disposes of all resources and effects bound to the current route view.\n */\nexport function runRendererCleanups(renderer: RouteRenderer) {\n renderer.cleanups.forEach((fn) => Result.tryCatch(fn));\n renderer.cleanups.clear();\n}\n\n/**\n * State container for the navigation link tracker.\n */\nexport interface RouteScanner {\n config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> };\n matcher: RouteMatcher;\n urlAdapter: ReturnType<typeof createAdapter>;\n activeClass: string;\n trackedLinks: Set<Element>;\n pathCache: WeakMap<Element, string>;\n activeStateCache: WeakMap<Element, boolean>;\n linkObserver?: MutationObserver;\n}\n\n/**\n * Creates a scanner that tracks elements to apply \"active\" CSS classes.\n */\nexport function createRouteScanner(\n config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> },\n matcher: RouteMatcher,\n urlAdapter: ReturnType<typeof createAdapter>,\n activeClass: string\n): RouteScanner {\n return {\n config,\n matcher,\n urlAdapter,\n activeClass,\n trackedLinks: new Set(),\n pathCache: new WeakMap(),\n activeStateCache: new WeakMap(),\n };\n}\n\n/**\n * Initializes reactive tracking for navigation links across the entire document.\n *\n * When to use:\n * - Call once during application bootstrap to enable automatic \"active\" link styling.\n *\n * Logic: Link Lifecycle Management\n * 1. Uses MutationObserver to detect links injected via AJAX or templates.\n * 2. Binds reactive effects to each link to toggle classes based on the current atom state.\n * 3. Automatically cleans up effects when elements are removed from the DOM.\n *\n * @param scanner - The scanner state.\n * @param currentRouteAtom - The reactive atom containing the current path.\n *\n * @example\n * setupRouteScanner(scanner, router.current);\n */\nexport function setupRouteScanner(scanner: RouteScanner, currentRouteAtom: ReadonlyAtom<string>) {\n const resolvePath = (el: Element, stripQuery = false) => {\n const attr = el.getAttribute('data-route');\n const path = attr || scanner.urlAdapter.resolveAnchor(el);\n if (!path) return '';\n return stripQuery ? splitPath(path).route : path;\n };\n\n const currentPatternAtom = computed(() =>\n getRoutePattern(scanner.matcher, currentRouteAtom.value)\n );\n\n const updateActive = (el: Element, current: string, pattern: string) => {\n // Optimization: Cache path strings and state to avoid redundant DOM reads and class toggles.\n const path = scanner.pathCache.get(el) || resolvePath(el, true);\n const active = path === current || path === pattern;\n if (scanner.activeStateCache.get(el) === active) return;\n scanner.activeStateCache.set(el, active);\n updateActiveState({ el, active, activeClass: scanner.activeClass });\n };\n\n const trackLink = (el: Element) => {\n const path = resolvePath(el, true);\n scanner.pathCache.set(el, path);\n\n if (scanner.trackedLinks.has(el)) {\n updateActive(el, currentRouteAtom.peek(), currentPatternAtom.peek());\n return;\n }\n\n scanner.trackedLinks.add(el);\n const sub = effect(() => {\n updateActive(el, currentRouteAtom.value, currentPatternAtom.value);\n });\n\n // Cleanup: Leverages the registry to ensure memory is released when the link is destroyed.\n registry.onCleanup(el, () => {\n scanner.trackedLinks.delete(el);\n sub.dispose();\n });\n };\n\n const scan = () => document.querySelectorAll<HTMLElement>(NAV_SPEC.selectors).forEach(trackLink);\n\n // Logic: Dynamic Content Support\n // Handles scenarios where links are added dynamically (e.g., list rendering or async components).\n scanner.linkObserver = new MutationObserver((mutations) => {\n for (const m of mutations) {\n if (m.type === 'childList') {\n m.addedNodes.forEach((node) => {\n if (node.nodeType === 1) {\n const el = node as Element;\n if (el.matches(NAV_SPEC.selectors)) trackLink(el);\n el.querySelectorAll(NAV_SPEC.selectors).forEach((c) => trackLink(c));\n }\n });\n } else if (m.type === 'attributes') trackLink(m.target as Element);\n }\n });\n\n scanner.linkObserver.observe(document.body || document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: NAV_SPEC.attributes as unknown as string[],\n });\n\n scan();\n return { scan, resolvePath };\n}\n\n/**\n * Scans the initial DOM for declarative route definitions.\n *\n * Logic: Declarative Route Manifest Discovery\n * Extracts route definitions from `<template data-path=\"...\">` tags.\n * This allows defining the application structure directly in HTML.\n *\n * @returns A partial route manifest and the identified default path.\n *\n * @example\n * // HTML: <template data-path=\"/home\" data-default>...</template>\n * const { routes, default: def } = discoverRoutes();\n */\nexport function discoverRoutes(): {\n routes: Record<string, RouteDefinition>;\n default: string | undefined;\n} {\n const routes: Record<string, RouteDefinition> = {};\n let defaultPath: string | undefined;\n\n document.querySelectorAll<HTMLTemplateElement>('template[data-path]').forEach((tmpl) => {\n const path = normalizePath(tmpl.getAttribute('data-path') ?? '');\n const title = tmpl.getAttribute('title') ?? tmpl.getAttribute('data-title');\n if (!routes[path]) {\n tmpl.id ||= `route-${Math.random().toString(36).slice(2, 11)}`;\n routes[path] = { template: `#${tmpl.id}`, ...(title ? { title } : {}) };\n } else if (title && !routes[path].title) {\n routes[path].title = title;\n }\n\n if (tmpl.hasAttribute('data-default')) {\n defaultPath = path;\n }\n });\n\n return { routes, default: defaultPath };\n}\n\n/**\n * Intercepts document-level clicks to implement \"hijack\" navigation.\n *\n * Logic: Global Click Interception\n * Decides whether a click should be handled by the router based on:\n * 1. Is it a valid navigation click (e.g., Left click without modifiers)?\n * 2. Does the target match a known route or the 'notFound' handler?\n * 3. Does the target represent a file download? (Heuristic: ignore dots in paths unless matched).\n *\n * @returns A cleanup function to unbind the global listener.\n */\nexport function setupRouteInterceptor(\n config: Required<RouteConfig> & { routes: Record<string, RouteDefinition> },\n matcher: RouteMatcher,\n resolvePath: (el: Element) => string,\n navigate: (path: string) => Promise<void>\n): () => void {\n const shouldIntercept = (path: string, el: Element): boolean => {\n // Reason: Avoid hijacking clicks for file downloads (e.g., resume.pdf).\n // If a path contains an extension, we only intercept if it specifically matches a route pattern.\n if (el instanceof HTMLAnchorElement) {\n const last = path.split('/').pop() ?? '';\n if (last.includes('.') && !getRoutePattern(matcher, splitPath(path).route)) return false;\n }\n return !!getRoutePattern(matcher, splitPath(path).route) || !!config.notFound;\n };\n\n const onClick = (e: JQuery.TriggeredEvent) => {\n if (e.isDefaultPrevented() || !isNavigationClick(e)) return;\n const el = e.currentTarget as HTMLElement;\n if (!isInterceptee(el)) return;\n const path = resolvePath(el);\n if (path && shouldIntercept(path, el)) {\n e.preventDefault();\n navigate(path);\n }\n };\n\n $(document).on('click', NAV_SPEC.selectors, onClick);\n return () => $(document).off('click', NAV_SPEC.selectors, onClick);\n}\n","import {\n batch,\n computed,\n atom as createAtom,\n effect,\n type ReadonlyAtom,\n untracked,\n} from '@but212/atom-effect';\nimport { Option, Result, SlotBuffer, shallowEqual } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport { SYSTEM_ROUTE } from '@/constants';\nimport { navCoordinator, normalizePath, parseQuery, splitPath } from '@/core/navigation';\nimport { registry } from '@/core/registry';\nimport type { RouteConfig, RouteDefinition, RouteLocation, Router, WritableAtom } from '@/types';\nimport { debug } from '@/utils/debug';\nimport {\n createAdapter,\n createRouteMatcher,\n type RouteMatcher,\n resolveNavigation,\n resolveRoute,\n} from './core';\nimport {\n createRouteRenderer,\n createRouteScanner,\n discoverRoutes,\n type RouteRenderer,\n type RouteScanner,\n renderRoute,\n runRendererCleanups,\n setupRouteInterceptor,\n setupRouteScanner,\n} from './view';\n\n/**\n * Concrete implementation of the Router interface.\n * Coordinates the transition from URL intent to rendered view.\n */\nexport class RouterImpl implements Router {\n public readonly location: ReadonlyAtom<RouteLocation>;\n public readonly currentRoute: ReadonlyAtom<string>;\n public readonly queryParams: ReadonlyAtom<Record<string, string>>;\n public readonly 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: ReturnType<typeof createAdapter>;\n private readonly $target: JQuery<HTMLElement>;\n\n private readonly scanner: RouteScanner;\n private readonly renderer: RouteRenderer;\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 /**\n * Logic: Internal State Management\n * Tracks transient flags and metadata that are hidden from the public API\n * to ensure stable transitions and prevent feedback loops.\n */\n private readonly stateAtom = createAtom({\n isDestroyed: false,\n isTransitioning: false,\n previousUrl: '',\n currentDef: undefined as RouteDefinition | undefined,\n });\n\n private readonly cleanups = new SlotBuffer<() => void>();\n\n /**\n * The public context object passed to route guards and lifecycle hooks.\n * Defined as a separate object to maintain interface compatibility.\n */\n private readonly context: Router = {\n currentRoute: computed(() => this.currentRouteAtom.value),\n queryParams: computed(() => this.queryParamsAtom.value),\n params: computed(() => this.paramsAtom.value),\n location: computed(() => ({\n path: this.currentRouteAtom.value,\n query: this.queryParamsAtom.value,\n params: this.paramsAtom.value,\n })),\n navigate: (p) => this.navigate(p),\n destroy: () => this.destroy(),\n };\n\n constructor(config: RouteConfig) {\n this.config = {\n mode: SYSTEM_ROUTE.DEFAULTS.mode,\n basePath: SYSTEM_ROUTE.DEFAULTS.basePath,\n autoBindLinks: SYSTEM_ROUTE.DEFAULTS.autoBindLinks,\n activeClass: SYSTEM_ROUTE.DEFAULTS.activeClass,\n notFound: config.notFound ?? '',\n beforeTransition: config.beforeTransition ?? (() => {}),\n afterTransition: config.afterTransition ?? (() => {}),\n ...config,\n routes: config.routes ?? {},\n } as Required<RouteConfig> & { routes: Record<string, RouteDefinition> };\n\n const t = this.config.target;\n this.$target =\n typeof t === 'string' ? $(t) : t instanceof HTMLElement ? $(t) : (t as JQuery<HTMLElement>);\n this.urlAdapter = createAdapter(this.config.mode, this.config.basePath);\n\n const discovery = discoverRoutes();\n\n // Logic: Manifest Supplement\n // Merges declarative template-based routes with explicit JS configuration.\n // Preserves metadata (like titles) from templates unless overridden in JS.\n for (const path in discovery.routes) {\n const discovered = discovery.routes[path]!;\n if (this.config.routes[path]) {\n const userDef = this.config.routes[path]!;\n if (!userDef.title && discovered.title) userDef.title = discovered.title;\n if (!userDef.template && discovered.template) userDef.template = discovered.template;\n } else {\n this.config.routes[path] = discovered;\n }\n }\n if (this.config.default === undefined) this.config.default = discovery.default ?? '';\n\n this.matcher = createRouteMatcher(this.config.routes);\n this.scanner = createRouteScanner(\n this.config,\n this.matcher,\n this.urlAdapter,\n this.config.activeClass\n );\n this.renderer = createRouteRenderer(this.$target, this.config, this.urlAdapter);\n\n const initState = this.urlAdapter.get();\n this.stateAtom.value = { ...this.stateAtom.peek(), previousUrl: initState.url };\n\n const resolved = resolveNavigation(\n this.matcher,\n this.config,\n normalizePath(initState.path),\n initState.query,\n this.context\n );\n\n const initial = resolved.success\n ? resolved\n : { path: this.config.default, query: {}, params: {} };\n\n this.currentRouteAtom = createAtom(initial.path!);\n this.currentRoute = this.currentRouteAtom;\n\n this.queryParamsAtom = createAtom(initial.query!);\n this.queryParams = computed(() => this.queryParamsAtom.value);\n\n this.paramsAtom = createAtom(initial.params!);\n this.params = this.paramsAtom;\n\n this.location = computed(() => ({\n path: this.currentRouteAtom.value,\n query: this.queryParamsAtom.value,\n params: this.paramsAtom.value,\n }));\n\n this.setupLifecycle();\n }\n\n /**\n * Logic: Lifecycle Orchestration\n * Establishes the reactive bridge between the URL adapter and the renderer.\n */\n private setupLifecycle() {\n this.cleanups.push(this.urlAdapter.setupListener(() => this.handleBrowserSync()));\n\n const renderSub = effect(() => {\n // Logic: Rendering Trigger\n // We explicitly untrack the rendering logic to prevent the renderer\n // from becoming a dependency of its own DOM-cleaning side effects.\n const path = this.currentRouteAtom.value;\n\n untracked(() => {\n runRendererCleanups(this.renderer);\n this.render(path);\n });\n });\n this.cleanups.push(() => renderSub.dispose());\n\n const { resolvePath } = setupRouteScanner(this.scanner, this.currentRoute);\n this.cleanups.push(() => this.scanner.linkObserver?.disconnect());\n\n if (this.config.autoBindLinks) {\n this.cleanups.push(\n setupRouteInterceptor(this.config, this.matcher, resolvePath, (p) => this.navigate(p))\n );\n }\n\n // Constraint: Automatic Teardown\n // Binds the router lifecycle to the target element's DOM presence.\n if (this.$target[0]) {\n navCoordinator.register(this.$target[0], 'router', () => this.canLeave());\n registry.onCleanup(this.$target[0], () => this.destroy());\n }\n }\n\n private updateState(\n nextPath: string,\n nextQuery: Record<string, string>,\n params: Record<string, string>\n ) {\n batch(() => {\n if (!shallowEqual(this.paramsAtom.peek(), params)) this.paramsAtom.value = params;\n if (!shallowEqual(this.queryParamsAtom.peek(), nextQuery))\n this.queryParamsAtom.value = nextQuery;\n if (this.currentRouteAtom.peek() !== nextPath) this.currentRouteAtom.value = nextPath;\n });\n }\n\n /**\n * Programmatically transitions the application to a new location.\n *\n * When to use:\n * - Triggered by user clicks or script-driven navigation logic.\n *\n * Caution:\n * - Navigation will be aborted if the current route's `onLeave` guard returns `false`.\n *\n * @example\n * router.navigate('/user/123', { debug: 'true' });\n */\n public async navigate(\n to: string | Partial<RouteLocation>,\n query: Record<string, string> = {}\n ): Promise<void> {\n const state = this.stateAtom.peek();\n if (state.isDestroyed || !this.canLeave()) return;\n\n let targetPath: string;\n let targetQuery: Record<string, string> = query;\n\n if (typeof to === 'string') {\n const { route: routePart, query: queryPart } = splitPath(to);\n targetPath = routePart || this.config.default;\n if (Option.isSome(queryPart)) {\n targetQuery = { ...parseQuery(Option.unwrap(queryPart)), ...query };\n }\n } else {\n targetPath = to.path || this.currentRouteAtom.peek();\n targetQuery = { ...to.query, ...query };\n }\n\n if (!targetPath) return;\n\n const queryString = new URLSearchParams(targetQuery).toString();\n const fullPath = queryString ? `${targetPath}?${queryString}` : targetPath;\n\n // Logic: Transition Guard\n // Setting `isTransitioning` prevents `handleBrowserSync` from reacting\n // to the URL change we are about to trigger manually.\n this.stateAtom.value = { ...state, isTransitioning: true };\n try {\n const nextState = this.urlAdapter.commit(fullPath);\n const resolved = resolveNavigation(\n this.matcher,\n this.config,\n nextState.path,\n nextState.query,\n this.context\n );\n if (resolved.success) {\n this.updateState(resolved.path!, resolved.query!, resolved.params!);\n } else {\n // Revert: Navigation rejected by an 'onEnter' guard.\n this.urlAdapter.revert(state.previousUrl);\n }\n } finally {\n this.stateAtom.value = { ...this.stateAtom.peek(), isTransitioning: false };\n }\n }\n\n /**\n * Logic: Browser State Synchronization\n * Handles external URL changes (e.g., Back/Forward button) and ensures\n * they are validated against route guards before adoption.\n */\n private handleBrowserSync() {\n const state = this.stateAtom.peek();\n if (state.isDestroyed || state.isTransitioning) return;\n\n const adapterState = this.urlAdapter.get();\n if (adapterState.url === state.previousUrl) return;\n\n // Constraint: Guard Enforcement\n // If the current view refuses to unmount, we force the browser URL back to the previous state.\n if (!this.canLeave()) {\n this.stateAtom.value = { ...state, isTransitioning: true };\n try {\n this.urlAdapter.revert(state.previousUrl);\n } finally {\n this.stateAtom.value = { ...this.stateAtom.peek(), isTransitioning: false };\n }\n return;\n }\n\n const resolved = resolveNavigation(\n this.matcher,\n this.config,\n normalizePath(adapterState.path),\n adapterState.query,\n this.context\n );\n\n batch(() => {\n if (resolved.success) {\n this.updateState(resolved.path!, resolved.query!, resolved.params!);\n } else {\n // Guard failure on browser-initiated navigation (Back/Forward).\n this.stateAtom.value = { ...state, isTransitioning: true };\n try {\n this.urlAdapter.revert(state.previousUrl);\n } finally {\n this.stateAtom.value = { ...this.stateAtom.peek(), isTransitioning: false };\n }\n }\n });\n }\n\n /**\n * Logic: Internal Rendering Dispatch\n * Resolves the route definition and delegates DOM manipulation to the renderer.\n */\n private render(requestedPath: string): void {\n const { def, pattern: routeName } = resolveRoute(\n this.matcher,\n requestedPath,\n this.config.routes,\n this.config.notFound\n );\n\n if (!def) {\n debug.warn(SYSTEM_ROUTE.PREFIX, SYSTEM_ROUTE.ERRORS.NOT_FOUND(requestedPath));\n return;\n }\n\n this.stateAtom.value = {\n ...this.stateAtom.peek(),\n currentDef: def,\n previousUrl: this.urlAdapter.get().url,\n };\n renderRoute(this.renderer, def, routeName, this.paramsAtom.peek(), this.context);\n }\n\n /**\n * Executes the unmount guard for the current route.\n */\n private canLeave(): boolean {\n const state = this.stateAtom.peek();\n const def = state.currentDef || this.config.routes[this.config.notFound];\n return def?.onLeave ? untracked(() => def.onLeave!(this.context)) !== false : true;\n }\n\n /**\n * Cleanup: Resource Disposal\n * Terminates all reactive effects, unbinds global listeners, and releases DOM references.\n */\n public destroy(): void {\n const state = this.stateAtom.peek();\n if (state.isDestroyed) return;\n this.stateAtom.value = { ...state, isDestroyed: true };\n runRendererCleanups(this.renderer);\n this.cleanups.forEach((fn: () => void) => Result.tryCatch(fn));\n this.cleanups.dispose();\n }\n}\n","import $ from 'jquery';\nimport type { RouteConfig, Router } from '@/types';\nimport { RouterImpl } from './router';\n\n/**\n * Initializes a reactive router for synchronizing URL state with DOM views.\n *\n * When to use:\n * - Invoke during application bootstrap to define your routing manifest\n * and bind a target container for dynamic content rendering.\n *\n * Logic: Reactive Routing\n * This manager orchestrates URL synchronization, path matching, and dynamic\n * view rendering. It exposes reactive atoms (`currentRoute`, `params`)\n * allowing the rest of your UI to respond automatically to navigation changes.\n *\n * Capabilities:\n * - Multi-mode support: Modern 'history' (clean URLs) or 'hash' for legacy/static hosting.\n * - Dynamic matching: High-performance parameter extraction for named segments.\n * - Lifecycle guards: Navigation control via `onEnter` and `onLeave` hooks.\n * - Accessibility: Built-in focus management for Screen Readers on route transitions.\n *\n * @param config - Configuration for routes, target containers, and lifecycle hooks.\n * @returns A router interface for programmatic control and state monitoring.\n *\n * @example\n * ```typescript\n * const router = $.route({\n * target: '#app-root',\n * routes: {\n * '/': { template: '#home-tmpl' },\n * '/user/:id': {\n * onEnter: (params) => console.log('Entering user:', params.id),\n * render: (el, name, params) => {\n * $(el).text(`User Profile: ${params.id}`);\n * }\n * }\n * }\n * });\n *\n * // Programmatic navigation\n * router.navigate('/user/42');\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 { Result } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport type { ComputedAtom, FetchError, FetchOptions } from '@/types';\n\n/**\n * Normalizes user configuration into jQuery Ajax settings.\n *\n * Logic: Priority Resolution\n * Precedence is established as follows: Direct Options > Dynamic Options > Static Options.\n *\n * Constraint: Direct callback options (`success`, `error`, `complete`) are\n * explicitly cleared to prevent interference with the automated state\n * transitions and concurrency management.\n *\n * @param url - The target URL.\n * @param options - The fetch configuration options.\n * @returns A normalized JQuery.AjaxSettings object.\n * @internal\n */\nfunction toSettings<T>(url: string, options: FetchOptions<T>): JQuery.AjaxSettings {\n const { ajaxOptions, method, headers } = options;\n const base = typeof ajaxOptions === 'object' ? ajaxOptions : {};\n const dynamic = typeof ajaxOptions === 'function' ? ajaxOptions() : {};\n\n return {\n ...base,\n ...dynamic,\n url,\n method: method || dynamic.method || base.method,\n headers: { ...base.headers, ...dynamic.headers, ...headers },\n success: undefined,\n error: undefined,\n complete: undefined,\n };\n}\n\n/**\n * Normalizes jQuery-specific XHR errors into a standard Error format.\n *\n * Logic: Error Normalization\n * Returns a standard `Error` while preserving the original `jqXHR` context,\n * enabling advanced diagnostics in reactive hooks.\n *\n * @param err - The raw error from jQuery.ajax.\n * @returns A normalized Error object containing XHR metadata.\n * @internal\n */\nfunction toError(err: unknown): Error {\n if (err && typeof err === 'object' && 'readyState' in err) {\n const xhr = err as JQuery.jqXHR;\n // Reason: A status of 0 typically indicates a network timeout or DNS\n // failure where statusText might be empty.\n const message = xhr.statusText || (xhr.status === 0 ? 'Network Error' : 'Request Failed');\n const error = new Error(`Network Error: ${message} (${xhr.status})`);\n (error as FetchError).jqXHR = xhr;\n return error;\n }\n return err instanceof Error ? err : new Error(String(err ?? 'Unknown error'));\n}\n\n/**\n * Creates a reactive computed atom that synchronizes with an asynchronous network request.\n *\n * When to use:\n * - To fetch data that depends on other atoms (automated refetching on dependency changes).\n * - To implement built-in concurrency management (automated cancellation of stale requests).\n *\n * Logic: Concurrency Control\n * Uses `AbortController` and `jqXHR.abort()` to ensure that only the response\n * from the most recent request is reflected in the atom's state. Older,\n * \"out-of-order\" responses are discarded to prevent UI flickering.\n *\n * @param source - A static URL string or a reactive function returning a URL.\n * @param options - Configuration for default values, transformation, and error handling.\n * @returns A computed atom augmented with an `abort()` method.\n *\n * @example\n * ```typescript\n * const userId = $.atom(1);\n * const user = $.atomFetch(() => `/api/users/${userId.value}`, {\n * defaultValue: { name: 'Loading...' },\n * eager: true\n * });\n *\n * $.effect(() => {\n * console.log(`Current user: ${user.value.name}`);\n * });\n * ```\n */\nfunction atomFetch<T>(source: string | (() => string), options: FetchOptions<T>): ComputedAtom<T> {\n const getUrl = typeof source === 'string' ? () => source : source;\n let active: AbortController | null = null;\n\n const execute = async (): Promise<T> => {\n // Logic: Abort the previous request if a new execution cycle starts.\n active?.abort();\n const controller = new AbortController();\n active = controller;\n\n let xhr: JQuery.jqXHR | undefined;\n const cleanup = () => {\n if (xhr && typeof xhr.abort === 'function') {\n xhr.abort();\n }\n };\n\n controller.signal.addEventListener('abort', cleanup);\n if (controller.signal.aborted) {\n cleanup();\n }\n\n try {\n // Logic: Execute the request and capture the result.\n // Note: We use manual try-catch for the AJAX part to ensure perfect compatibility\n // with jqXHR await behavior, which can be tricky with automated wrappers.\n let ajaxResult: Result<unknown, Error>;\n try {\n // 1. Initialize (capture sync errors for onError hook)\n // Dependency tracking must occur synchronously before the first 'await'.\n const url = getUrl();\n const settings = toSettings(url, options);\n xhr = $.ajax(settings);\n const data = await xhr;\n ajaxResult = Result.ok(data);\n } catch (err) {\n ajaxResult = Result.err(toError(err));\n }\n\n // 2. Transformation Pipeline (Railway approach)\n if (!ajaxResult.ok) {\n const error = ajaxResult.error;\n if (controller.signal.aborted) {\n const abortErr = new Error('AbortError');\n abortErr.name = 'AbortError';\n throw abortErr;\n }\n\n if (options.onError) {\n const hookResult = Result.tryCatch(() => options.onError!(error));\n if (!hookResult.ok) {\n console.error('atomFetch: onError hook threw an error', hookResult.error);\n }\n }\n throw error;\n }\n\n // Handle transformation (supports both sync and async)\n const data = ajaxResult.value;\n try {\n const transformedResult = options.transform\n ? options.transform(data as unknown, xhr!)\n : (data as T);\n\n const transformed =\n transformedResult instanceof Promise ? await transformedResult : transformedResult;\n return transformed as T;\n } catch (err) {\n const error = toError(err);\n if (options.onError) {\n Result.tryCatch(() => options.onError!(error));\n }\n throw error;\n }\n } finally {\n controller.signal.removeEventListener('abort', cleanup);\n // Logic: Only clear the reference if this execution is the latest.\n if (active === controller) {\n active = null;\n }\n }\n };\n\n const atom = computed(execute, {\n defaultValue: options.defaultValue,\n lazy: options.eager === false,\n ...(options.name !== undefined ? { name: options.name } : {}),\n });\n\n // Constraint: Pending network requests MUST be canceled when the atom is disposed.\n const originalDispose = atom.dispose.bind(atom);\n atom.dispose = () => {\n active?.abort();\n originalDispose();\n };\n\n return Object.assign(atom, {\n abort: () => active?.abort(),\n }) as ComputedAtom<T> & { abort: () => void };\n}\n\n$.extend({ atomFetch });\n","import { Option, Result } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport {\n type ContentState,\n extractContent,\n getAbsoluteUrl,\n getScrollDecision,\n getUrlParts,\n isInterceptee,\n isNavigationClick,\n type NavigationType,\n navCoordinator,\n performScroll,\n syncMetaData,\n updateAttributes,\n} from '@/core/navigation';\nimport { registry } from '@/core/registry';\nimport type { AtomNav, AtomNavOptions, ReadonlyAtom } from '@/types';\nimport { sanitizeHtml } from '@/utils/sanitize';\n\n/** @internal */\ninterface NavState {\n url: string;\n type: NavigationType;\n}\n\n/** @internal */\ninterface NavSpec {\n historyMethod: 'pushState' | 'replaceState' | null;\n isInitial: boolean;\n}\n\n/** @internal Maps navigation types to History API methods. */\nconst NAV_SPECS = {\n push: { historyMethod: 'pushState', isInitial: false },\n replace: { historyMethod: 'replaceState', isInitial: false },\n init: { historyMethod: null, isInitial: true },\n pop: { historyMethod: null, isInitial: false },\n} as const satisfies Record<NavigationType, NavSpec>;\n\n/**\n * Logic: Data-to-DOM Registry\n * Defines how specific parts of the fetched content state are applied to the browser environment.\n */\nconst SYNC_REGISTRY = [\n {\n key: 'title',\n apply: (win, _, val, opts) => {\n const title = val as string | null;\n if (opts.syncTitle && title !== null && win.document.title !== title) {\n win.document.title = title;\n }\n },\n },\n { key: 'meta', apply: (win, _, val) => syncMetaData(win, val as Record<string, string>) },\n {\n key: 'attributes',\n apply: (_, $target, val) => {\n const el = $target[0] as HTMLElement | undefined;\n if (el && val) updateAttributes(el, val as Record<string, string>);\n },\n },\n { key: 'html', apply: (_, $target, val) => $target.html(val as string) },\n] as const satisfies Array<{\n key: keyof ContentState;\n apply: (win: Window, $target: JQuery, value: unknown, options: { syncTitle: boolean }) => void;\n}>;\n\n/**\n * Logic: DOM Reconciliation\n * Synchronizes the fetched content state with the physical DOM.\n *\n * Constraint: Cleanup\n * Must perform a deep cleanup of internal atom bindings within the target\n * before replacing HTML to prevent memory leaks and redundant effects.\n */\nfunction reconcileDOM(params: {\n $target: JQuery;\n state: ContentState;\n url: string;\n previousUrl: string;\n win: Window;\n syncTitle: boolean;\n onMount?: ((el: JQuery, url: string) => void) | undefined;\n onUnmount?: ((el: JQuery, url: string) => void) | undefined;\n}): void {\n const { $target, state, url, previousUrl, win, syncTitle, onMount, onUnmount } = params;\n\n $.untracked(() => {\n onUnmount?.($target, previousUrl);\n\n // Constraint: Clean up internal atom bindings within the target before replacing HTML\n $target.children().atomUnbind();\n\n for (const sync of SYNC_REGISTRY) {\n const val = state[sync.key];\n sync.apply(win, $target, val, { syncTitle });\n }\n\n onMount?.($target, url);\n });\n}\n\n/**\n * Logic: History Synchronization\n * Performs an atomic update of the browser history and the internal reactive intent.\n */\nfunction commitNavigation(params: {\n url: string;\n type: NavigationType;\n win: Window;\n state: { value: NavState };\n}): void {\n const { url, type, win, state } = params;\n const spec = NAV_SPECS[type];\n if (spec.historyMethod) {\n $.batch(() => {\n win.history[spec.historyMethod!](null, '', url);\n state.value = { url, type };\n });\n }\n}\n\n/**\n * Initializes a reactive navigation manager for PJAX transitions.\n *\n * When to use:\n * - Use when you want to enable \"Single Page\" behavior by fetching HTML\n * fragments from the server instead of performing full page reloads.\n *\n * @param options - Configuration for target containers, headers, and lifecycle hooks.\n * @returns A navigation controller with reactive status monitoring and programmatic controls.\n *\n * @example\n * ```typescript\n * const nav = $.atomNav({\n * target: '#main-content',\n * onMount: ($el) => console.log('Content swapped!'),\n * });\n *\n * nav.navigate('/dashboard');\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 =\n typeof target === 'string'\n ? $(target)\n : target instanceof HTMLElement\n ? $(target)\n : (target as JQuery<HTMLElement>);\n\n $target.attr('data-atom-nav-target', 'true');\n\n // Logic: Initial State Resolution\n const initialUrlObj = new URL(win.location.href);\n const initialUrl = initialUrlObj.pathname + initialUrlObj.search + initialUrlObj.hash;\n const initialPath = initialUrlObj.pathname + initialUrlObj.search;\n\n // Logic: Reactive State Atoms\n const state = {\n // Current navigation intent (the URL desired in the address bar)\n intent: $.atom<NavState>({ url: initialUrl, type: 'init' }, { name: 'nav:intent' }),\n // Last successfully rendered state (prevents redundant fetches)\n rendered: $.atom({ url: initialUrl, path: initialPath }, { name: 'nav:rendered' }),\n // Version counter to force re-fetches for retrying failures\n fetchVersion: $.atom(0, { name: 'nav:version' }),\n // Trackers for asynchronous transition guards\n pendingHooks: $.atom(0, { name: 'nav:hook-pending' }),\n };\n\n const targetSelector = Option.unwrapOr(\n Option.map(\n Option.fromNullable(typeof target === 'string' ? target : $target.attr('id')),\n (id) => (id.startsWith('#') ? id : `#${$.escapeSelector(id)}`)\n ),\n undefined\n );\n\n const normalized = $.computed(\n () => {\n const { url, type } = state.intent.value;\n const { pathAndSearch, hash } = getUrlParts(url, win.location.href);\n return { url, pathAndSearch, hash, type };\n },\n { name: 'nav:normalized' }\n );\n\n /**\n * Logic: Fragment Fetch Pipeline\n * Automates the AJAX request, fragment extraction, and security sanitization.\n */\n const content = $.atomFetch<ContentState>(\n () => {\n state.fetchVersion.value;\n return normalized.value.pathAndSearch;\n },\n {\n name: 'nav:content',\n defaultValue: { html: '', title: null },\n headers: { 'X-PJAX': 'true', ...headers },\n eager: false,\n transform: (raw, xhr) => {\n const redirectUrl = xhr?.getResponseHeader?.('X-PJAX-URL') ?? undefined;\n const result = extractContent({\n html: String(raw),\n selector: targetSelector,\n redirectUrl,\n });\n // Security: Ensure fetched HTML is sanitized before being injected into the DOM.\n return { ...result, html: sanitizeHtml(result.html).trim() };\n },\n }\n );\n\n // Logic: Lifecycle Orchestration\n let _navController: AbortController | null = null;\n const _lifecycleController = new AbortController();\n\n const renewAbortSignal = (): AbortController => {\n _navController?.abort();\n if ('abort' in content && typeof (content as { abort: Function }).abort === 'function') {\n (content as { abort: Function }).abort();\n }\n const controller = new AbortController();\n _navController = controller;\n return controller;\n };\n\n /**\n * Logic: Global Sync Effect\n * The core engine that reacts to 'intent' changes and coordinates\n * the fetch -> reconcile -> scroll flow.\n */\n const mainEffect = $.effect(\n (): undefined => {\n const { url, pathAndSearch, hash, type } = normalized.value;\n const rendered = $.untracked(() => state.rendered.value);\n\n const spec = NAV_SPECS[type];\n\n // Optimization: Skip re-fetching if the transition only involves a hash change.\n if (pathAndSearch === rendered.path) {\n $.untracked(() => {\n if (hash) performScroll(win, hash);\n\n if (spec.isInitial) {\n options.onMount?.($target, url);\n state.intent.value = { ...state.intent.peek(), type: 'push' };\n } else if (url !== rendered.url) {\n state.rendered.value = { ...rendered, url };\n }\n });\n return undefined;\n }\n\n const pjaxState = content.value;\n\n if (content.hasError) {\n const error = content.lastError;\n if (error instanceof Error && error.name === 'AbortError') return undefined;\n // Logic: Error Recovery\n // If the PJAX fetch fails, fallback to a full page reload unless overridden.\n if ((options.onError?.(error, url) ?? true) !== false) {\n win.location.assign(url);\n }\n return undefined;\n }\n\n if (!content.isResolved || content.isPending) return undefined;\n\n const isRedirect = !!(pjaxState.redirectUrl && pjaxState.redirectUrl !== url);\n const previousUrl = rendered.url;\n\n let finalUrl = isRedirect ? (pjaxState.redirectUrl as string) : url;\n if (isRedirect && hash && !finalUrl.includes('#')) {\n finalUrl += `#${hash}`;\n }\n\n const { pathAndSearch: finalPath } = getUrlParts(finalUrl, win.location.href);\n const isNewTarget = finalPath !== rendered.path;\n\n $.batch(() => {\n if (isRedirect) {\n win.history.replaceState(null, '', finalUrl);\n state.intent.value = { url: finalUrl, type: 'push' };\n }\n\n if (isNewTarget || isRedirect) {\n reconcileDOM({\n $target,\n state: pjaxState,\n url: finalUrl,\n previousUrl,\n win,\n syncTitle,\n onMount: options.onMount,\n onUnmount: options.onUnmount,\n });\n }\n\n const prevUrlObj = Result.unwrap(getAbsoluteUrl(rendered.url, win.location.href));\n const { shouldScroll, resetScroll } = getScrollDecision({\n hash,\n type,\n isNewTarget,\n prevHash: prevUrlObj.hash.slice(1),\n scrollToTop: options.scrollToTop ?? true,\n });\n\n if (shouldScroll) performScroll(win, hash, resetScroll);\n state.rendered.value = { url: finalUrl, path: finalPath };\n });\n\n return undefined;\n },\n { name: 'nav:sync-effect' }\n );\n\n const handlePopState = (): void => {\n renewAbortSignal();\n const loc = win.location;\n state.intent.value = { url: loc.pathname + loc.search + loc.hash, type: 'pop' };\n };\n\n win.addEventListener('popstate', handlePopState, { signal: _lifecycleController.signal });\n\n // Logic: Click Interception\n win.document.addEventListener(\n 'click',\n (e) => {\n if (e.defaultPrevented) return;\n const el = (e.target as Element).closest<HTMLAnchorElement>(selector);\n if (!el) return;\n\n const myId = $target.attr('id');\n const targetAttr = el.dataset.target;\n const isExplicitTarget = !!(targetAttr && myId && targetAttr === `#${myId}`);\n\n if (targetAttr && !isExplicitTarget) return;\n if (!isExplicitTarget) {\n const closestNavTarget = $(el).closest('[data-atom-nav-target=\"true\"]')[0];\n if (closestNavTarget && closestNavTarget !== $target[0]) return;\n }\n\n if (isNavigationClick(e) && isInterceptee(el, win)) {\n e.preventDefault();\n navigator.navigate(el.href);\n }\n },\n { signal: _lifecycleController.signal }\n );\n\n const navStatus = $.computed(\n () => {\n if (content.isPending || state.pendingHooks.value > 0) return 'pending';\n if (content.hasError) return 'error';\n return 'idle';\n },\n { name: 'nav:status' }\n );\n\n const isPending = $.computed(() => navStatus.value === 'pending', { name: 'nav:isPending' });\n const hasError = $.computed(() => navStatus.value === 'error', { name: 'nav:hasError' });\n\n // Logic: Public API Implementation\n const navigator: AtomNav = {\n currentUrl: $.computed(() => state.rendered.value.url, { name: 'nav:public-url' }),\n isPending,\n hasError,\n\n async navigate(url: string, navOptions: { replace?: boolean } = {}): Promise<void> {\n const { signal } = renewAbortSignal();\n const type: NavigationType = navOptions.replace ? 'replace' : 'push';\n\n const base = win.document.baseURI ?? win.location.href;\n const targetRes = getAbsoluteUrl(url, base);\n if (Result.isErr(targetRes)) return;\n\n const target = Result.unwrap(targetRes);\n const current = new URL(win.location.href);\n const path = target.pathname + target.search;\n const isSamePath = path === current.pathname + current.search;\n\n const policies: Array<() => boolean | Promise<boolean>> = [\n () => {\n // Reason: Only intercept same-origin requests.\n if (target.origin !== current.origin) {\n win.location.assign(url);\n return false;\n }\n return true;\n },\n () => {\n const isSameLoc = isSamePath && target.hash === (current.hash ?? '');\n if (isSameLoc && type === 'push') {\n if (hasError.peek()) {\n state.fetchVersion.value++;\n } else if (url.includes('#')) {\n performScroll(win, target.hash.slice(1), true);\n }\n return false;\n }\n return true;\n },\n () => {\n // Logic: Async Transition Guards\n if (!isSamePath && options.onBeforeLoad) {\n return (async () => {\n state.pendingHooks.value++;\n try {\n const ok = await (\n options.onBeforeLoad as (\n url: string,\n signal: AbortSignal\n ) => Promise<boolean | undefined>\n )(url, signal);\n return !(signal.aborted || ok === false);\n } finally {\n state.pendingHooks.value = Math.max(0, state.pendingHooks.value - 1);\n }\n })();\n }\n return true;\n },\n () => {\n const container = $target[0];\n return !(container && !navCoordinator.canLeaveWithin(container));\n },\n ];\n\n for (const policy of policies) {\n const result = policy();\n if (result instanceof Promise) {\n if (!(await result)) return;\n } else if (!result) {\n return;\n }\n }\n\n commitNavigation({ url: path + target.hash, type, win, state: state.intent });\n },\n\n /**\n * Cleanup: Resource Disposal\n * Unbinds all event listeners, stops pending fetches, and removes target markers.\n */\n destroy() {\n _lifecycleController.abort();\n _navController?.abort();\n mainEffect.dispose();\n content.dispose();\n $target.removeAttr('data-atom-nav-target');\n\n const atoms = [\n state.intent,\n state.fetchVersion,\n state.pendingHooks,\n state.rendered,\n normalized,\n navigator.currentUrl,\n navStatus,\n isPending,\n hasError,\n ];\n atoms.forEach((a) => (a as ReadonlyAtom).dispose?.());\n },\n };\n\n // Logic: Automatic Lifecycle Coordination\n if ($target[0]) {\n navCoordinator.register($target[0], 'nav');\n registry.onCleanup($target[0], () => navigator.destroy());\n }\n\n return navigator;\n}\n\n$.extend({ atomNav });\n","import { isAtom } from '@but212/atom-effect';\nimport type { ReactiveValue } from '@/types';\n\n/**\n * Resolves the active ShadowRoot for component-local operations.\n * @internal\n */\nexport const resolveShadowRoot = (\n element: HTMLElement,\n root: Node | ShadowRoot | null | undefined\n): ShadowRoot | null =>\n root instanceof ShadowRoot\n ? root\n : element.shadowRoot instanceof ShadowRoot\n ? element.shadowRoot\n : null;\n\n/**\n * Resolves a reactive source into its current value.\n * Supports static values, atoms, and getter functions.\n * @internal\n */\nexport const resolveValue = <T>(source: ReactiveValue<T>): T => {\n if (isAtom(source)) return source.value;\n if (typeof source === 'function') return (source as () => T)();\n return source as T;\n};\n","import { isAtom } from '@but212/atom-effect';\nimport type { SlotBuffer } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport { SYSTEM_COMPONENT } from '@/constants';\nimport { HYDRATION_MARKER } from '@/core/symbols';\nimport type { EffectObject, ReactiveValue, ReadonlyAtom } from '@/types';\nimport { flattenToFormData } from '@/utils';\nimport { resolveValue } from './utils';\n\n/**\n * Collection of decomposed activation logic for setup components.\n * Separates concerns for different reactive integrations to maintain maintainability.\n * @internal\n */\nexport const SetupFeatures = {\n /**\n * Synchronizes atom values to custom events dispatched from the host.\n *\n * Logic:\n * - If the source is a function returning an object, it is used as the event `detail`.\n * - Otherwise, the value is wrapped in `{ value: val }` for a predictable API.\n */\n dispatch(\n el: HTMLElement,\n mappings: Record<string, ReactiveValue<unknown>>,\n effects: SlotBuffer<EffectObject>\n ) {\n for (const [name, source] of Object.entries(mappings)) {\n effects.push(\n $.effect(() => {\n const val = resolveValue(source);\n\n const detail =\n typeof source === 'function' && typeof val === 'object' && val !== null\n ? val\n : { value: val };\n el.dispatchEvent(new CustomEvent(name, { detail, bubbles: true, composed: true }));\n return undefined;\n })\n );\n }\n },\n\n /**\n * Applies constructable stylesheets to a ShadowRoot or Document.\n * Note: This appends to existing sheets rather than replacing them.\n */\n styles(root: ShadowRoot | Document, sheets: CSSStyleSheet[]) {\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, ...sheets];\n return sheets;\n },\n\n /**\n * Synchronizes atoms to AriaMixin properties via ElementInternals.\n * Useful for high-level accessibility state (e.g. `aria-pressed`, `aria-valuenow`).\n */\n aria(\n internals: ElementInternals,\n aria: Record<string, ReadonlyAtom<unknown>>,\n effects: SlotBuffer<EffectObject>\n ) {\n for (const [prop, atom] of Object.entries(aria)) {\n effects.push(\n $.effect(() => {\n const val = atom.value;\n // ElementInternals properties typically expect strings or null to remove the attribute\n (internals as unknown as Record<string, unknown>)[prop] =\n val != null ? String(val) : null;\n return undefined;\n })\n );\n }\n },\n\n /**\n * Performs declarative hydration of text content based on data-aej-bind attributes.\n *\n * Constraint: Uses `HYDRATION_MARKER` to ensure a node is only bound once,\n * even if multiple hydration passes occur.\n */\n hydrate(\n root: ParentNode,\n bindings: Record<string, ReadonlyAtom<unknown>>,\n effects: SlotBuffer<EffectObject>,\n hydratedNodes: Set<Element>\n ) {\n const { BIND, LEGACY_BIND } = SYSTEM_COMPONENT.ATTRS;\n const selector = `[${BIND}],[${LEGACY_BIND}]`;\n\n const apply = (node: Element) => {\n const target = node as Element & { [HYDRATION_MARKER]?: boolean };\n if (target[HYDRATION_MARKER]) return;\n\n const key = node.getAttribute(BIND) || node.getAttribute(LEGACY_BIND);\n const atom = key ? bindings[key] : null;\n\n if (atom) {\n effects.push(\n $.effect(() => {\n const val = String(atom.value ?? '');\n // Only update DOM if value actually changed to avoid layout thrashing\n if (node.textContent !== val) node.textContent = val;\n return undefined;\n })\n );\n target[HYDRATION_MARKER] = true;\n hydratedNodes.add(node);\n }\n };\n\n this.observe(root, selector, apply, effects);\n },\n\n /**\n * Synchronizes atoms to CSS Parts (`part` attribute) based on data-aej-part.\n *\n * Input Support:\n * - String: \"part1 part2\"\n * - Array: [\"part1\", \"part2\"]\n * - Object: { part1: true, part2: false }\n */\n parts(\n root: ParentNode,\n parts: Record<string, ReadonlyAtom<unknown>>,\n effects: SlotBuffer<EffectObject>\n ) {\n const attr = SYSTEM_COMPONENT.ATTRS.PART;\n const apply = (node: Element) => {\n const key = node.getAttribute(attr);\n const atom = key ? parts[key] : null;\n\n if (atom) {\n effects.push(\n $.effect(() => {\n const val = atom.value;\n let normalized: string;\n\n if (typeof val === 'string') {\n normalized = val;\n } else if (Array.isArray(val)) {\n normalized = val.join(' ');\n } else if (typeof val === 'object' && val !== null) {\n normalized = Object.entries(val as Record<string, boolean>)\n .filter(([, active]) => active)\n .map(([name]) => name)\n .join(' ');\n } else {\n normalized = '';\n }\n\n if (node.getAttribute('part') !== normalized) node.setAttribute('part', normalized);\n return undefined;\n })\n );\n }\n };\n this.observe(root, `[${attr}]`, apply, effects);\n },\n\n /**\n * Shared DOM observer for detecting dynamically added elements matching a selector.\n * This is the engine behind \"late-binding\" hydration for dynamically inserted nodes.\n */\n observe(\n root: ParentNode,\n selector: string,\n apply: (n: Element) => void,\n effects: SlotBuffer<EffectObject>\n ) {\n // Phase 1: Initial sync for already existing nodes\n if (root instanceof Element && root.matches(selector)) apply(root);\n const initial = root.querySelectorAll(selector);\n for (let i = 0; i < initial.length; i++) {\n apply(initial[i]!);\n }\n\n // Phase 2: Live monitoring for future nodes\n const obs = new MutationObserver((mutations) => {\n for (let i = 0; i < mutations.length; i++) {\n const added = mutations[i]!.addedNodes;\n for (let j = 0; j < added.length; j++) {\n const node = added[j];\n if (node instanceof Element) {\n if (node.matches(selector)) apply(node);\n const children = node.querySelectorAll(selector);\n for (let k = 0; k < children.length; k++) {\n apply(children[k]!);\n }\n }\n }\n }\n });\n\n obs.observe(root, { childList: true, subtree: true });\n // Disposal: The observer is disconnected when the component effect scope is disposed.\n effects.push($.effect(() => () => obs.disconnect()));\n },\n\n /**\n * Integrates reactive state with Form-Associated Custom Element (FACE) internals.\n *\n * This handles both the value state (via `setFormValue`) and the validity state\n * (via `setValidity`), making the component behave like a native input.\n */\n form(\n el: HTMLElement,\n internals: ElementInternals,\n value:\n | ReadonlyAtom<unknown>\n | { val: ReadonlyAtom<unknown>; state?: ReadonlyAtom<unknown> }\n | undefined,\n validation:\n | ReadonlyAtom<ValidityStateFlags | string>\n | ((val: unknown) => ValidityStateFlags | string)\n | undefined,\n effects: SlotBuffer<EffectObject>\n ) {\n const valAtom =\n value && (isAtom(value) ? value : (value as { val: ReadonlyAtom<unknown> }).val);\n const stateAtom =\n value && !isAtom(value) ? (value as { state?: ReadonlyAtom<unknown> }).state : null;\n\n effects.push(\n $.effect(() => {\n // Sync Value\n if (valAtom) {\n const v = valAtom.value;\n const s = stateAtom ? stateAtom.value : null;\n\n // Reason: Complex objects are flattened to FormData to support multi-value field synchronization.\n if (typeof v === 'object' && v !== null && !(v instanceof File) && !(v instanceof Blob)) {\n const fd = new FormData();\n flattenToFormData(fd, el.getAttribute('name') || '', v);\n internals.setFormValue(fd, s as string | FormData | null);\n } else {\n // Fallback for primitives and binary types.\n internals.setFormValue(\n v as unknown as string | File | FormData | null,\n s as unknown as string | FormData | null\n );\n }\n }\n\n // Sync Validity\n if (validation) {\n const val = valAtom ? valAtom.value : undefined;\n const res = isAtom(validation)\n ? (validation as ReadonlyAtom<ValidityStateFlags | string>).value\n : (validation as (v: unknown) => ValidityStateFlags | string)(val);\n\n if (typeof res === 'string') {\n // If it's a string, we treat it as a custom error message.\n internals.setValidity(res ? { customError: true } : {}, res, el);\n } else {\n // Otherwise, we pass the raw ValidityStateFlags.\n internals.setValidity(res, undefined, el);\n }\n }\n return undefined;\n })\n );\n },\n\n /**\n * Initializes attribute tracking.\n *\n * Optimisation: If `observedAttributes` is defined on the class,\n * we only watch those specific attributes to reduce MutationObserver overhead.\n */\n attributes(host: HTMLElement): {\n atom: ReadonlyAtom<Record<string, string | null>>;\n observer: MutationObserver;\n } {\n const getObserved = () =>\n (host.constructor as typeof HTMLElement & { observedAttributes?: string[] })\n .observedAttributes || [];\n\n const snapshot = () => {\n const observed = getObserved();\n const res: Record<string, string | null> = {};\n if (observed.length > 0) {\n for (let i = 0; i < observed.length; i++) {\n const name = observed[i]!;\n res[name] = host.getAttribute(name);\n }\n } else {\n // Fallback: watch ALL attributes if no whitelist provided.\n const attrs = host.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const a = attrs[i]!;\n res[a.name] = a.value;\n }\n }\n return res;\n };\n\n const atom = $.atom(snapshot());\n\n const observer = new MutationObserver(() => {\n atom.value = snapshot();\n });\n\n const options: MutationObserverInit = { attributes: true };\n const observed = getObserved();\n if (observed.length > 0) options.attributeFilter = observed;\n\n observer.observe(host, options);\n\n return { atom, observer };\n },\n\n /**\n * Initializes reactive slot tracking.\n * Tracks `assignedNodes` for every slot in the ShadowRoot.\n */\n slots(root: ShadowRoot | null): {\n atom: ReadonlyAtom<Record<string, Node[]>>;\n listener: (e: Event) => void;\n } {\n const snapshot = (targetSr: ShadowRoot | null) => {\n const next: Record<string, Node[]> = {};\n if (targetSr) {\n const slots = targetSr.querySelectorAll('slot');\n for (let i = 0; i < slots.length; i++) {\n const s = slots[i]!;\n next[s.name || ''] = s.assignedNodes();\n }\n }\n return next;\n };\n\n const atom = $.atom(snapshot(root));\n\n const listener = (e: Event) => {\n const target = e.target as HTMLSlotElement;\n const current = { ...atom.peek() };\n current[target.name || ''] = target.assignedNodes();\n atom.value = current;\n };\n\n if (root) {\n atom.value = snapshot(root);\n root.addEventListener('slotchange', listener);\n }\n\n return { atom, listener };\n },\n};\n","import { Option, SlotBuffer } from '@but212/atom-effect-utils';\nimport { disableAutoCleanupFor } from '@/core/registry';\nimport { CLEANUP_MARKER, HYDRATION_MARKER } from '@/core/symbols';\nimport type { EffectObject, WritableAtom } from '@/types';\nimport { resolveShadowRoot } from './utils';\n\n/**\n * Centralizes all component-specific reactive state and resource tracking.\n * Consolidates lifecycle resources into a single class instance to simplify teardown.\n * @internal\n */\nexport class ComponentState {\n /** The root node (host or shadowRoot) where bindings and styles are applied. */\n root: Option<Node & { [CLEANUP_MARKER]?: boolean }> = Option.none;\n\n /** Guards against double-initialization of the same host element. */\n isInitialized = false;\n\n /**\n * A buffer for all reactive effects created during setup.\n * Disposed as a single unit in `dispose()`.\n */\n effects = new SlotBuffer<EffectObject>();\n\n /** Set of nodes that have been processed by the hydration engine. */\n hydratedNodes = new Set<Element>();\n\n /** The root atom containing the full snapshot of attributes. */\n attributeAtom: WritableAtom<Record<string, string | null>> | null = null;\n /** The observer that keeps `attributeAtom` in sync with the DOM. */\n attributeObserver: MutationObserver | null = null;\n /** Memoized lenses into `attributeAtom` to avoid redundant atom creation. */\n attributeLenses = new Map<string, WritableAtom<string | null>>();\n\n /** The root atom containing the current mapping of assigned nodes per slot. */\n slotsAtom: WritableAtom<Record<string, Node[]>> | null = null;\n /** Memoized lenses into `slotsAtom`. */\n slotLenses = new Map<string, WritableAtom<Node[]>>();\n /** Tracks listeners to allow precise removal during teardown. */\n slotListeners = new Map<string, (e: Event) => void>();\n\n /** References to constructable stylesheets that must be removed from the root. */\n appliedStyles: CSSStyleSheet[] = [];\n\n constructor(public host: HTMLElement) {}\n\n /**\n * Deterministically releases all reactive resources and observers.\n *\n * Warning: Failure to call this on unmount will lead to memory leaks\n * as the MutationObservers and effects will remain active.\n */\n dispose() {\n // 1. Release all reactive effects\n this.effects.forEach((e) => e.dispose());\n this.effects.dispose();\n\n // 2. Clear hydration markers to allow re-hydration if moved back to DOM\n this.hydratedNodes.forEach((n) => {\n delete (n as Element & { [HYDRATION_MARKER]?: boolean })[HYDRATION_MARKER];\n });\n this.hydratedNodes.clear();\n\n // 3. Attribute Cleanup\n if (this.attributeObserver) {\n this.attributeObserver.disconnect();\n this.attributeObserver = null;\n }\n this.attributeAtom = null;\n this.attributeLenses.clear();\n\n // 4. Slot Cleanup (Remove listeners from ShadowRoot)\n const sr = resolveShadowRoot(this.host, Option.toNullable(this.root));\n if (sr) {\n this.slotListeners.forEach((l) => sr.removeEventListener('slotchange', l));\n }\n this.slotListeners.clear();\n this.slotsAtom = null;\n this.slotLenses.clear();\n\n // 5. Root Node Reset (Styles & Registry)\n const rootNode = Option.toNullable(this.root);\n if (rootNode) {\n // Reason: We must filter our styles out of adoptedStyleSheets rather than\n // resetting the array, as other libraries might have added their own sheets.\n if (\n this.appliedStyles.length > 0 &&\n (rootNode instanceof ShadowRoot || rootNode instanceof Document)\n ) {\n rootNode.adoptedStyleSheets = rootNode.adoptedStyleSheets.filter(\n (s) => !this.appliedStyles.includes(s)\n );\n }\n this.appliedStyles = [];\n\n const markerNode = rootNode as unknown as { [CLEANUP_MARKER]?: boolean };\n if (markerNode[CLEANUP_MARKER]) {\n disableAutoCleanupFor(rootNode as Element);\n markerNode[CLEANUP_MARKER] = false;\n }\n }\n\n this.root = Option.none;\n this.isInitialized = false;\n }\n}\n","import { BRAND, BrandFlags, isAtom, isWritable, untracked } from '@but212/atom-effect';\nimport { Option } from '@but212/atom-effect-utils';\nimport $ from 'jquery';\nimport { SYSTEM_COMPONENT } from '@/constants';\nimport { enableAutoCleanup, registry } from '@/core/registry';\nimport { CLEANUP_MARKER, CONTEXT_REQUEST, type ContextRequestDetail } from '@/core/symbols';\nimport type {\n AtomComponentController,\n AtomComponentStatic,\n EffectObject,\n JQueryScopedSelector,\n ReadonlyAtom,\n WritableAtom,\n} from '@/types';\nimport { debug } from '@/utils/debug';\nimport { SetupFeatures } from './setup';\nimport { ComponentState } from './state';\nimport { resolveShadowRoot } from './utils';\n\n/**\n * Diagnostic access for internal engine state.\n * Exposed on `window.__AEJ_INTERNAL__` in debug mode.\n * @internal\n */\ninterface DebugPortal {\n nodeStateMap: WeakMap<Node, NodeInternalState>;\n sheetCache: Map<string, CSSStyleSheet>;\n version: string;\n}\n\n/**\n * Metadata container for AEJ-managed nodes.\n * Using a WeakMap ensures metadata is GC'd when the Node is removed from memory.\n * @internal\n */\ninterface NodeInternalState {\n providers?: Map<string | symbol, unknown>;\n providerEffects?: Map<string | symbol, EffectObject>;\n injects?: Map<string | symbol, WritableAtom<unknown>>;\n controller?: AtomComponentController;\n}\n\n// ─── Internal State Storage ──────────────────────────────────────────────────\n\nconst nodeStateMap = new WeakMap<Node, NodeInternalState>();\nconst sheetCache = new Map<string, CSSStyleSheet>();\nconst MAX_SHEET_CACHE_SIZE = 100;\n\n// ─── Debug Portal ──────────────────────────────────────────────────\n\nif (debug.enabled && typeof window !== 'undefined') {\n (window as unknown as { __AEJ_INTERNAL__: DebugPortal }).__AEJ_INTERNAL__ = {\n nodeStateMap,\n sheetCache,\n version: '0.32.0',\n };\n}\n\n/**\n * WeakMap for elements that were declared as components via static properties\n * but are not yet connected to the DOM.\n */\nconst autoSetupMap = new WeakMap<HTMLElement, AtomComponentStatic>();\n\n/** Retrieves or initializes the internal metadata state for a node. @internal */\nconst getInternalState = (node: Node): NodeInternalState => {\n let state = nodeStateMap.get(node);\n if (!state) {\n state = {};\n nodeStateMap.set(node, state);\n }\n return state;\n};\n\n// ─── Environment & Compatibility ───────────────────────────────────────────────\n\nconst supportsConstructableStylesheets =\n typeof window !== 'undefined' &&\n 'adoptedStyleSheets' in Document.prototype &&\n 'replaceSync' in CSSStyleSheet.prototype;\n\nconst supportsInternals =\n typeof window !== 'undefined' && 'attachInternals' in HTMLElement.prototype;\n\n/**\n * Manages a global cache of CSSStyleSheets to prevent redundant parsing\n * of identical style strings across component instances.\n */\nconst getOrCreateSheet = (source: string | CSSStyleSheet): CSSStyleSheet => {\n if (source instanceof CSSStyleSheet) return source;\n let sheet = sheetCache.get(source);\n if (!sheet) {\n sheet = new CSSStyleSheet();\n sheet.replaceSync(source);\n // Simple LRU-ish eviction: remove the first added entry if cache exceeds limit\n if (sheetCache.size >= MAX_SHEET_CACHE_SIZE) {\n const firstKey = sheetCache.keys().next().value;\n if (firstKey !== undefined) sheetCache.delete(firstKey);\n }\n sheetCache.set(source, sheet);\n }\n return sheet;\n};\n\n// ─── Context Engine ─────────────────────────────────────────────────────────\n\n/**\n * Internal singleton that coordinates Dependency Injection (DI) across the DOM.\n *\n * Why: DOM tree changes (adding/removing nodes) affect context resolution.\n * This engine tracks those changes and notifies observers.\n */\nconst ContextEngine = (() => {\n const version = $.atom(0);\n let isBumpPending = false;\n let observer: MutationObserver | null = null;\n let activeCount = 0;\n\n /**\n * Signals that the DOM tree has changed, potentially invalidating cached injections.\n * Debounced to a microtask to avoid excessive re-computations during bulk updates.\n */\n const bump = () => {\n if (isBumpPending) return;\n isBumpPending = true;\n queueMicrotask(() => {\n version.value++;\n isBumpPending = false;\n });\n };\n\n /**\n * Initializes a \"late-bound\" component that was discovered in the DOM.\n */\n const init = (el: HTMLElement) => {\n const specs = autoSetupMap.get(el);\n if (specs) {\n const ctrl = nodeStateMap.get(el)?.controller;\n if (ctrl) {\n ctrl.setup({\n ...(specs.aejStyles && { styles: specs.aejStyles }),\n ...(specs.aejBind && { bind: specs.aejBind }),\n ...(specs.aejAria && { aria: specs.aejAria }),\n ...(specs.aejParts && { parts: specs.aejParts }),\n ...(specs.aejDispatch && { dispatch: specs.aejDispatch }),\n ...(specs.aejValue && { value: specs.aejValue }),\n ...(specs.aejValidation && { validation: specs.aejValidation }),\n });\n }\n autoSetupMap.delete(el);\n ContextEngine.release();\n }\n };\n\n const ensureObserver = () => {\n if (observer || typeof document === 'undefined') return;\n observer = new MutationObserver((mutations) => {\n let needsBump = false;\n for (let i = 0; i < mutations.length; i++) {\n const m = mutations[i]!;\n if (m.addedNodes.length > 0) {\n needsBump = true;\n for (let j = 0; j < m.addedNodes.length; j++) {\n const node = m.addedNodes[j];\n if (node instanceof HTMLElement) {\n init(node);\n // Deep scan for nested components that might have been added in a fragment\n const children = node.querySelectorAll('*');\n for (let k = 0; k < children.length; k++) {\n init(children[k] as HTMLElement);\n }\n }\n }\n }\n if (m.removedNodes.length > 0) needsBump = true;\n }\n if (needsBump) bump();\n });\n observer.observe(document.documentElement, { childList: true, subtree: true });\n };\n\n const releaseObserver = () => {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n };\n\n return {\n get version() {\n return version;\n },\n bump,\n /** Activates DOM monitoring when at least one component is waiting for connection. */\n retain() {\n activeCount++;\n if (activeCount === 1) ensureObserver();\n },\n /** Deactivates DOM monitoring when no components are pending. */\n release() {\n activeCount--;\n if (activeCount === 0) releaseObserver();\n },\n /**\n * Resolves a context key by dispatching a bubbling DOM event.\n * This mimics the native Web Component Context API proposal.\n */\n discover(target: HTMLElement, key: string | symbol): Option<unknown> {\n let found: Option<unknown> = Option.none;\n const event = new CustomEvent<ContextRequestDetail>(CONTEXT_REQUEST, {\n detail: {\n key,\n callback: (atom) => {\n found = Option.some(atom);\n },\n },\n bubbles: true,\n composed: true, // Traverse shadow boundaries\n });\n target.dispatchEvent(event);\n return found;\n },\n };\n})();\n\n// ─── Context Proxy Resolver ─────────────────────────────────────────────────\n\n/**\n * Creates a reactive proxy that follows a context value as it moves in the DOM.\n *\n * If the element is moved under a different provider, this proxy will automatically\n * update to the new provider's value because it tracks `ContextEngine.version`.\n */\nfunction createContextProxy<T>(target: HTMLElement, key: string | symbol): WritableAtom<T> {\n const resolve = (isPeek: boolean) => {\n // Tracking version makes the calling computed/effect re-run when DOM structure changes\n if (isPeek) ContextEngine.version.peek();\n else ContextEngine.version.value;\n\n return untracked(() => ContextEngine.discover(target, key)) as Option<WritableAtom<T> | T>;\n };\n\n const getLiveValue = (isPeek: boolean) => {\n const res = resolve(isPeek);\n if (Option.isNone(res)) return null as T;\n const p = Option.unwrap(res);\n // If the provider provided an Atom, we return its value. Otherwise return the raw value.\n return (isAtom(p) ? (isPeek ? p.peek() : p.value) : p) as T;\n };\n\n let sharedAtom: ReadonlyAtom<T> | null = null;\n const getShared = () => {\n if (!sharedAtom) sharedAtom = $.computed(() => getLiveValue(false));\n return sharedAtom;\n };\n\n return {\n get value() {\n return getLiveValue(false);\n },\n set value(v: T) {\n const res = resolve(true);\n if (Option.isSome(res)) {\n const p = Option.unwrap(res);\n if (isWritable(p)) p.value = v;\n }\n },\n peek() {\n return getLiveValue(true);\n },\n subscribe: (fn) => {\n ContextEngine.retain(); // Keep observer alive while there are active subscribers\n const unsub = getShared().subscribe(fn);\n return () => {\n unsub();\n ContextEngine.release();\n };\n },\n subscriberCount: () => (sharedAtom ? sharedAtom.subscriberCount() : 0),\n dispose: () => {\n if (sharedAtom) {\n sharedAtom.dispose();\n sharedAtom = null;\n }\n },\n [BRAND]: BrandFlags.Atom | BrandFlags.Writable,\n } as WritableAtom<T>;\n}\n\n// ─── Controller Implementation ───────────────────────────────────────────────\n\n/**\n * Orchestrates AEJ features for a specific DOM element.\n *\n * Usage:\n * ```ts\n * const ctrl = useAtomComponent(el);\n * ctrl.setup({\n * bind: { '.title': { text: titleAtom } }\n * });\n * ```\n */\nexport function useAtomComponent(element: HTMLElement): AtomComponentController {\n // Guard: Warn if used on an unregistered custom element (potential typo)\n if (debug.enabled && typeof customElements !== 'undefined') {\n const tagName = element.tagName.toLowerCase();\n if (tagName.includes('-') && !customElements.get(tagName)) {\n debug.warn(SYSTEM_COMPONENT.PREFIX, SYSTEM_COMPONENT.ERRORS.NOT_REGISTERED(tagName));\n }\n }\n\n const internal = getInternalState(element);\n if (internal.controller) return internal.controller;\n\n // ElementInternals allows custom elements to participate in forms and accessibility\n let internals: ElementInternals | undefined;\n if (supportsInternals) {\n try {\n internals = element.attachInternals();\n } catch {\n /* Native exception if attachInternals is called twice or not on a custom element */\n }\n }\n\n const state = new ComponentState(element);\n\n const controller: AtomComponentController = {\n host: element,\n get root() {\n return Option.toNullable(state.root);\n },\n get internals() {\n return internals;\n },\n\n /** Returns a reactive lens for a DOM attribute. Updates when the attribute changes. */\n get attrs() {\n if (!state.attributeAtom) {\n const { atom, observer } = SetupFeatures.attributes(element);\n state.attributeAtom = atom;\n state.attributeObserver = observer;\n }\n return (name: string) => {\n let lens = state.attributeLenses.get(name);\n if (!lens) {\n lens = $.atomLens(state.attributeAtom!, name);\n state.attributeLenses.set(name, lens);\n }\n return lens;\n };\n },\n\n /** Returns a reactive lens for named slots. Useful in Shadow DOM components. */\n get slots() {\n if (!state.slotsAtom) {\n const sr = resolveShadowRoot(element, Option.toNullable(state.root));\n const { atom, listener } = SetupFeatures.slots(sr);\n state.slotsAtom = atom;\n if (sr) state.slotListeners.set('all', listener);\n }\n return (name: string) => {\n const key = name === 'default' ? '' : name;\n let lens = state.slotLenses.get(key);\n if (!lens) {\n lens = $.atomLens(state.slotsAtom!, key);\n state.slotLenses.set(key, lens);\n }\n return lens;\n };\n },\n\n /** Scoped jQuery selector. Defaults to searching within the component's root. */\n $: ((selector, context) => {\n const ctx = context ?? Option.toNullable(state.root) ?? element;\n if (typeof selector !== 'string') return $(selector) as unknown as JQuery;\n return ctx instanceof DocumentFragment\n ? ($(ctx.querySelectorAll(selector)) as unknown as JQuery)\n : ($(selector, ctx as Element) as unknown as JQuery);\n }) as JQueryScopedSelector,\n\n provideAtom: (key: string | symbol, val: unknown) => provideAtom(element, key, val),\n injectAtom: <T = unknown>(key: string | symbol) => injectAtom<T>(element, key),\n\n /**\n * Bootstraps component features (bindings, styles, etc.)\n * This is idempotent; calling it twice with the same root does nothing.\n */\n setup(options: Parameters<AtomComponentController['setup']>[0]) {\n if (state.isInitialized) {\n const incoming = options instanceof Node ? options : options?.shadowRoot;\n if (incoming && incoming !== Option.toNullable(state.root))\n throw new Error('Call teardown() first to change the root.');\n return;\n }\n\n const config =\n options instanceof Node ? { shadowRoot: options as ShadowRoot } : (options ?? {});\n const srOpt = Option.fromNullable(config.shadowRoot ?? element.shadowRoot);\n\n Option.map(srOpt, (sr) => {\n registry.markHost(element);\n registry.registerShadow(element, sr);\n });\n\n const rootNode = Option.unwrapOr(srOpt, element) as Node & {\n [CLEANUP_MARKER]?: boolean;\n };\n state.root = Option.some(rootNode);\n\n // Memory Management: Ensure the root node (ShadowRoot or Element)\n // automatically cleans up AEJ effects when disconnected from the DOM.\n if (!rootNode[CLEANUP_MARKER]) {\n enableAutoCleanup(rootNode as Element);\n rootNode[CLEANUP_MARKER] = true;\n }\n\n // Feature Initialization Sequence\n if (!state.slotsAtom) {\n const sr = Option.toNullable(srOpt);\n const { atom, listener } = SetupFeatures.slots(sr);\n state.slotsAtom = atom;\n if (sr) state.slotListeners.set('all', listener);\n }\n\n if (config.dispatch) SetupFeatures.dispatch(element, config.dispatch, state.effects);\n if (config.bind)\n SetupFeatures.hydrate(rootNode as Element, config.bind, state.effects, state.hydratedNodes);\n\n if (\n config.styles &&\n supportsConstructableStylesheets &&\n (rootNode instanceof ShadowRoot || rootNode instanceof Document)\n ) {\n state.appliedStyles = SetupFeatures.styles(rootNode, config.styles.map(getOrCreateSheet));\n }\n\n if (config.aria && internals) SetupFeatures.aria(internals, config.aria, state.effects);\n if (config.parts) SetupFeatures.parts(rootNode as Element, config.parts, state.effects);\n\n if ((config.value || config.validation) && internals) {\n SetupFeatures.form(element, internals, config.value, config.validation, state.effects);\n }\n\n state.isInitialized = true;\n },\n\n teardown() {\n const s = nodeStateMap.get(element);\n if (s) {\n s.providers?.clear();\n s.providerEffects?.forEach((e) => e.dispose());\n s.providerEffects?.clear();\n s.injects?.clear();\n }\n\n if (autoSetupMap.has(element)) {\n autoSetupMap.delete(element);\n ContextEngine.release();\n }\n\n ContextEngine.bump();\n state.dispose();\n registry.cleanupTree(element);\n },\n } as unknown as AtomComponentController;\n\n // ─── Automatic Setup for Static Declarations ──────────────────────────────\n\n const ctor = element.constructor as typeof HTMLElement & AtomComponentStatic;\n const hasStaticSpecs = !!(\n ctor.aejStyles ||\n ctor.aejBind ||\n ctor.aejAria ||\n ctor.aejParts ||\n ctor.aejDispatch ||\n ctor.aejValue ||\n ctor.aejValidation\n );\n\n if (hasStaticSpecs) {\n if (element.isConnected) {\n controller.setup({\n ...(ctor.aejStyles && { styles: ctor.aejStyles }),\n ...(ctor.aejBind && { bind: ctor.aejBind }),\n ...(ctor.aejAria && { aria: ctor.aejAria }),\n ...(ctor.aejParts && { parts: ctor.aejParts }),\n ...(ctor.aejDispatch && { dispatch: ctor.aejDispatch }),\n ...(ctor.aejValue && { value: ctor.aejValue }),\n ...(ctor.aejValidation && { validation: ctor.aejValidation }),\n });\n } else {\n // If not connected, defer setup until the element is inserted into the DOM.\n autoSetupMap.set(element, ctor);\n ContextEngine.retain();\n }\n }\n\n registry.setTeardown(element, () => controller.teardown());\n\n internal.controller = controller;\n return controller;\n}\n\n/**\n * Registers a value or atom to be provided to all descendant elements.\n *\n * Side-effect: Synchronizes the value to a CSS variable `--aej-[key]`\n * on the host element for hybrid styling (CSS-in-JS lite).\n *\n * @example\n * provideAtom(el, 'theme', $.atom('dark'));\n */\nexport function provideAtom(\n element: HTMLElement | JQuery | string,\n key: string | symbol,\n val: unknown\n): void {\n const targets =\n element instanceof HTMLElement\n ? [element]\n : typeof element === 'string'\n ? Array.from(document.querySelectorAll<HTMLElement>(element))\n : ((element as JQuery).toArray() as HTMLElement[]);\n\n for (let i = 0; i < targets.length; i++) {\n const el = targets[i]!;\n const state = getInternalState(el);\n if (!state.providers) {\n state.providers = new Map();\n // Listen for injection requests from descendants\n el.addEventListener(CONTEXT_REQUEST, (e: Event) => {\n const { key: reqKey, callback } = (e as CustomEvent<ContextRequestDetail>).detail;\n if (state.providers?.has(reqKey)) {\n e.stopPropagation();\n callback(state.providers.get(reqKey));\n }\n });\n }\n state.providers.set(key, val);\n\n // CSS Variable Sync Logic\n const keyStr = typeof key === 'symbol' ? key.description : String(key);\n if (keyStr) {\n const varName = `--aej-${keyStr}`;\n const sync = (v: unknown) => el.style.setProperty(varName, String(v ?? ''));\n if (isAtom(val)) {\n if (!state.providerEffects) state.providerEffects = new Map();\n state.providerEffects.get(key)?.dispose();\n state.providerEffects.set(\n key,\n $.effect(() => {\n sync(val.value);\n return undefined;\n })\n );\n } else sync(val);\n }\n }\n ContextEngine.bump();\n}\n\n/**\n * Injects a provided value or atom from an ancestor.\n * Returns a proxy atom that tracks the provider's location in the DOM.\n *\n * @example\n * const theme = injectAtom(el, 'theme');\n * $.effect(() => console.log(theme.value));\n */\nexport function injectAtom<T = unknown>(\n element: HTMLElement | JQuery | string,\n key: string | symbol\n): WritableAtom<T> | null {\n const target =\n element instanceof HTMLElement\n ? element\n : typeof element === 'string'\n ? document.querySelector<HTMLElement>(element)\n : ((element as JQuery)[0] as HTMLElement);\n\n if (!target) return null;\n\n if (debug.enabled && typeof customElements !== 'undefined') {\n const tagName = target.tagName.toLowerCase();\n if (tagName.includes('-') && !customElements.get(tagName)) {\n debug.warn(SYSTEM_COMPONENT.PREFIX, SYSTEM_COMPONENT.ERRORS.NOT_REGISTERED(tagName));\n }\n }\n\n const state = getInternalState(target);\n if (!state.injects) state.injects = new Map();\n let existing = state.injects.get(key);\n if (!existing) {\n existing = createContextProxy<T>(target, key);\n state.injects.set(key, existing);\n }\n return existing as WritableAtom<T>;\n}\n\n// Attach to jQuery namespace for global accessibility\n$.extend({ provideAtom, injectAtom, useAtomComponent });\n","import { batch } from '@but212/atom-effect';\nimport $ from 'jquery';\nimport { registry } from '@/core/registry';\nimport type { PatchOptions } from '@/types';\nimport { INTERNAL_HANDLER } from './symbols';\n\n/** Alias for common jQuery event handler types. @internal */\ntype EventHandler = JQuery.EventHandlerBase<unknown, JQuery.TriggeredEvent>;\n\n/** A mapping of original user-defined handlers to their batch-wrapped counterparts. */\nconst handlerMap = new WeakMap<EventHandler, EventHandler>();\n\n/** Internal union type for various jQuery event map values. @internal */\ntype JQueryEventHandler = EventHandler | boolean;\n\n/** Extended EventHandler interface to include internal marker. @internal */\ninterface InternalHandler extends EventHandler {\n [INTERNAL_HANDLER]?: boolean;\n}\n\n/** Metadata storing references to native jQuery methods before patching. */\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\n/** Global storage for native jQuery methods to allow restoration. */\nlet originals: OriginalMethods | null = null;\n\n/**\n * Wraps a standard event handler function in a reactive batch.\n *\n * Logic: Auto-Batching\n * Performance Note: Removed Option utility to minimize overhead in event hot-paths.\n * @internal\n */\nconst wrapHandler = (fn: EventHandler): EventHandler => {\n if ((fn as InternalHandler)[INTERNAL_HANDLER]) return fn;\n\n const cached = handlerMap.get(fn);\n if (cached) return cached;\n\n const wrapped = function (this: unknown, ...args: unknown[]) {\n return batch(() => fn.apply(this, args as Parameters<EventHandler>));\n } as unknown as InternalHandler;\n\n wrapped[INTERNAL_HANDLER] = true;\n handlerMap.set(fn, wrapped);\n return wrapped;\n};\n\n/**\n * Retrieves the original handler function from a wrapped version.\n * @internal\n */\nconst unwrapHandler = (fn: EventHandler): EventHandler => {\n return handlerMap.get(fn) ?? fn;\n};\n\n/**\n * Normalizes and wraps all handlers within a jQuery event map.\n * Optimized with a for-in loop to avoid intermediate entry arrays.\n * @internal\n */\nfunction wrapEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler | undefined> {\n const result: Record<string, JQueryEventHandler> = {};\n for (const key in map) {\n const fn = map[key];\n result[key] = typeof fn === 'function' ? wrapHandler(fn) : (fn as JQueryEventHandler);\n }\n return result;\n}\n\n/**\n * Normalizes and unwraps all handlers within a jQuery event map.\n * Optimized with a for-in loop.\n * @internal\n */\nfunction unwrapEventMap(\n map: Record<string, JQueryEventHandler | undefined>\n): Record<string, JQueryEventHandler | undefined> {\n const result: Record<string, JQueryEventHandler | undefined> = {};\n for (const key in map) {\n const fn = map[key];\n result[key] = typeof fn === 'function' ? unwrapHandler(fn) : fn;\n }\n return result;\n}\n\n/**\n * Utility for modifying jQuery method arguments to wrap or unwrap handlers.\n * @internal\n */\nfunction patchArguments(\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 // Standard jQuery signature: .on( types [, selector ] [, data ], handler )\n // We scan for function arguments to wrap/unwrap them.\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\n/**\n * Enables global patches for jQuery to integrate reactive state management.\n * @internal\n */\nexport function enablejQueryOverrides(options: PatchOptions = {}): void {\n if (originals !== null) return;\n\n const { events = true, lifecycle = true } = options;\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 prev = originals;\n\n if (lifecycle) {\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 prev.remove.call(this, selector);\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()) {\n registry.cleanupDescendants(el);\n }\n }\n return prev.empty.call(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) {\n registry.keep(el);\n }\n }\n return prev.detach.call(this, selector);\n };\n }\n\n if (events) {\n $.fn.on = function (this: JQuery, ...args: unknown[]) {\n patchArguments(args, wrapEventMap, wrapHandler);\n return prev.on.apply(this, args as Parameters<typeof $.fn.on>);\n };\n\n $.fn.one = function (this: JQuery, ...args: unknown[]) {\n patchArguments(args, wrapEventMap, wrapHandler);\n return prev.one.apply(this, args as Parameters<typeof $.fn.one>);\n };\n\n $.fn.off = function (this: JQuery, ...args: unknown[]) {\n patchArguments(args, unwrapEventMap, unwrapHandler);\n return prev.off.apply(this, args as Parameters<typeof $.fn.off>);\n };\n }\n}\n\n/**\n * Restores jQuery prototype methods to their original native state.\n * @internal\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 $ from 'jquery';\n\nimport '@/core/namespace';\nimport '@/bindings/chainable';\nimport '@/bindings/list';\nimport '@/bindings/mount';\nimport '@/features/route';\nimport '@/features/fetch';\nimport '@/features/nav';\nimport '@/features/web-component';\nimport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nimport type { AEJConfig } from '@/types';\nimport {\n disableAutoCleanup,\n enableAutoCleanup,\n registry,\n setAutoCleanupAllowed,\n} from './core/registry';\n\n/**\n * Initializes Atom-Effect jQuery with the specified configuration.\n *\n * This function resets the library's state according to the provided config.\n * It is safe to call multiple times to reconfigure features at runtime.\n *\n * @param config - Configuration options.\n *\n * @warning If both `patch` and `autoCleanup` are set to `false`, you are\n * responsible for calling `cleanup(element)` manually when\n * elements are removed to prevent memory leaks.\n */\nexport function initAEJ(config: AEJConfig = {}): void {\n const { patch = true, autoCleanup = true } = config;\n\n // 1. Install jQuery patches (granular options handled inside)\n disablejQueryOverrides();\n if (patch !== false) {\n const patchOpts = typeof patch === 'object' ? patch : {};\n enablejQueryOverrides(patchOpts);\n }\n\n // 2. Configure MutationObserver safety net\n disableAutoCleanup();\n if (autoCleanup !== false) {\n setAutoCleanupAllowed(true);\n const root = typeof autoCleanup === 'object' ? autoCleanup.root : document.body;\n if (root) {\n enableAutoCleanup(root);\n registry.setAutoCleanupScheduled(true);\n }\n } else {\n setAutoCleanupAllowed(false);\n }\n}\n\n// Logic: Legacy support for automatic initialization.\n// Allows opting out via window.AEJ_NO_AUTO_INIT = true.\n$(() => {\n const win = window as unknown as { AEJ_NO_AUTO_INIT?: boolean };\n if (!win.AEJ_NO_AUTO_INIT) initAEJ();\n});\n\nexport { disablejQueryOverrides, enablejQueryOverrides } from '@/core/jquery-patch';\nexport { disableAutoCleanup, enableAutoCleanup } from '@/core/registry';\n\n/**\n * Performs a deep recursive cleanup on a node and its entire Shadow DOM subtrees.\n *\n * When to use:\n * - Manually cleaning up an element that was removed from the DOM if autoCleanup is disabled.\n * - Forcing a cleanup cycle on a specific container.\n *\n * @param element - The element to clean up.\n */\nexport function cleanup(element: HTMLElement | JQuery): void {\n if (element instanceof HTMLElement) {\n registry.cleanupTree(element);\n } else {\n element.each((_, el) => registry.cleanupTree(el));\n }\n}\n\n$.extend({ initAEJ });\n\nexport type {\n AtomComponentController,\n AtomNav,\n AtomNavOptions,\n BindingOptions,\n ComponentFn,\n ComputedAtom,\n CssBindings,\n CssValue,\n EffectCleanup,\n EffectResult,\n EqualFn,\n FetchError,\n FetchOptions,\n JQueryScopedSelector,\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 default $;\n"],"mappings":"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"}
|