@getforma/core 1.1.0 → 1.3.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/dist/{chunk-MIOMT2CB.js → chunk-AJP4OVCN.js} +29 -9
- package/dist/chunk-AJP4OVCN.js.map +1 -0
- package/dist/{chunk-XLVBYXOU.js → chunk-ETPJTPYD.js} +6 -3
- package/dist/chunk-ETPJTPYD.js.map +1 -0
- package/dist/{chunk-JRQNDXX7.cjs → chunk-FBM7V4NE.cjs} +68 -47
- package/dist/chunk-FBM7V4NE.cjs.map +1 -0
- package/dist/{chunk-W7OUWVRA.cjs → chunk-H7MDUHS5.cjs} +6 -2
- package/dist/chunk-H7MDUHS5.cjs.map +1 -0
- package/dist/{chunk-2Y5US35K.cjs → chunk-KUXNZ5MG.cjs} +12 -12
- package/dist/{chunk-2Y5US35K.cjs.map → chunk-KUXNZ5MG.cjs.map} +1 -1
- package/dist/{chunk-INNOI6TG.js → chunk-Y3A2EVVS.js} +3 -3
- package/dist/{chunk-INNOI6TG.js.map → chunk-Y3A2EVVS.js.map} +1 -1
- package/dist/forma-runtime-csp.js +178 -79
- package/dist/forma-runtime.js +178 -79
- package/dist/formajs-runtime-hardened.global.js +178 -79
- package/dist/formajs-runtime-hardened.global.js.map +1 -1
- package/dist/formajs-runtime.global.js +178 -79
- package/dist/formajs-runtime.global.js.map +1 -1
- package/dist/formajs.global.js +245 -61
- package/dist/formajs.global.js.map +1 -1
- package/dist/http.cjs +11 -11
- package/dist/http.js +2 -2
- package/dist/index.cjs +307 -143
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +34 -2
- package/dist/index.d.ts +34 -2
- package/dist/index.js +248 -88
- package/dist/index.js.map +1 -1
- package/dist/runtime-hardened.cjs +178 -79
- package/dist/runtime-hardened.cjs.map +1 -1
- package/dist/runtime-hardened.js +178 -79
- package/dist/runtime-hardened.js.map +1 -1
- package/dist/runtime.cjs +198 -103
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +174 -79
- package/dist/runtime.js.map +1 -1
- package/dist/server.cjs +7 -7
- package/dist/server.js +2 -2
- package/dist/tc39-compat.cjs +3 -3
- package/dist/tc39-compat.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-JRQNDXX7.cjs.map +0 -1
- package/dist/chunk-MIOMT2CB.js.map +0 -1
- package/dist/chunk-W7OUWVRA.cjs.map +0 -1
- package/dist/chunk-XLVBYXOU.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reactive/dev.ts","../src/reactive/signal.ts","../src/reactive/effect.ts","../src/reactive/computed.ts","../src/reactive/batch.ts","../src/dom/list.ts","../src/dom/reconcile.ts","../src/security/url-safety.ts","../src/runtime.ts"],"names":["createRawSignal","rawEffect","rawComputed","reconcile","value","disposeCloneBindings","el","createBoundClone","updateBoundClone","batch"],"mappings":"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","file":"runtime-hardened.js","sourcesContent":["/**\n * Forma Reactive - Dev Mode\n *\n * Development utilities stripped from production builds via __DEV__ flag.\n * Bundlers replace __DEV__ with false → dead-code elimination removes all dev paths.\n */\n\n// __DEV__ is replaced by the bundler (tsup define) for dead-code elimination in\n// dist. For unbundled/raw-source usage it derives from NODE_ENV, and — when the\n// environment is indeterminate — defaults to *false* (production-safe: no console\n// noise) unless a consumer opts in via a global __FORMA_DEV__.\ndeclare const process: { env?: Record<string, string | undefined> } | undefined;\ndeclare const __FORMA_DEV__: boolean | undefined;\n\n/**\n * Lazily evaluate whether we're in a dev environment. Read per-call (not frozen\n * at import) so runtime NODE_ENV changes are honored and so official prod dist\n * builds — where tsup hard-defines __DEV__ = false — stay quiet regardless.\n */\nfunction isDev(): boolean {\n if (typeof process !== 'undefined') {\n return process!.env?.NODE_ENV !== 'production';\n }\n return typeof __FORMA_DEV__ !== 'undefined' ? !!__FORMA_DEV__ : false;\n}\n\nexport const __DEV__: boolean = isDev();\n\n// ---------------------------------------------------------------------------\n// Global error handlers\n// ---------------------------------------------------------------------------\n\n/** Callback signature for a global {@link onError} handler. */\nexport type ErrorHandler = (error: unknown, info?: { source?: string }) => void;\n\nconst _errorHandlers = new Set<ErrorHandler>();\n\n/**\n * Install a global error handler for FormaJS reactive errors. Called when\n * effects, computeds, or event handlers throw. Multiple handlers may be\n * registered; returns an unsubscribe function that removes only this handler.\n *\n * ```ts\n * const off = onError((err, info) => {\n * Sentry.captureException(err, { tags: { source: info?.source } });\n * });\n * // later: off();\n * ```\n */\nexport function onError(handler: ErrorHandler): () => void {\n _errorHandlers.add(handler);\n return () => { _errorHandlers.delete(handler); };\n}\n\n/** @internal */\nexport function reportError(error: unknown, source?: string): void {\n for (const handler of _errorHandlers) {\n try { handler(error, source ? { source } : {}); } catch { /* prevent infinite loop */ }\n }\n if (isDev()) {\n console.error(`[forma] ${source ?? 'Unknown'} error:`, error);\n }\n}\n","/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, setActiveSub, trigger } from 'alien-signals';\nimport { __DEV__ } from './dev.js';\n\n// Debug names live in a side table rather than on the getter's `.name`, so\n// alien-signals' isSignal() (which keys off the bound function name) still\n// recognizes named signals.\nconst signalNames = new WeakMap<object, string>();\n\n/** Debug name of a signal getter, if one was provided (dev-only). */\nexport function getSignalName(fn: unknown): string | undefined {\n return typeof fn === 'function' ? signalNames.get(fn as object) : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** A function that reads the current value of a signal. */\nexport type SignalGetter<T> = () => T;\n/** A function that updates a signal — accepts a value or an updater function. */\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /**\n * Custom equality check. When provided, the setter will read the current\n * value and only update the signal if `equals(prev, next)` returns `false`.\n *\n * Default: none (alien-signals uses strict inequality `!==` internally).\n *\n * ```ts\n * const [pos, setPos] = createSignal(\n * { x: 0, y: 0 },\n * { equals: (a, b) => a.x === b.x && a.y === b.y },\n * );\n *\n * setPos({ x: 0, y: 0 }); // skipped — equals returns true\n * setPos({ x: 1, y: 0 }); // applied — equals returns false\n * ```\n */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n equals?: (prev: T, next: T) => boolean,\n): void {\n // Fast path: plain value, no equals — no prev read needed. (A running effect\n // writing its own dependency is detected at the effect level via the Pending\n // flag, so signal.ts does not need to do anything special here.)\n if (typeof v !== 'function') {\n if (!equals) {\n s(v);\n return;\n }\n const prevSub = setActiveSub(undefined);\n const prev = s();\n setActiveSub(prevSub);\n if (equals(prev, v)) return; // suppressed by custom equality\n s(v);\n if (Object.is(prev, v)) forceNotify(s);\n return;\n }\n\n // Functional update: read prev without tracking.\n const prevSub = setActiveSub(undefined);\n const prev = s();\n setActiveSub(prevSub);\n const next = (v as (prev: T) => T)(prev);\n if (equals && equals(prev, next)) return; // suppressed by custom equality\n s(next);\n if (equals && Object.is(prev, next)) forceNotify(s);\n}\n\n/**\n * When a custom `equals` decided to APPLY (returned false) but the value is the\n * identical reference, alien-signals suppresses propagation (its guard is\n * `pendingValue !== value`). Force-notify subscribers so `equals: () => false`\n * (\"always notify\") works for mutate-in-place patterns.\n */\nfunction forceNotify<T>(s: RawSignal<T>): void {\n trigger(() => { s(); });\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n *\n * With custom equality:\n *\n * ```ts\n * const [pos, setPos] = createSignal(\n * { x: 0, y: 0 },\n * { equals: (a, b) => a.x === b.x && a.y === b.y },\n * );\n * ```\n */\nexport function createSignal<T>(initialValue: T, options?: SignalOptions<T>): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n if (__DEV__ && options?.name) {\n signalNames.set(getter as object, options.name);\n }\n const eq = options?.equals;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v, eq);\n\n return [getter, setter];\n}\n","/**\n * Forma Reactive - Effect\n *\n * Side-effectful reactive computation that auto-tracks signal dependencies.\n * Backed by alien-signals for automatic dependency tracking.\n *\n * TC39 Signals equivalent: Signal.subtle.Watcher (effect is a userland concept)\n */\n\nimport { effect as rawEffect, getActiveSub } from 'alien-signals';\nimport {\n hasActiveRoot,\n registerDisposer,\n getOwner,\n runWithOwner,\n registerOwnerDisposer,\n createChildOwner,\n disposeOwner,\n type Owner,\n} from './root.js';\nimport { setCleanupCollector } from './cleanup.js';\nimport { reportError } from './dev.js';\n\n// ---------------------------------------------------------------------------\n// Cleanup array pool — avoids allocating a new array every effect re-run\n// ---------------------------------------------------------------------------\n\nconst POOL_SIZE = 32;\nconst MAX_REENTRANT_RUNS = 100;\nconst pool: (() => void)[][] = [];\nfor (let i = 0; i < POOL_SIZE; i++) pool.push([]);\nlet poolIdx = POOL_SIZE;\n\n// ---------------------------------------------------------------------------\n// Self-write detection — alien-signals' propagate() never notifies a subscriber\n// that is currently running, so an effect writing a signal it depends on is left\n// stale. When that happens alien-signals still sets the Pending flag on the\n// running subscriber's node (but skips the re-run). We read that flag on the\n// EFFECT's own node after each run and loop, so a self-dependent effect\n// converges. Reading the effect's own node (not a global) makes this precise:\n// writes to signals the effect does not depend on, writes from a nested computed,\n// and a nested effect's self-write never set THIS node's Pending, so they cause\n// no spurious re-run. It also works through batch() (Pending is set at flush).\n// ---------------------------------------------------------------------------\n\n// alien-signals ReactiveFlags.Pending (not exported from the package root).\nconst PENDING = 32;\n\ninterface SubNode { flags: number; }\n\nfunction acquireArray(): (() => void)[] {\n if (poolIdx > 0) {\n const arr = pool[--poolIdx]!;\n arr.length = 0;\n return arr;\n }\n return [];\n}\n\nfunction releaseArray(arr: (() => void)[]): void {\n arr.length = 0;\n if (poolIdx < POOL_SIZE) {\n pool[poolIdx++] = arr;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unified cleanup runner — single function for both re-run and dispose paths\n// ---------------------------------------------------------------------------\n\nfunction runCleanup(fn: (() => void) | undefined): void {\n if (fn === undefined) return;\n try {\n fn();\n } catch (e) {\n reportError(e, 'effect cleanup');\n }\n}\n\nfunction runCleanups(bag: (() => void)[] | undefined): void {\n if (bag === undefined) return;\n for (let i = 0; i < bag.length; i++) {\n try { bag[i]!(); } catch (e) { reportError(e, 'effect cleanup'); }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactive effect that auto-tracks signal dependencies.\n *\n * The provided function runs immediately and re-runs whenever any signal it\n * reads changes. If the function returns a cleanup function, that cleanup is\n * called before each re-run and on disposal.\n *\n * Additionally, `onCleanup()` can be called inside the effect to register\n * cleanup functions composably.\n *\n * Returns a dispose function that stops the effect.\n */\n/**\n * @internal — Lightweight effect for Forma's internal DOM bindings.\n *\n * Bypasses createEffect's cleanup infrastructure (pool, collector, error\n * reporting, engine compression) since internal effects never use\n * onCleanup() or return cleanup functions. This saves ~4 function calls\n * per effect creation and per re-run.\n *\n * ONLY use for effects that:\n * 1. Never call onCleanup()\n * 2. Never return a cleanup function\n * 3. Contain simple \"read signal → write DOM\" logic\n */\nexport function internalEffect(fn: () => void): () => void {\n const dispose = rawEffect(fn);\n if (hasActiveRoot()) {\n registerDisposer(dispose);\n }\n return dispose;\n}\n\nexport function createEffect(fn: () => void | (() => void)): () => void {\n // Capture the owner active at creation time so this effect's disposer is owned\n // by whatever created it — a root, or (for a nested effect) the parent effect's\n // current child-owner. This replaces a hasActiveRoot() snapshot so nested\n // effects created during a parent re-run (when no root is lexically active) are\n // still owned and disposed.\n const ownerAtCreate = getOwner();\n\n // This effect owns its nested effects/roots via a reusable child-owner: it is\n // disposed (nested cleanups run) at the top of each run and on disposal, then\n // reused for the next generation. One small allocation per createEffect; the\n // hot DOM path uses internalEffect, which has no child-owner.\n const childOwner: Owner = createChildOwner();\n\n // Most effects have zero or one cleanup. Track the single-cleanup case\n // without array allocation; only promote to pooled array when needed.\n let cleanup: (() => void) | undefined;\n let cleanupBag: (() => void)[] | undefined;\n let nextCleanup: (() => void) | undefined;\n let nextCleanupBag: (() => void)[] | undefined;\n\n const addCleanup = (cb: () => void) => {\n if (nextCleanupBag !== undefined) {\n nextCleanupBag.push(cb);\n return;\n }\n if (nextCleanup !== undefined) {\n const bag = acquireArray();\n bag.push(nextCleanup, cb);\n nextCleanup = undefined;\n nextCleanupBag = bag;\n return;\n }\n nextCleanup = cb;\n };\n\n const runOnce = () => {\n // Dispose the previous generation of nested effects/roots (running their\n // cleanups) FIRST — children before parents, matching wrappedDispose so the\n // teardown order is consistent between the re-run and dispose paths and a\n // nested cleanup never observes parent-owned state already freed. (alien's\n // raw unwatched teardown of a nested effect bypasses our cleanup, so we own\n // nested work explicitly.)\n disposeOwner(childOwner);\n\n // Run and clear this effect's own previous cleanups.\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n\n nextCleanup = undefined;\n nextCleanupBag = undefined;\n\n // Always install the collector so onCleanup()/returned cleanups are captured\n // on EVERY run. (The old skipCleanupInfra fast-path latched after a clean\n // first run and then silently dropped — or cross-registered — cleanups\n // registered on later runs.) The single-cleanup/pooled-array promotion below\n // keeps the zero/one-cleanup case allocation-free.\n const prevCollector = setCleanupCollector(addCleanup);\n\n try {\n // Run the body with this effect's child-owner installed so any nested\n // effects/roots it creates are owned by this generation.\n const result = runWithOwner(childOwner, fn);\n if (typeof result === 'function') {\n addCleanup(result as () => void);\n }\n // Commit this run's cleanups. When none were registered, both stay\n // undefined (allocation-free).\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else if (nextCleanup !== undefined) {\n cleanup = nextCleanup;\n }\n } catch (e) {\n reportError(e, 'effect');\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else if (nextCleanup !== undefined) {\n cleanup = nextCleanup;\n }\n } finally {\n setCleanupCollector(prevCollector);\n }\n };\n\n const safeFn = () => {\n // alien-signals sets activeSub to this effect's node for the duration of this\n // callback, so getActiveSub() is our own node. If the body writes a signal we\n // depend on, alien-signals marks this node Pending but skips the re-run; we\n // detect that and run again, bounded so a genuine cycle is reported instead of\n // hanging.\n const node = getActiveSub() as SubNode | undefined;\n let reentrantRuns = 0;\n do {\n if (node) node.flags &= ~PENDING; // clear before running so we detect a fresh set\n runOnce();\n if (node === undefined || (node.flags & PENDING) === 0) break;\n if (++reentrantRuns >= MAX_REENTRANT_RUNS) {\n node.flags &= ~PENDING;\n reportError(\n new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} self-triggered re-runs (cycle?)`),\n 'effect',\n );\n break;\n }\n } while (true);\n };\n\n const dispose = rawEffect(safeFn);\n\n // Wrap dispose to also run final cleanups\n let disposed = false;\n const wrappedDispose = () => {\n if (disposed) return;\n disposed = true;\n dispose();\n // Dispose nested effects/roots this effect owns, then run its own cleanups.\n disposeOwner(childOwner);\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n };\n\n // Register this effect's disposer with the owner active at creation (a root, or\n // a parent effect's child-owner).\n if (ownerAtCreate) {\n registerOwnerDisposer(ownerAtCreate, wrappedDispose);\n }\n\n return wrappedDispose;\n}\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\nimport { reportError } from './dev.js';\n\n/** Unique per-throw marker so alien-signals sees a value change and propagates. */\nconst ERR = Symbol('formaComputedError');\ninterface ErrBox { [ERR]: unknown; }\nfunction isErrBox(v: unknown): v is ErrBox {\n return typeof v === 'object' && v !== null && ERR in (v as object);\n}\n\n/**\n * Create a lazy, cached computed value.\n *\n * Note: Unlike SolidJS's createComputed (which is an eager synchronous\n * side effect), this is a lazy cached derivation — equivalent to\n * SolidJS's createMemo. Both createComputed and createMemo in FormaJS\n * are identical.\n *\n * The getter receives the previous value as an argument, enabling\n * efficient diffing patterns without a separate signal:\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n *\n * With previous value (for diffing):\n *\n * ```ts\n * const changes = createComputed((prev) => {\n * const next = items();\n * if (prev) console.log(`changed from ${prev.length} to ${next.length} items`);\n * return next;\n * });\n * ```\n */\nexport function createComputed<T>(fn: (previousValue?: T) => T): () => T {\n // alien-signals' updateComputed leaves a throwing computed flagged clean with a\n // stale value, so a later read silently returns the stale value and never\n // rethrows. We cache the error in closure and rethrow on read until a\n // dependency changes (TC39/Solid). On throw we return a FRESH sentinel object so\n // alien-signals sees a value change and propagates the error to subscribers; the\n // user getter only ever sees the last GOOD value as `previousValue`.\n let errored = false;\n let error: unknown;\n let lastGood: T | undefined;\n\n const raw = rawComputed<T | ErrBox>(() => {\n try {\n const v = fn(lastGood);\n errored = false;\n error = undefined;\n lastGood = v;\n return v;\n } catch (e) {\n errored = true;\n error = e;\n reportError(e, 'computed');\n return { [ERR]: e };\n }\n });\n\n const reader = () => {\n const v = raw();\n if (errored || isErrBox(v)) throw error;\n return v as T;\n };\n // Preserve alien-signals' isComputed() recognition, which keys off the bound\n // function name (`bound computedOper`). Our reader wraps the raw computed, so\n // copy the raw name onto it.\n Object.defineProperty(reader, 'name', { value: raw.name, configurable: true });\n return reader;\n}\n","/**\n * Forma Reactive - Batch\n *\n * Groups multiple signal updates and defers effect execution until the\n * outermost batch completes. Prevents intermediate re-renders.\n * Backed by alien-signals.\n *\n * TC39 Signals: no built-in batch — this is a userland optimization.\n */\n\nimport { startBatch, endBatch } from 'alien-signals';\n\n/**\n * Group multiple signal updates so that effects only run once after all\n * updates have been applied.\n *\n * ```ts\n * batch(() => {\n * setA(1);\n * setB(2);\n * // effects that depend on A and B won't run yet\n * });\n * // effects run here, once\n * ```\n *\n * Batches are nestable — only the outermost batch triggers the flush.\n */\nexport function batch(fn: () => void): void {\n startBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n}\n","/**\n * Forma DOM - List\n *\n * Keyed list reconciliation with Longest Increasing Subsequence (LIS).\n * The LIS tells us the maximum set of DOM nodes that can stay in place;\n * only the remaining nodes need to be moved. This minimises DOM operations\n * to exactly `n - LIS_length` moves — provably optimal.\n *\n * Algorithm used by ivi, Inferno, and (with variations) Solid, Vue 3, Svelte.\n *\n * Uses comment-node markers instead of a wrapper <div>, so the list can be\n * placed inside <table>, <ul>, <select>, etc. without breaking semantics.\n *\n * Total module budget: <2KB minified.\n */\n\nimport { createSignal, internalEffect, untrack, createRoot, registerDisposer, __DEV__ } from '../reactive';\nimport { hydrating } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Return value from {@link reconcileList} — the new nodes and items arrays. */\nexport interface ReconcileResult<T> {\n /** The DOM nodes currently in the list, in order. */\n nodes: Node[];\n /** The items array corresponding to the current nodes. */\n items: T[];\n}\n\n/** Animation hooks for list transitions. */\nexport interface ListTransitionHooks {\n /** Called after a new node is inserted into the DOM. */\n onInsert?: (node: Node) => void;\n /** Called before a node is removed. Call `done()` when the exit animation finishes. */\n onBeforeRemove?: (node: Node, done: () => void) => void;\n}\n\ninterface CachedItem<T> {\n element: HTMLElement;\n item: T;\n getIndex: () => number;\n setIndex: (v: number) => void;\n dispose: () => void;\n}\n\nexport interface CreateListOptions {\n /**\n * How to handle same-key items whose object identity changed.\n * - 'none' (default): keep the existing row node for maximum throughput.\n * - 'rerender': re-render changed rows and patch static row DOM in place.\n */\n updateOnItemChange?: 'none' | 'rerender';\n}\n\n// ---------------------------------------------------------------------------\n// LIS — O(n log n) via patience sorting + binary search\n// ---------------------------------------------------------------------------\n\n/**\n * Find the longest increasing subsequence.\n * Returns indices into the input array.\n * O(n log n) time, O(n) space.\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // Pre-allocate typed arrays — avoids V8 array growth overhead on push\n const tails = new Int32Array(n);\n const tailIndices = new Int32Array(n);\n const predecessor = new Int32Array(n).fill(-1);\n let tailsLen = 0;\n\n for (let i = 0; i < n; i++) {\n const val = arr[i]!;\n\n // Binary search: leftmost tail >= val\n let lo = 0, hi = tailsLen;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n tails[lo] = val;\n tailIndices[lo] = i;\n if (lo > 0) predecessor[i] = tailIndices[lo - 1]!;\n if (lo >= tailsLen) tailsLen++;\n }\n\n // Reconstruct — return plain array since callers expect number[]\n const result = new Array<number>(tailsLen);\n let idx = tailIndices[tailsLen - 1]!;\n for (let i = tailsLen - 1; i >= 0; i--) {\n result[i] = idx;\n idx = predecessor[idx]!;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// reconcileList — low-level keyed reconciler\n// ---------------------------------------------------------------------------\n\n/** Below this threshold, use flat array scan instead of Map for better cache locality. */\nconst SMALL_LIST_THRESHOLD = 32;\nconst ABORT_SYM = Symbol.for('forma-abort');\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction canPatchStaticElement(target: Node, source: Node): target is HTMLElement {\n return target instanceof HTMLElement\n && source instanceof HTMLElement\n && target.tagName === source.tagName\n && !(target as any)[ABORT_SYM]\n && !(target as any)[CACHE_SYM]\n && !(target as any)[DYNAMIC_CHILD_SYM]\n && !(source as any)[ABORT_SYM]\n && !(source as any)[CACHE_SYM]\n && !(source as any)[DYNAMIC_CHILD_SYM];\n}\n\nfunction patchStaticElement(target: HTMLElement, source: HTMLElement): void {\n // Sync attributes (events/reactive bindings are excluded by canPatchStaticElement).\n const sourceAttrNames = new Set<string>();\n for (const attr of Array.from(source.attributes)) {\n sourceAttrNames.add(attr.name);\n if (target.getAttribute(attr.name) !== attr.value) {\n target.setAttribute(attr.name, attr.value);\n }\n }\n for (const attr of Array.from(target.attributes)) {\n if (!sourceAttrNames.has(attr.name)) {\n target.removeAttribute(attr.name);\n }\n }\n\n // Move freshly rendered children into the existing keyed node.\n target.replaceChildren(...Array.from(source.childNodes));\n}\n\n/**\n * Small-list reconciler: uses flat arrays + indexOf instead of Map/Set.\n * For < 32 items, linear scan is faster than hash computation overhead.\n */\nfunction reconcileSmall<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // Build flat arrays for old keys/nodes — better cache locality than Map\n const oldKeys: (string | number)[] = new Array(oldLen);\n for (let i = 0; i < oldLen; i++) {\n oldKeys[i] = keyFn(oldItems[i]!);\n }\n\n // Classify each new item: find matching old index via linear scan\n const oldIndices = new Array<number>(newLen);\n const oldUsed = new Uint8Array(oldLen); // 0 = unused, 1 = used\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n let found = -1;\n for (let j = 0; j < oldLen; j++) {\n if (!oldUsed[j] && oldKeys[j] === key) {\n found = j;\n oldUsed[j] = 1;\n break;\n }\n }\n oldIndices[i] = found;\n }\n\n // Remove old items not reused\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // Fast path: same keys, same order -> just update, 0 DOM moves\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // LIS for minimum moves (still needed even for small lists)\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = [];\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array as a bitmap instead of Set for small lists\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // Build result: walk right-to-left for stable insertBefore targets\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n/**\n * Reconcile a DOM parent's children to match a new array of items.\n * Uses keyed reconciliation with LIS for minimum DOM operations.\n *\n * For small lists (< 32 items), uses a flat array scan path that avoids\n * Map/Set hash overhead and provides better cache locality.\n *\n * @param parent - The container DOM element\n * @param oldItems - Previous array (from last reconciliation)\n * @param newItems - New array to render\n * @param oldNodes - Previous DOM nodes array\n * @param keyFn - Extracts a unique key from each item\n * @param createFn - Creates a new DOM node for an item\n * @param updateFn - Updates an existing DOM node with new item data\n * @param beforeNode - Optional boundary marker. When provided, new nodes are\n * inserted before this node instead of appended to parent.\n * This allows the reconciler to operate within a range\n * delimited by comment markers.\n * @returns Object with new nodes array and items array for next call\n */\nexport function reconcileList<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // --- Trivial: new is empty -> remove all ---\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n return { nodes: [], items: [] };\n }\n\n // --- Trivial: old is empty -> create all ---\n if (oldLen === 0) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = createFn(newItems[i]!);\n if (beforeNode) {\n parent.insertBefore(node, beforeNode);\n } else {\n parent.appendChild(node);\n }\n hooks?.onInsert?.(node);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n\n // --- Small list path: flat array scan, no Map/Set overhead ---\n if (oldLen < SMALL_LIST_THRESHOLD) {\n return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);\n }\n\n // --- Large list path: Map-based approach ---\n const oldKeyMap = new Map<string | number, number>();\n for (let i = 0; i < oldLen; i++) {\n oldKeyMap.set(keyFn(oldItems[i]!), i);\n }\n\n // --- Classify each new item: reuse or create ---\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const oldIndices = new Array<number>(newLen); // -1 means new item\n const oldUsed = new Uint8Array(oldLen);\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldIndices[i] = oldIdx;\n oldUsed[oldIdx] = 1;\n } else {\n oldIndices[i] = -1;\n }\n }\n\n // --- Remove old items not in new array ---\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // --- Fast path: same keys, same order -> just update, 0 DOM moves ---\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // --- Find LIS of old indices (reused items only) ---\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = []; // position in new array\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // --- Build result: walk right-to-left for stable insertBefore targets ---\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n // NEW: create and insert\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n // REUSE: update content\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n // LIS item: already in correct relative position, don't move\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n // Insert/move into position\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n// ---------------------------------------------------------------------------\n// createList — high-level reactive API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactively-bound list of DOM elements with keyed reconciliation.\n *\n * Returns a `DocumentFragment` containing two comment markers\n * (`<!--forma-list-start-->` and `<!--forma-list-end-->`) that delimit the\n * list's range in the DOM. All managed elements live between these markers.\n *\n * This avoids a wrapper `<div>` which would break `<table>`, `<ul>`,\n * `<select>` semantics and pollute the DOM.\n *\n * When the `items` signal changes, only the minimal set of DOM mutations is\n * performed using the LIS algorithm:\n * - New keys: create elements via `renderFn`\n * - Removed keys: remove elements from DOM\n * - Moved keys: reorder elements using minimum moves (n - LIS)\n * - Same keys: keep row nodes and update index signals\n * (or re-render row content when `updateOnItemChange: 'rerender'`)\n *\n * @param items Signal getter returning the current array of items.\n * @param keyFn Extracts a unique key from each item.\n * @param renderFn Renders a single item. Receives the item and a reactive index getter.\n * @returns A DocumentFragment to insert into the DOM. The fragment includes\n * start/end comment markers and any initial list items.\n *\n * ```ts\n * const frag = createList(\n * todos,\n * (t) => t.id,\n * (todo, index) => h('li', null, () => `${index() + 1}. ${todo.text}`),\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createList<T>(\n items: () => T[],\n keyFn: (item: T) => string | number,\n renderFn: (item: T, index: () => number) => HTMLElement,\n options?: CreateListOptions,\n): DocumentFragment {\n if (hydrating) {\n return { type: 'list', items, keyFn, renderFn, options } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-list-start');\n const endMarker = document.createComment('forma-list-end');\n\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Cache: key -> { element, item, setIndex }\n let cache = new Map<string | number, CachedItem<T>>();\n let currentNodes: Node[] = [];\n let currentItems: T[] = [];\n const updateOnItemChange = options?.updateOnItemChange ?? 'none';\n\n internalEffect(() => {\n const newItems = items();\n\n // The parent is discovered lazily: once the fragment has been inserted\n // into the live DOM the markers have a parentNode.\n const parent = startMarker.parentNode;\n if (!parent) {\n // Markers are not yet in the DOM — nothing to reconcile.\n // This can happen if the effect fires synchronously before mount.\n return;\n }\n\n // Edge case: non-array\n if (!Array.isArray(newItems)) {\n if (__DEV__) {\n console.warn('[forma] createList: value is not an array, treating as empty');\n }\n // Remove all nodes between the markers\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node);\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n return;\n }\n\n // Filter nullish items — avoid array allocation when no nulls found (common case)\n let cleanItems: T[] = newItems;\n for (let i = 0; i < newItems.length; i++) {\n if (newItems[i] == null) {\n cleanItems = newItems.filter(item => item != null);\n break;\n }\n }\n\n // Dev-mode duplicate key detection\n if (__DEV__) {\n const seen = new Set<string | number>();\n for (const item of cleanItems) {\n const key = keyFn(item);\n if (seen.has(key)) {\n console.warn('[forma] createList: duplicate key detected:', key);\n }\n seen.add(key);\n }\n }\n\n const updateRow = updateOnItemChange === 'rerender'\n ? (node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (!cached) return;\n if (cached.item === item) return;\n cached.item = item;\n\n if (!(node instanceof HTMLElement)) return;\n if ((node as any)[ABORT_SYM] || (node as any)[CACHE_SYM] || (node as any)[DYNAMIC_CHILD_SYM]) {\n return;\n }\n\n const next = untrack(() => renderFn(item, cached.getIndex));\n if (canPatchStaticElement(node, next)) {\n patchStaticElement(node, next);\n cached.element = node;\n }\n }\n : (_node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n };\n\n const oldCache = cache;\n\n const result = reconcileList<T>(\n parent,\n currentItems,\n cleanItems,\n currentNodes,\n keyFn,\n // createFn: create element + cache entry.\n // Each item is rendered inside createRoot + untrack so that inner\n // effects are owned by the item's root (not the parent), and are\n // disposed when the item is removed from the list.\n (item) => {\n const key = keyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n let itemDispose!: () => void;\n const element = createRoot((dispose) => {\n itemDispose = dispose;\n return untrack(() => renderFn(item, getIndex));\n });\n cache.set(key, { element, item, getIndex, setIndex, dispose: itemDispose });\n return element;\n },\n updateRow,\n // beforeNode: insert items before the end marker\n endMarker,\n );\n\n // Rebuild cache + update index signals in a single pass.\n // Avoids .map() array allocation + Set construction from the previous approach.\n const newCache = new Map<string | number, CachedItem<T>>();\n for (let i = 0; i < cleanItems.length; i++) {\n const key = keyFn(cleanItems[i]!);\n const cached = oldCache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n\n // Dispose removed items' reactive roots\n for (const [key, cached] of oldCache) {\n if (!newCache.has(key)) {\n cached.dispose();\n }\n }\n\n cache = newCache;\n\n currentNodes = result.nodes;\n currentItems = result.items;\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached item roots and clear references. Item roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const cached of cache.values()) {\n cached.dispose();\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n });\n\n return fragment;\n}\n","/**\n * Forma Reconciler — DOM diffing and patching engine.\n *\n * Replaces morphdom with a purpose-built reconciler that understands\n * Forma's directive system (data-forma-state, data-list, data-if, etc.).\n *\n * Usage:\n * const rec = createReconciler({ mountScope, unmountScope, ... });\n * rec(container, htmlString);\n *\n * Scope modes for data-forma-state elements matched by data-forma-id:\n * PRESERVE — same data-module + same state shape → patch attrs, keep bindings\n * RESET — same data-module + different state shape → unmount, patch, remount\n * REPLACE — different data-module → remove old, insert new, mount fresh\n */\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface ReconcilerConfig {\n mountScope: (el: Element) => void;\n unmountScope: (el: Element) => void;\n disconnectObserver: () => void;\n reconnectObserver: () => void;\n batch: (fn: () => void) => void;\n}\n\ntype ScopeMode = 'PRESERVE' | 'RESET' | 'REPLACE';\n\n// ── Attribute helpers ─────────────────────────────────────────────────\n\n/** Check if an element has data-bind:X targeting a specific attribute */\nfunction getBindTargets(el: Element): Set<string> {\n const targets = new Set<string>();\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const name = attrs[i]!.name;\n if (name.startsWith('data-bind:')) {\n targets.add(name.slice(10));\n }\n }\n return targets;\n}\n\n/** Check if an element owns its subtree (data-list or data-if) */\nfunction ownsSubtree(el: Element): boolean {\n return el.hasAttribute('data-list') || el.hasAttribute('data-if');\n}\n\n// ── State shape comparison ────────────────────────────────────────────\n\nfunction getStateKeys(json: string): string[] {\n try {\n const obj = JSON.parse(json);\n return Object.keys(obj).sort();\n } catch {\n return [];\n }\n}\n\nfunction sameShape(keysA: string[], keysB: string[]): boolean {\n if (keysA.length !== keysB.length) return false;\n for (let i = 0; i < keysA.length; i++) {\n if (keysA[i] !== keysB[i]) return false;\n }\n return true;\n}\n\n// ── Scope mode determination ──────────────────────────────────────────\n\nfunction determineScopeMode(liveEl: Element, newEl: Element): ScopeMode {\n const liveModule = liveEl.getAttribute('data-module');\n const newModule = newEl.getAttribute('data-module');\n\n if (liveModule !== newModule) return 'REPLACE';\n\n // Compare state shape: use __formaInitialState (set at mount time) for the\n // live element, and the raw attribute for the new element.\n const liveInitialState = (liveEl as any).__formaInitialState as string | undefined;\n const liveStateJSON = liveInitialState ?? liveEl.getAttribute('data-forma-state') ?? '{}';\n const newStateJSON = newEl.getAttribute('data-forma-state') ?? '{}';\n\n const liveKeys = getStateKeys(liveStateJSON);\n const newKeys = getStateKeys(newStateJSON);\n\n if (sameShape(liveKeys, newKeys)) return 'PRESERVE';\n return 'RESET';\n}\n\n// ── HTML parsing ──────────────────────────────────────────────────────\n\n/** Reused template element — avoids creating a new one per reconcile call. */\nlet _parseTemplate: HTMLTemplateElement | null = null;\n\nfunction parseHTML(html: string): DocumentFragment {\n if (!_parseTemplate) _parseTemplate = document.createElement('template');\n _parseTemplate.innerHTML = html;\n // content is consumed (moved) by the caller, so template is empty after\n return _parseTemplate.content;\n}\n\n// ── Attribute patching ────────────────────────────────────────────────\n\nfunction patchAttributes(liveEl: Element, newEl: Element): void {\n const bindTargets = getBindTargets(liveEl);\n const hasDataShow = liveEl.hasAttribute('data-show');\n const hasDataModel = liveEl.hasAttribute('data-model');\n\n // Check for class directives without Array.from allocation\n let liveHasClassDirectives = false;\n const liveAttrs = liveEl.attributes;\n for (let i = 0; i < liveAttrs.length; i++) {\n if (liveAttrs[i]!.name.startsWith('data-class:')) {\n liveHasClassDirectives = true;\n break;\n }\n }\n\n // Set/update attributes from newEl\n const newAttrs = newEl.attributes;\n for (let i = 0; i < newAttrs.length; i++) {\n const attr = newAttrs[i]!;\n // Skip directive-owned attributes\n if (attr.name === 'style' && hasDataShow) continue;\n if (attr.name === 'class' && liveHasClassDirectives) continue;\n if ((attr.name === 'value' || attr.name === 'checked') && hasDataModel) continue;\n if (bindTargets.has(attr.name)) continue;\n\n const liveVal = liveEl.getAttribute(attr.name);\n if (liveVal !== attr.value) {\n liveEl.setAttribute(attr.name, attr.value);\n }\n }\n\n // Remove attributes that are no longer present in newEl\n // Iterate backwards since removeAttribute shifts indices\n for (let i = liveAttrs.length - 1; i >= 0; i--) {\n const attr = liveAttrs[i]!;\n if (!newEl.hasAttribute(attr.name)) {\n if (attr.name === 'style' && hasDataShow) continue;\n if (attr.name === 'class' && liveHasClassDirectives) continue;\n if ((attr.name === 'value' || attr.name === 'checked') && hasDataModel) continue;\n if (bindTargets.has(attr.name)) continue;\n\n liveEl.removeAttribute(attr.name);\n }\n }\n}\n\n// ── Text node patching ────────────────────────────────────────────────\n\nfunction patchTextNodes(liveEl: Element, newEl: Element): void {\n // data-text directive owns this element's text content — don't overwrite\n if (liveEl.hasAttribute('data-text')) return;\n\n const liveTexts: Text[] = [];\n const newTexts: { node: Text; index: number }[] = [];\n\n for (const child of Array.from(liveEl.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) liveTexts.push(child as Text);\n }\n for (let i = 0; i < newEl.childNodes.length; i++) {\n const child = newEl.childNodes[i];\n if (child.nodeType === Node.TEXT_NODE) newTexts.push({ node: child as Text, index: i });\n }\n\n // Fast path: same count, just patch content\n if (liveTexts.length === newTexts.length) {\n for (let i = 0; i < liveTexts.length; i++) {\n if (liveTexts[i].textContent !== newTexts[i].node.textContent) {\n liveTexts[i].textContent = newTexts[i].node.textContent;\n }\n }\n return;\n }\n\n // Count mismatch: reuse live text nodes in order, insert/remove as needed\n const usedLive = new Set<Text>();\n let liveIdx = 0;\n\n for (const { node: newText, index: newChildIdx } of newTexts) {\n if (liveIdx < liveTexts.length) {\n // Reuse existing text node\n const liveText = liveTexts[liveIdx]!;\n liveIdx++;\n usedLive.add(liveText);\n if (liveText.textContent !== newText.textContent) {\n liveText.textContent = newText.textContent;\n }\n } else {\n // Insert new text node at correct position\n const ref = findTextInsertionRef(liveEl, newEl, newChildIdx);\n liveEl.insertBefore(document.createTextNode(newText.textContent ?? ''), ref);\n }\n }\n\n // Remove unused live text nodes\n for (const lt of liveTexts) {\n if (!usedLive.has(lt) && lt.parentNode === liveEl) {\n liveEl.removeChild(lt);\n }\n }\n}\n\n/** Find the insertion reference node for a text node being inserted into liveEl. */\nfunction findTextInsertionRef(liveEl: Element, newEl: Element, newIdx: number): Node | null {\n for (let j = newIdx + 1; j < newEl.childNodes.length; j++) {\n const sibling = newEl.childNodes[j];\n if (sibling.nodeType === Node.ELEMENT_NODE) {\n const key = (sibling as Element).getAttribute('data-forma-id');\n if (key) {\n const match = liveEl.querySelector(`[data-forma-id=\"${CSS.escape(key)}\"]`);\n if (match && match.parentElement === liveEl) return match;\n }\n }\n }\n return null;\n}\n\n// ── Recursive element diffing ─────────────────────────────────────────\n\nfunction diffChildren(\n liveParent: Element,\n newParent: Element,\n config: ReconcilerConfig,\n): void {\n // Skip directive-owned subtrees\n if (ownsSubtree(liveParent)) return;\n\n // Patch text nodes at this level\n patchTextNodes(liveParent, newParent);\n\n // Collect child elements (ignore text nodes for structural diff)\n const liveChildren = Array.from(liveParent.children);\n const newChildren = Array.from(newParent.children);\n\n // Build keyed maps for data-forma-id elements\n const liveKeyed = new Map<string, Element>();\n const liveUnkeyed: Element[] = [];\n for (const child of liveChildren) {\n if (child.hasAttribute('data-forma-leaving')) continue;\n const key = child.getAttribute('data-forma-id');\n if (key) {\n liveKeyed.set(key, child);\n } else {\n liveUnkeyed.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n\n // Walk new children in order\n const usedLiveElements = new Set<Element>();\n\n for (const newChild of newChildren) {\n const key = newChild.getAttribute('data-forma-id');\n let liveMatch: Element | undefined;\n\n if (key) {\n liveMatch = liveKeyed.get(key);\n } else {\n // Match unkeyed elements by position and tag\n while (unkeyedIdx < liveUnkeyed.length) {\n const candidate = liveUnkeyed[unkeyedIdx];\n unkeyedIdx++;\n if (candidate.tagName === newChild.tagName && !usedLiveElements.has(candidate)) {\n liveMatch = candidate;\n break;\n }\n }\n }\n\n if (liveMatch) {\n usedLiveElements.add(liveMatch);\n\n // Check if this is a data-forma-state scope element\n if (liveMatch.hasAttribute('data-forma-state') && newChild.hasAttribute('data-forma-state')) {\n const mode = determineScopeMode(liveMatch, newChild);\n\n switch (mode) {\n case 'PRESERVE':\n // Patch attributes only, keep reactive bindings alive\n patchAttributes(liveMatch, newChild);\n // Recurse into non-directive-owned children\n diffChildren(liveMatch, newChild, config);\n break;\n\n case 'RESET':\n // Unmount old scope, patch DOM, mount fresh\n config.unmountScope(liveMatch);\n patchAttributes(liveMatch, newChild);\n // Replace inner content\n replaceInnerContent(liveMatch, newChild);\n config.mountScope(liveMatch);\n break;\n\n case 'REPLACE': {\n // Full element swap\n config.unmountScope(liveMatch);\n const replacement = newChild.cloneNode(true) as Element;\n liveParent.replaceChild(replacement, liveMatch);\n config.mountScope(replacement);\n usedLiveElements.delete(liveMatch);\n liveMatch = replacement;\n usedLiveElements.add(replacement);\n break;\n }\n }\n } else {\n // Non-scope element: patch attrs and recurse\n patchAttributes(liveMatch, newChild);\n diffChildren(liveMatch, newChild, config);\n }\n\n // Ensure element is in the correct position\n // Find where it should be relative to previousSibling\n ensurePosition(liveParent, liveMatch, newChild, newChildren);\n } else {\n // New element — insert it\n const clone = newChild.cloneNode(true) as Element;\n // Find insertion point\n const insertionRef = findInsertionPoint(liveParent, newChild, newChildren);\n liveParent.insertBefore(clone, insertionRef);\n usedLiveElements.add(clone);\n\n // Mount any scopes in the new element\n if (clone.hasAttribute('data-forma-state')) {\n config.mountScope(clone);\n }\n const nestedScopes = clone.querySelectorAll('[data-forma-state]');\n for (const nested of Array.from(nestedScopes)) {\n config.mountScope(nested);\n }\n }\n }\n\n // Remove live children that are no longer in new children\n for (const child of liveChildren) {\n if (!usedLiveElements.has(child)) {\n // Guard: element may already be detached (e.g. after REPLACE)\n if (child.parentElement !== liveParent) continue;\n // Guard: element is mid-leave transition — its transition will remove it\n if (child.hasAttribute('data-forma-leaving')) continue;\n // Unmount any scopes\n if (child.hasAttribute('data-forma-state')) {\n config.unmountScope(child);\n }\n const nestedScopes = child.querySelectorAll('[data-forma-state]');\n for (const nested of Array.from(nestedScopes)) {\n config.unmountScope(nested);\n }\n liveParent.removeChild(child);\n }\n }\n}\n\n/** Replace inner content of live element with content from new element */\nfunction replaceInnerContent(liveEl: Element, newEl: Element): void {\n // Remove all children\n while (liveEl.firstChild) {\n liveEl.removeChild(liveEl.firstChild);\n }\n // Clone and append all children from new element\n for (const child of Array.from(newEl.childNodes)) {\n liveEl.appendChild(child.cloneNode(true));\n }\n}\n\n/** Ensure a live element is at the correct position */\nfunction ensurePosition(\n parent: Element,\n liveEl: Element,\n _newEl: Element,\n newChildren: Element[],\n): void {\n const newIdx = newChildren.indexOf(_newEl);\n const liveChildElements = Array.from(parent.children);\n const currentIdx = liveChildElements.indexOf(liveEl);\n\n if (currentIdx !== newIdx) {\n // Find the element that should come after this one\n const nextNewChild = newChildren[newIdx + 1];\n if (nextNewChild) {\n const nextKey = nextNewChild.getAttribute('data-forma-id');\n if (nextKey) {\n // Find this element in live DOM\n const nextLive = parent.querySelector(`[data-forma-id=\"${CSS.escape(nextKey)}\"]`);\n if (nextLive && nextLive.parentElement === parent) {\n parent.insertBefore(liveEl, nextLive);\n return;\n }\n }\n }\n // Append to end\n parent.appendChild(liveEl);\n }\n}\n\n/** Find the correct insertion point for a new element */\nfunction findInsertionPoint(\n parent: Element,\n newChild: Element,\n newChildren: Element[],\n): Node | null {\n const newIdx = newChildren.indexOf(newChild);\n\n // Look for the next sibling in the new children that exists in the live DOM\n for (let i = newIdx + 1; i < newChildren.length; i++) {\n const key = newChildren[i].getAttribute('data-forma-id');\n if (key) {\n const existing = parent.querySelector(`[data-forma-id=\"${CSS.escape(key)}\"]`);\n if (existing && existing.parentElement === parent) {\n return existing;\n }\n }\n }\n\n return null; // Append to end\n}\n\n// ── Factory ───────────────────────────────────────────────────────────\n\nexport function createReconciler(config: ReconcilerConfig) {\n /** Last HTML string that was successfully reconciled into this container.\n * Used to skip reconciliation when the HTML hasn't changed. */\n let _lastHtml = '';\n\n return function reconcile(container: Element, html: string): void {\n const trimmed = html.trim();\n if (!trimmed) return;\n\n // Fast path: skip reconciliation entirely when HTML is identical\n if (trimmed === _lastHtml && container.hasChildNodes()) return;\n _lastHtml = trimmed;\n\n // Disconnect observer to prevent double-mount during patching\n config.disconnectObserver();\n\n try {\n // ── Fast path: empty container ──\n if (!container.hasChildNodes() || container.children.length === 0) {\n container.innerHTML = trimmed;\n\n // Mount all data-forma-state scopes\n config.batch(() => {\n const scopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(scopes)) {\n config.mountScope(scope);\n }\n });\n\n return;\n }\n\n // ── Parse new HTML into a DocumentFragment ──\n const fragment = parseHTML(trimmed);\n const templateContainer = document.createElement('div');\n templateContainer.appendChild(fragment);\n\n // ── Full-replacement fast path ──\n // When there is zero data-forma-id overlap between live and new children,\n // skip the diff entirely — dispose all live scopes, innerHTML, mount fresh.\n // This handles module-switch scenarios cleanly and avoids issues with\n // corrupted HTML confusing the diff.\n const liveKeys = new Set<string>();\n for (const child of Array.from(container.children)) {\n if (child.hasAttribute('data-forma-leaving')) continue;\n const key = child.getAttribute('data-forma-id');\n if (key) liveKeys.add(key);\n }\n let hasOverlap = false;\n if (liveKeys.size > 0) {\n for (const child of Array.from(templateContainer.children)) {\n const key = child.getAttribute('data-forma-id');\n if (key && liveKeys.has(key)) { hasOverlap = true; break; }\n }\n }\n\n if (liveKeys.size > 0 && !hasOverlap) {\n // Full replacement: unmount all live scopes, replace content, mount new\n config.batch(() => {\n const liveScopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(liveScopes)) {\n config.unmountScope(scope);\n }\n container.innerHTML = trimmed;\n const newScopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(newScopes)) {\n config.mountScope(scope);\n }\n });\n return;\n }\n\n // ── Diff and patch ──\n config.batch(() => {\n diffChildren(container, templateContainer, config);\n });\n } finally {\n // Always reconnect observer, even if an error occurred\n config.reconnectObserver();\n }\n };\n}\n","/**\n * URL / attribute safety helpers shared by the SSR renderer (`src/ssr`) and the\n * DOM runtime (`src/runtime.ts`).\n *\n * The subtle part is scheme detection. Browsers strip ASCII whitespace and C0\n * control characters out of a URL before resolving its scheme, so\n * `java\\tscript:alert(1)`, `javas\\ncript:...` and `\\x01javascript:...` all\n * execute even though a naive `/^javascript:/` test does not match them. We\n * normalize the value the same way the browser does *before* testing.\n *\n * This module has no dependencies so it can be pulled into every build variant\n * (standard, hardened/CSP, SSR) cheaply.\n */\n\n// C0 controls + space (0x00-0x20), DEL and C1 controls (0x7F-0x9F). These are\n// exactly the bytes a URL parser ignores/strips when reading the scheme.\nconst URL_IGNORED_CHARS_RE = /[\\u0000-\\u0020\\u007F-\\u009F]/g;\n\n// Schemes that can execute script or smuggle an active HTML document.\n// Kept intentionally narrow to avoid blocking legitimate `data:image/*` inline\n// assets; `data:image/svg+xml` in a navigable context is handled separately.\nconst DANGEROUS_SCHEME_RE = /^(?:javascript|vbscript|data:text\\/html)/i;\n\n/** Attributes whose values are resolved as URLs and must be scheme-checked. */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'poster',\n 'background',\n]);\n\n/** True if `name` is a URL-bearing attribute (case-insensitive). */\nexport function isUrlAttr(name: string): boolean {\n return URL_ATTRS.has(name.toLowerCase());\n}\n\n/**\n * True if `value` uses a scheme that can execute script, after normalizing away\n * the whitespace and control characters that browsers ignore in a URL scheme.\n */\nexport function isDangerousUrl(value: string): boolean {\n const normalized = value.replace(URL_IGNORED_CHARS_RE, '');\n return DANGEROUS_SCHEME_RE.test(normalized);\n}\n\n/** True for any `on…` event-handler attribute name (case-insensitive). */\nexport function isEventHandlerAttr(name: string): boolean {\n return /^on/i.test(name);\n}\n\n// A well-formed HTML attribute name: starts with a letter/`_`/`:`, followed by\n// letters, digits, `-`, `_`, `:` or `.`. Rejects whitespace, `=`, quotes and\n// `/`, which is what an attacker needs to break out and inject a new attribute.\nconst SAFE_ATTR_NAME_RE = /^[A-Za-z_:][-A-Za-z0-9_:.]*$/;\n\n/** True if `name` is safe to emit verbatim as an attribute name. */\nexport function isSafeAttrName(name: string): boolean {\n return SAFE_ATTR_NAME_RE.test(name);\n}\n","/**\n * FormaJS HTML Runtime\n *\n * Declarative reactive UI via data-* attributes, powered by fine-grained\n * signals (alien-signals 3.x). Combined into a single, CSP-safe runtime\n * with zero build step required.\n *\n * Design inspirations:\n * Alpine.js — data-* directive model, progressive enhancement\n * SolidJS — fine-grained signals, [getter, setter] tuple, real DOM\n * Qwik — deferred hydration triggers (idle, interaction, visible)\n * Astro — islands architecture, independent interactive regions\n * Hotwire — server-driven UI, reconciler with scope modes\n * Lit — root element access during hydration, (el, props) pattern\n *\n * ┌─────────────────────────────────────────────────────────────────────┐\n * │ Yes, this file is ~3,300 lines. It's a monolith on purpose. │\n * │ │\n * │ The HTML Runtime is a self-contained unit: expression parser, │\n * │ handler compiler, transition system, DOM scanner, and observer │\n * │ all share mutable state (debug flags, caches, eval mode). Keeping │\n * │ them in one file avoids circular imports, simplifies the build │\n * │ (single IIFE for CDN), and means `grep` always finds what you │\n * │ need. The sections are clearly marked — use the map below. │\n * │ │\n * │ Will it be split someday? Maybe. But today it works, it's tested │\n * │ and the CDN runtime bundle ships at ~24KB gzipped. If you're │\n * │ judging the line count — fair. But read the code first. :) │\n * └─────────────────────────────────────────────────────────────────────┘\n *\n * This file is the HTML Runtime — a subpath of @getforma/core:\n * import '@getforma/core/runtime' (ESM)\n * <script src=\"...runtime.global.js\"> (CDN)\n *\n * It is separate from the main @getforma/core entry point, which exports\n * signals, h(), mount, stores, etc. The main entry has zero network code.\n * HTTP/storage/server are at @getforma/core/http, /storage, /server.\n *\n * Usage (CDN):\n * <script src=\"https://unpkg.com/@getforma/core@1.0.1/dist/formajs-runtime.global.js\"></script>\n * <div data-forma-state='{\"count\": 0}'>\n * <p data-text=\"{count}\"></p>\n * <button data-on:click=\"{count++}\">+1</button>\n * </div>\n *\n * Build outputs from this source file:\n * dist/runtime.js ESM (import '@getforma/core/runtime')\n * dist/runtime.cjs CommonJS (require)\n * dist/formajs-runtime.global.js IIFE for <script> tags (auto-inits)\n * dist/runtime-hardened.js ESM, unsafe-eval locked off (zero new Function)\n * dist/formajs-runtime-hardened.global.js IIFE, unsafe-eval locked off (zero new Function)\n *\n * ── FILE MAP ──────────────────────────────────────────────────────────\n *\n * Line ~31-71 Core types & scope (Getter, Setter, Scope, createChildScope)\n * Line ~73-253 Configuration & diagnostics (debug, CSP modes, containment)\n * Line ~254-344 Performance utilities (yieldToMain, containment hints)\n * Line ~346-534 Regexes, caches, security blocklist (findBlockedMethod)\n * Line ~536-923 Parsing utilities (splitCallArgs, readBalancedSegment, if-handler)\n * Line ~925-1049 Template compilation (data-list templates)\n * Line ~1051-1396 CSS Transitions (parse, run, enter/leave phases)\n * Line ~1398-1809 CSP-safe expression parser (chained access, operators, literals)\n * Line ~1811-2091 Evaluator & handler builder (CSP path + new Function fallback)\n * Line ~2093-2184 State initialization & safe $el proxy\n * Line ~2186-2682 bindElement() — the central directive processor\n * Line ~2684-2952 MutationObserver, directive map, mountScope/unmountScope\n * Line ~2954-3064 Init/destroy, mount/unmount, public API setters\n * Line ~3066-3188 DevTools API, reconciler bridge, exports\n *\n * ── SUPPORTED DIRECTIVES ──────────────────────────────────────────────\n *\n * State & Reactivity:\n * data-forma-state='{\"key\": val}' Declare reactive state (valid JSON)\n * data-computed=\"name = expr\" Derived value (lazy, cached)\n * data-persist=\"{prop}\" Sync state to localStorage\n *\n * Content Binding:\n * data-text=\"{expr}\" Bind text content\n * data-show=\"{expr}\" Toggle visibility (display: none)\n * data-if=\"{expr}\" Conditional render (remove/insert DOM)\n * data-model=\"{prop}\" Two-way input binding\n * data-list=\"{expr}\" List rendering (keyed reconciliation)\n *\n * Attributes & Classes:\n * data-on:event=\"{expr}\" Event handler (e.g. data-on:click)\n * data-class:name=\"{expr}\" Conditional CSS class\n * data-bind:attr=\"{expr}\" Dynamic attribute binding\n *\n * Transitions (for data-show and data-if):\n * data-transition:enter=\"classes\" Classes during enter phase\n * data-transition:enter-from=\"classes\" Classes at enter start\n * data-transition:enter-to=\"classes\" Classes at enter end\n * data-transition:leave=\"classes\" Classes during leave phase\n * data-transition:leave-from=\"classes\" Classes at leave start\n * data-transition:leave-to=\"classes\" Classes at leave end\n *\n * Refs:\n * data-ref=\"name\" Register element for $refs.name access\n *\n * Data Fetching:\n * data-fetch=\"GET /url → prop\" Fetch data into state\n * data-fetch=\"POST /url → prop\" POST with state as body\n * data-fetch-id=\"name\" Register for $refetch('name')\n *\n * Configuration (on <script> tag):\n * data-forma-unsafe-eval=\"true\" Enable new Function() fallback\n * data-forma-diagnostics=\"true\" Enable expression diagnostics\n * data-forma-auto-containment=\"true\" Enable CSS containment hints\n *\n * ── MAGIC VARIABLES ──────────────────────────────────────────────────\n *\n * Available in all expressions and handlers:\n * $el The current DOM element (safe proxy — see createSafeElProxy)\n * $dispatch Fire a CustomEvent: $dispatch('name', detail?)\n * Events bubble and cross Shadow DOM (composed: true)\n * $event The DOM event object (in data-on:* handlers only)\n * event Alias for $event (also in data-on:* handlers)\n * $refs Named element references: $refs.myInput (via data-ref=\"myInput\")\n * $refetch Re-trigger a data-fetch: $refetch('fetch-id')\n */\nimport { createSignal, internalEffect, createComputed, batch } from './reactive';\nimport { reconcileList, type ListTransitionHooks } from './dom/list';\nimport { createReconciler } from './dom/reconcile';\nimport { isDangerousUrl, isUrlAttr, isEventHandlerAttr } from './security/url-safety';\n\n/**\n * True if writing `value` to attribute `name` via setAttribute would create an\n * XSS sink: an `on*` inline event handler, or a URL attribute carrying a\n * script-executing scheme. Shared by data-bind:* and list-template binding.\n */\nfunction isUnsafeAttrBinding(name: string, value: string): boolean {\n if (isEventHandlerAttr(name)) return true;\n if (isUrlAttr(name) && isDangerousUrl(value)) return true;\n return false;\n}\n\ntype Getter = () => unknown;\ntype Setter = (v: unknown) => void;\n\ninterface Scope {\n getters: Record<string, Getter>;\n setters: Record<string, Setter>;\n}\n\n// ── $refetch registry ──\n// Maps data-fetch-id values to their doFetch() functions so handlers can\n// trigger imperative refetches via $refetch('id').\nconst _refetchRegistry = new Map<string, () => void>();\n\nfunction $refetch(id: string): void {\n const fn = _refetchRegistry.get(id);\n if (fn) {\n fn();\n } else if (_debug) {\n dbg(`$refetch: no data-fetch with id \"${id}\" found`);\n }\n}\n\nfunction createChildScope(parent: Scope, locals: Record<string, unknown>): Scope {\n const localGetters: Record<string, Getter> = Object.create(null);\n for (const key of Object.keys(locals)) {\n localGetters[key] = () => locals[key];\n }\n\n return {\n getters: new Proxy(parent.getters, {\n get(target, prop: string) {\n if (prop in localGetters) return localGetters[prop];\n return target[prop];\n },\n has(target, prop: string) {\n return prop in localGetters || prop in target;\n },\n }),\n setters: parent.setters,\n };\n}\n\n// ── Debug logger — enable via FormaRuntime.debug = true or window.__FORMA_DEBUG = true ──\nlet _debug = false;\ntype UnsafeEvalMode = 'mutable' | 'locked-off' | 'locked-on';\nlet _unsafeEvalMode: UnsafeEvalMode = 'mutable';\nlet _allowUnsafeEval = false;\nlet _diagnosticsEnabled = true;\nfunction dbg(...args: unknown[]): void {\n if (_debug || (typeof window !== 'undefined' && (window as any).__FORMA_DEBUG)) {\n console.log('[FormaJS]', ...args);\n }\n}\n\ninterface RuntimeConfig {\n allowUnsafeEval?: boolean;\n unsafeEvalMode?: UnsafeEvalMode;\n lockUnsafeEval?: boolean;\n diagnostics?: boolean;\n autoContainment?: boolean;\n}\n\ninterface RuntimeDiagnostic {\n kind: 'handler-unsupported' | 'expression-unsupported';\n expr: string;\n reason: string;\n count: number;\n firstSeenAt: number;\n lastSeenAt: number;\n}\n\nconst diagnostics = new Map<string, RuntimeDiagnostic>();\n\nfunction parseBooleanFlag(raw: string | null | undefined): boolean | undefined {\n if (raw == null) return undefined;\n const normalized = raw.trim().toLowerCase();\n if (normalized === '1' || normalized === 'true' || normalized === 'on' || normalized === 'yes') return true;\n if (normalized === '0' || normalized === 'false' || normalized === 'off' || normalized === 'no') return false;\n return undefined;\n}\n\nfunction parseUnsafeEvalMode(raw: string | null | undefined): UnsafeEvalMode | undefined {\n if (raw == null) return undefined;\n const normalized = raw.trim().toLowerCase();\n if (normalized === 'mutable') return 'mutable';\n if (normalized === 'locked-off' || normalized === 'off' || normalized === 'disabled') {\n return 'locked-off';\n }\n if (normalized === 'locked-on' || normalized === 'on' || normalized === 'enabled') {\n return 'locked-on';\n }\n return undefined;\n}\n\nfunction readRuntimeConfig(): RuntimeConfig {\n const config: RuntimeConfig = {};\n\n if (typeof window !== 'undefined') {\n const globalConfig = (window as any).__FORMA_RUNTIME_CONFIG as RuntimeConfig | undefined;\n if (globalConfig) {\n if (typeof globalConfig.allowUnsafeEval === 'boolean') {\n config.allowUnsafeEval = globalConfig.allowUnsafeEval;\n }\n if (typeof globalConfig.unsafeEvalMode === 'string') {\n const parsed = parseUnsafeEvalMode(globalConfig.unsafeEvalMode);\n if (parsed) config.unsafeEvalMode = parsed;\n }\n if (typeof globalConfig.lockUnsafeEval === 'boolean') {\n config.lockUnsafeEval = globalConfig.lockUnsafeEval;\n }\n if (typeof globalConfig.diagnostics === 'boolean') {\n config.diagnostics = globalConfig.diagnostics;\n }\n if (typeof globalConfig.autoContainment === 'boolean') {\n config.autoContainment = globalConfig.autoContainment;\n }\n }\n }\n\n if (typeof document !== 'undefined') {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script) {\n const unsafeFromAttr = parseBooleanFlag(script.getAttribute('data-forma-unsafe-eval'));\n if (unsafeFromAttr !== undefined) {\n config.allowUnsafeEval = unsafeFromAttr;\n }\n const modeFromAttr = parseUnsafeEvalMode(\n script.getAttribute('data-forma-unsafe-eval-mode'),\n );\n if (modeFromAttr !== undefined) {\n config.unsafeEvalMode = modeFromAttr;\n }\n const lockFromAttr = parseBooleanFlag(script.getAttribute('data-forma-lock-unsafe-eval'));\n if (lockFromAttr !== undefined) {\n config.lockUnsafeEval = lockFromAttr;\n }\n const diagnosticsFromAttr = parseBooleanFlag(script.getAttribute('data-forma-diagnostics'));\n if (diagnosticsFromAttr !== undefined) {\n config.diagnostics = diagnosticsFromAttr;\n }\n const containmentFromAttr = parseBooleanFlag(script.getAttribute('data-forma-auto-containment'));\n if (containmentFromAttr !== undefined) {\n config.autoContainment = containmentFromAttr;\n }\n }\n }\n\n return config;\n}\n\nfunction reportDiagnostic(\n kind: RuntimeDiagnostic['kind'],\n expr: string,\n reason: string,\n): void {\n if (!_diagnosticsEnabled) return;\n\n const key = `${kind}|${reason}|${expr}`;\n const now = Date.now();\n const existing = diagnostics.get(key);\n\n if (existing) {\n existing.count += 1;\n existing.lastSeenAt = now;\n } else {\n diagnostics.set(key, {\n kind,\n expr,\n reason,\n count: 1,\n firstSeenAt: now,\n lastSeenAt: now,\n });\n console.warn(`[FormaJS] ${reason}: ${expr}`);\n }\n\n try {\n if (typeof window !== 'undefined') {\n const detail = {\n kind,\n expr,\n reason,\n count: diagnostics.get(key)?.count ?? 1,\n };\n window.dispatchEvent(new CustomEvent('formajs:diagnostic', { detail }));\n }\n } catch {\n // Ignore event dispatch failures\n }\n}\n\ndeclare const __FORMA_UNSAFE_EVAL_MODE__: string | undefined;\n\n/**\n * Compile-time flag: true when the build CAN use new Function().\n * In the hardened build, __FORMA_UNSAFE_EVAL_MODE__ is \"locked-off\" and\n * esbuild constant-folds this to `false`, allowing dead code elimination\n * of all new Function() paths. This ensures Socket.dev/Snyk static analysis\n * does not flag eval usage in the hardened build.\n */\nconst __EVAL_CAPABLE__ = typeof __FORMA_UNSAFE_EVAL_MODE__ !== 'string'\n || __FORMA_UNSAFE_EVAL_MODE__ !== 'locked-off';\n\nconst buildUnsafeEvalMode = parseUnsafeEvalMode(\n typeof __FORMA_UNSAFE_EVAL_MODE__ === 'string'\n ? __FORMA_UNSAFE_EVAL_MODE__\n : undefined,\n);\n\nif (buildUnsafeEvalMode) {\n _unsafeEvalMode = buildUnsafeEvalMode;\n if (_unsafeEvalMode === 'locked-off') _allowUnsafeEval = false;\n if (_unsafeEvalMode === 'locked-on') _allowUnsafeEval = true;\n if (_unsafeEvalMode === 'mutable') _allowUnsafeEval = true;\n}\n\nconst runtimeConfig = readRuntimeConfig();\nconst configUnsafeMode = runtimeConfig.lockUnsafeEval\n ? 'locked-off'\n : runtimeConfig.unsafeEvalMode;\nif (configUnsafeMode) {\n _unsafeEvalMode = configUnsafeMode;\n if (_unsafeEvalMode === 'locked-off') _allowUnsafeEval = false;\n if (_unsafeEvalMode === 'locked-on') _allowUnsafeEval = true;\n}\nif (\n _unsafeEvalMode === 'mutable'\n && typeof runtimeConfig.allowUnsafeEval === 'boolean'\n) {\n _allowUnsafeEval = runtimeConfig.allowUnsafeEval;\n}\nif (typeof runtimeConfig.diagnostics === 'boolean') {\n _diagnosticsEnabled = runtimeConfig.diagnostics;\n}\nconst _autoContainment = runtimeConfig.autoContainment === true;\n\ninterface SchedulerLike {\n yield?: () => Promise<unknown>;\n postTask?: (\n callback: () => void,\n options?: { priority?: 'user-blocking' | 'user-visible' | 'background' },\n ) => Promise<unknown>;\n}\n\nfunction getScheduler(): SchedulerLike | undefined {\n const candidate = (globalThis as any)?.scheduler as SchedulerLike | undefined;\n if (!candidate) return undefined;\n if (typeof candidate.yield === 'function' || typeof candidate.postTask === 'function') {\n return candidate;\n }\n return undefined;\n}\n\n/** Yield control to keep the main thread responsive during large batches. */\nasync function yieldToMain(): Promise<void> {\n const scheduler = getScheduler();\n if (scheduler?.yield) {\n await scheduler.yield();\n return;\n }\n if (scheduler?.postTask) {\n await scheduler.postTask(() => {}, { priority: 'background' });\n return;\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n\ninterface ContainmentHintsOptions {\n selector?: string;\n contain?: string;\n contentVisibility?: string;\n containIntrinsicSize?: string;\n skipIfAlreadySet?: boolean;\n}\n\n/** Apply CSS containment hints to opt-in containers for lower layout/paint cost. */\nfunction applyContainmentHints(\n root: ParentNode = document,\n options: ContainmentHintsOptions = {},\n): number {\n const selector = options.selector ?? '[data-forma-contain]';\n if (!selector) return 0;\n if (typeof (root as ParentNode).querySelectorAll !== 'function') return 0;\n\n const nodes = root.querySelectorAll(selector);\n let applied = 0;\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i] as HTMLElement;\n if (!el?.style) continue;\n\n const contain = el.getAttribute('data-forma-contain') ?? options.contain ?? 'layout style paint';\n const contentVisibility = el.getAttribute('data-forma-content-visibility')\n ?? options.contentVisibility\n ?? 'auto';\n const containIntrinsicSize = el.getAttribute('data-forma-contain-intrinsic-size')\n ?? options.containIntrinsicSize\n ?? 'auto 800px';\n const skipExisting = options.skipIfAlreadySet === true;\n let changed = false;\n\n const containCurrent = el.style.getPropertyValue('contain');\n const contentVisCurrent = el.style.getPropertyValue('content-visibility');\n const containSizeCurrent = el.style.getPropertyValue('contain-intrinsic-size');\n\n if (contain !== 'off' && (!skipExisting || !containCurrent)) {\n el.style.setProperty('contain', contain);\n changed = true;\n }\n if (contentVisibility !== 'off' && (!skipExisting || !contentVisCurrent)) {\n el.style.setProperty('content-visibility', contentVisibility);\n changed = true;\n }\n if (containIntrinsicSize !== 'off' && (!skipExisting || !containSizeCurrent)) {\n el.style.setProperty('contain-intrinsic-size', containIntrinsicSize);\n changed = true;\n }\n\n if (changed) applied++;\n }\n\n if (_debug && applied > 0) {\n dbg('applyContainmentHints: applied to', applied, 'element(s)');\n }\n return applied;\n}\n\n// ── Pre-compiled regexes (avoid re-creation in hot paths) ──\n\nconst RE_STRING_SINGLE = /^'[^']*'$/;\nconst RE_STRING_DOUBLE = /^\"[^\"]*\"$/;\nconst RE_NUMBER = /^-?\\d+(\\.\\d+)?$/;\nconst RE_IDENTIFIER = /^[a-zA-Z_$]\\w*$/;\nconst RE_DOT_ACCESS = /^(\\w+)\\.(\\w+)$/;\nconst RE_DEEP_DOT = /^(\\w+)\\.(\\w+)\\.(\\w+)(?:\\.(\\w+))?$/;\nconst RE_BRACKET = /^(\\w+)\\[(\\d+|'[^']*'|\"[^\"]*\")\\]$/;\nconst RE_TERNARY = /^(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+)$/;\nconst RE_NULLISH = /^(.+?)\\s*\\?\\?\\s*(.+)$/;\nconst RE_AND = /^(.+?)\\s*&&\\s*(.+)$/;\nconst RE_OR = /^(.+?)\\s*\\|\\|\\s*(.+)$/;\nconst RE_COMPARISON = /^(.+?)\\s*(===|!==|==|!=|>=|<=|>|<)\\s*(.+)$/;\nconst RE_MUL = /^(.+?)\\s*([*/%])\\s*(.+)$/;\nconst RE_ADD = /^(.+?)\\s*([+-])\\s*(.+)$/;\nconst RE_TEMPLATE_LIT = /^`([^`]*)`$/;\nconst RE_TEMPLATE_INTERP = /\\$\\{([^}]+)\\}/g;\nconst RE_METHOD_CALL = /^(\\w+)\\.(\\w+)\\((.*)\\)$/;\nconst RE_GROUP_METHOD_CALL = /^\\((.+)\\)\\.(\\w+)\\((.*)\\)$/;\nconst RE_STRIP_BRACES = /^\\{|\\}$/g;\nconst RE_ITEM_TEMPLATE = /\\{item\\.?(\\w*)\\}/g;\nconst RE_DIGIT_ONLY = /^\\d+$/;\nconst RE_POST_INCR = /^(\\w+)(\\+\\+|--)$/;\nconst RE_PRE_INCR = /^(\\+\\+|--)(\\w+)$/;\nconst RE_TOGGLE = /^(\\w+)\\s*=\\s*!(\\w+)$/;\nconst RE_ASSIGN = /^(\\w+)\\s*=\\s*(.+)$/;\nconst RE_COMPOUND = /^(\\w+)\\s*(\\+=|-=|\\*=|\\/=)\\s*(.+)$/;\nconst RE_IF_PREFIX = /^if\\b/;\n// RE_UNQUOTED_KEYS removed in v0.5.0 — relaxed JSON parsing corrupted URLs\n// and string values containing colons. Use valid JSON in data-forma-state.\nconst RE_COMPUTED = /^(\\w+)\\s*=\\s*(.+)$/;\nconst RE_FETCH = /^(.+?)(?:→|->)\\s*(\\S+)(.*)$/;\nconst RE_FETCH_METHOD = /^(GET|POST|PUT|PATCH|DELETE)\\s+(.+)$/i;\nconst RE_STRIP_ITEM_BRACES = /^\\{item\\.?|\\}$/g;\n// Detect expressions referencing DOM event parameters — these can't be resolved\n// through scope getters and must fall through to the new Function handler path.\nconst RE_EVENT_REF = /\\bevent\\s*[.([]|\\$event\\b/;\nconst RE_REFETCH_CALL = /^\\$refetch\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)$/;\n\ninterface TransitionSpec {\n enter: string[];\n enterFrom: string[];\n enterTo: string[];\n leave: string[];\n leaveFrom: string[];\n leaveTo: string[];\n enterDurationMs?: number;\n leaveDurationMs?: number;\n}\n\ninterface ElementTransitionState {\n token: number;\n cancel: (() => void) | null;\n}\n\nconst TRANSITION_STATE_SYM = Symbol.for('forma-transition-state');\n\n// ── Expression factory cache ──\n// Maps expression string -> factory function that takes a scope and returns a getter.\n// This avoids re-parsing the same expression pattern across different scopes.\ntype ExpressionFactory = (scope: Scope) => (() => unknown) | null;\nconst EXPRESSION_CACHE_MAX = 2048;\nconst expressionCache = new Map<string, ExpressionFactory>();\nfunction cacheExpression(key: string, factory: ExpressionFactory): void {\n if (expressionCache.size >= EXPRESSION_CACHE_MAX) {\n // Evict oldest entry (first inserted)\n const first = expressionCache.keys().next().value;\n if (first !== undefined) expressionCache.delete(first);\n }\n expressionCache.set(key, factory);\n}\nlet scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n\ninterface HandlerBuildResult {\n handler: (e: Event) => void;\n supported: boolean;\n}\n\nlet scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n\n// ── Compiled template cache ──\n// Pre-splits template text into static/dynamic segments for fast re-evaluation.\ninterface CompiledTemplate {\n statics: string[];\n dynamics: string[]; // expression strings between {item.xxx}\n hasItemRef: boolean;\n}\n\nconst compiledTemplateCache = new Map<string, CompiledTemplate>();\nconst COMPILED_TEMPLATE_CACHE_MAX = 2048;\nfunction cacheCompiledTemplate(key: string, template: CompiledTemplate): void {\n if (compiledTemplateCache.size >= COMPILED_TEMPLATE_CACHE_MAX) {\n // Evict oldest entry (first inserted)\n const first = compiledTemplateCache.keys().next().value;\n if (first !== undefined) compiledTemplateCache.delete(first);\n }\n compiledTemplateCache.set(key, template);\n}\nconst UNSAFE_METHOD_NAMES = new Set([\n 'constructor', '__proto__', 'prototype',\n '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__',\n 'eval', 'Function',\n]);\n\n/**\n * Pre-compiled regexes for each blocked method name — avoids re-creating\n * RegExp objects on every call.\n */\nconst BLOCKED_METHOD_REGEXES: Array<{ name: string; dotRe: RegExp; bracketRe: RegExp }> = (() => {\n const result: Array<{ name: string; dotRe: RegExp; bracketRe: RegExp }> = [];\n for (const name of UNSAFE_METHOD_NAMES) {\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n result.push({\n name,\n // Match as property access (.name) or bare identifier at start\n dotRe: new RegExp(`(?:^|\\\\.)${escaped}(?:\\\\s*\\\\(|\\\\s*$|[^\\\\w$])`, 'm'),\n // Match bracket access with single quotes, double quotes, or backticks\n bracketRe: new RegExp(`\\\\[\\\\s*(?:'${escaped}'|\"${escaped}\"|` + '`' + escaped + '`' + `)\\\\s*\\\\]`),\n });\n }\n return result;\n})();\n\n/**\n * Scan an expression string for any UNSAFE_METHOD_NAMES usage.\n * Uses word-boundary matching to avoid false positives on substrings\n * (e.g. \"constructorValue\" should not match \"constructor\").\n *\n * Before scanning:\n * 1. Strips JS block comments and line comments\n * 2. Normalizes whitespace around dots (e.g. \"x . constructor\" → \"x.constructor\")\n * 3. Checks bracket access with static string literals and backtick templates\n * 4. Detects string concatenation inside brackets that could produce a blocked name\n *\n * Returns the matched blocked name, or null if clean.\n */\nfunction findBlockedMethod(expr: string): string | null {\n // Strip block comments (/* ... */)\n let cleaned = expr.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n // Strip line comments (// ... to end of line)\n cleaned = cleaned.replace(/\\/\\/[^\\n]*/g, '');\n // Normalize whitespace around dots: \"x . constructor\" → \"x.constructor\"\n cleaned = cleaned.replace(/\\s*\\.\\s*/g, '.');\n\n for (const { name, dotRe, bracketRe } of BLOCKED_METHOD_REGEXES) {\n if (dotRe.test(cleaned)) return name;\n if (bracketRe.test(cleaned)) return name;\n }\n\n // Layer 2: detect string concatenation inside brackets that could produce\n // a blocked name. Extract all bracket contents and check if concatenated\n // string fragments could form a blocked name.\n // e.g. x['constr' + 'uctor'] → extract 'constr' and 'uctor' → 'constructor'\n if (cleaned.includes('[')) {\n const bracketContents = extractBracketContents(cleaned);\n for (const content of bracketContents) {\n // Only check contents with concatenation operators\n if (!content.includes('+')) continue;\n // Extract all string literal fragments and join them\n const fragments = content.match(/['\"`]([^'\"`]*?)['\"`]/g);\n if (!fragments) continue;\n const joined = fragments.map(f => f.slice(1, -1)).join('');\n if (UNSAFE_METHOD_NAMES.has(joined)) return joined;\n }\n }\n\n return null;\n}\n\n/** Extract the contents of all bracket access expressions (between [ and ]). */\nfunction extractBracketContents(expr: string): string[] {\n const results: string[] = [];\n let depth = 0;\n let start = -1;\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '[') {\n if (depth === 0) start = i + 1;\n depth++;\n } else if (expr[i] === ']') {\n depth--;\n if (depth === 0 && start >= 0) {\n results.push(expr.slice(start, i));\n start = -1;\n }\n }\n }\n return results;\n}\n\nconst TEXT_BINDING_SYM = Symbol.for('forma-text-binding-cache');\n\ninterface TextBindingCache {\n initialized: boolean;\n last: string;\n node: Text | null;\n}\n\nfunction toTextValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'symbol') return value.toString();\n return String(value);\n}\n\nfunction setElementTextFast(el: Element, next: string): void {\n let cache = (el as any)[TEXT_BINDING_SYM] as TextBindingCache | undefined;\n if (!cache) {\n cache = { initialized: false, last: '', node: null };\n (el as any)[TEXT_BINDING_SYM] = cache;\n }\n\n if (cache.initialized && cache.last === next) return;\n\n // Reuse direct text-node writes when this element is a single text child.\n let node = cache.node;\n if (!node || node.parentNode !== el || el.childNodes.length !== 1 || el.firstChild !== node) {\n if (el.childNodes.length === 1 && el.firstChild?.nodeType === Node.TEXT_NODE) {\n node = el.firstChild as Text;\n cache.node = node;\n } else {\n el.textContent = next;\n const first = el.firstChild;\n cache.node = (first && first.nodeType === Node.TEXT_NODE && el.childNodes.length === 1)\n ? (first as Text)\n : null;\n cache.last = next;\n cache.initialized = true;\n return;\n }\n }\n\n node.data = next;\n cache.last = next;\n cache.initialized = true;\n}\n\nfunction splitCallArgs(raw: string): string[] {\n const out: string[] = [];\n if (raw.trim() === '') return out;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let escaped = false;\n let start = 0;\n\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n\n if (ch === '(') {\n depth++;\n continue;\n }\n if (ch === ')') {\n if (depth > 0) depth--;\n continue;\n }\n\n if (ch === ',' && depth === 0) {\n out.push(raw.slice(start, i).trim());\n start = i + 1;\n }\n }\n\n out.push(raw.slice(start).trim());\n return out.filter(Boolean);\n}\n\nfunction readBalancedSegment(\n input: string,\n start: number,\n open: string,\n close: string,\n): { inner: string; end: number } | null {\n if (input[start] !== open) return null;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n\n for (let i = start; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === open) {\n depth++;\n continue;\n }\n if (ch === close) {\n depth--;\n if (depth === 0) {\n return {\n inner: input.slice(start + 1, i),\n end: i,\n };\n }\n }\n }\n\n return null;\n}\n\nfunction splitTopLevelStatements(raw: string): string[] {\n const input = raw.trim();\n if (!input) return [];\n\n const out: string[] = [];\n let depthParen = 0;\n let depthBrace = 0;\n let depthBracket = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n let start = 0;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n else if (ch === '{') depthBrace++;\n else if (ch === '}' && depthBrace > 0) depthBrace--;\n else if (ch === '[') depthBracket++;\n else if (ch === ']' && depthBracket > 0) depthBracket--;\n\n if (ch === ';' && depthParen === 0 && depthBrace === 0 && depthBracket === 0) {\n const stmt = input.slice(start, i).trim();\n if (stmt) out.push(stmt);\n start = i + 1;\n }\n }\n\n const tail = input.slice(start).trim();\n if (tail) out.push(tail);\n return out;\n}\n\nfunction consumeStatement(raw: string): { body: string; rest: string } | null {\n const input = raw.trim();\n if (!input) return null;\n\n if (input.startsWith('{')) {\n const block = readBalancedSegment(input, 0, '{', '}');\n if (!block) return null;\n const body = block.inner.trim();\n let rest = input.slice(block.end + 1).trim();\n if (rest.startsWith(';')) rest = rest.slice(1).trim();\n return { body, rest };\n }\n\n let depthParen = 0;\n let depthBrace = 0;\n let depthBracket = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n else if (ch === '{') depthBrace++;\n else if (ch === '}' && depthBrace > 0) depthBrace--;\n else if (ch === '[') depthBracket++;\n else if (ch === ']' && depthBracket > 0) depthBracket--;\n\n if (ch === ';' && depthParen === 0 && depthBrace === 0 && depthBracket === 0) {\n return {\n body: input.slice(0, i).trim(),\n rest: input.slice(i + 1).trim(),\n };\n }\n }\n\n return {\n body: input,\n rest: '',\n };\n}\n\nfunction parseIfHandler(expr: string, scope: Scope): ((e: Event) => void) | null {\n const input = expr.trim();\n if (!RE_IF_PREFIX.test(input)) return null;\n\n // If the expression references DOM event parameters (`event`, `$event`),\n // bail out — these aren't in scope getters and must use new Function.\n if (RE_EVENT_REF.test(input)) return null;\n\n let idx = 2;\n while (idx < input.length && /\\s/.test(input[idx]!)) idx++;\n if (input[idx] !== '(') return null;\n\n const condSegment = readBalancedSegment(input, idx, '(', ')');\n if (!condSegment) return null;\n\n const condExpr = parseExpression(condSegment.inner.trim(), scope);\n if (!condExpr) return null;\n\n let rest = input.slice(condSegment.end + 1).trim();\n const thenStmt = consumeStatement(rest);\n if (!thenStmt || !thenStmt.body) return null;\n\n const thenHandler = parseHandler(thenStmt.body, scope);\n if (!thenHandler) return null;\n\n rest = thenStmt.rest.trim();\n let elseHandler: ((e: Event) => void) | null = null;\n if (rest.startsWith('else')) {\n rest = rest.slice('else'.length).trim();\n const elseStmt = consumeStatement(rest);\n if (!elseStmt || !elseStmt.body) return null;\n elseHandler = parseHandler(elseStmt.body, scope);\n if (!elseHandler) return null;\n rest = elseStmt.rest.trim();\n }\n\n if (rest.length > 0) return null;\n\n return (e: Event) => {\n batch(() => {\n if (condExpr()) thenHandler(e);\n else elseHandler?.(e);\n });\n };\n}\n\nfunction unwrapOuterParens(raw: string): string {\n let expr = raw.trim();\n while (expr.startsWith('(')) {\n const segment = readBalancedSegment(expr, 0, '(', ')');\n if (!segment || segment.end !== expr.length - 1) break;\n const inner = segment.inner.trim();\n if (!inner) break;\n expr = inner;\n }\n return expr;\n}\n\nfunction compileTemplate(text: string): CompiledTemplate {\n const cached = compiledTemplateCache.get(text);\n if (cached) return cached;\n\n const statics: string[] = [];\n const dynamics: string[] = [];\n let lastIndex = 0;\n // Use a fresh regex each time since it has the 'g' flag\n const re = /\\{item\\.?(\\w*)\\}/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n statics.push(text.slice(lastIndex, m.index));\n dynamics.push(m[1]!); // the key after \"item.\" (empty string means whole item)\n lastIndex = re.lastIndex;\n }\n statics.push(text.slice(lastIndex));\n\n const result: CompiledTemplate = {\n statics,\n dynamics,\n hasItemRef: dynamics.length > 0,\n };\n cacheCompiledTemplate(text, result);\n return result;\n}\n\n// ── Template text caching for data-list ──\n\n/** Maps text nodes to their compiled template (pre-split static/dynamic segments). */\nconst templateTexts = new WeakMap<Node, CompiledTemplate>();\n\n/**\n * Resolve template placeholders in a text string using pre-compiled template.\n * Concatenates static segments with evaluated dynamic segments.\n */\nfunction resolveTemplate(text: string, item: unknown): string {\n const compiled = compileTemplate(text);\n return evaluateCompiledTemplate(compiled, item);\n}\n\n/**\n * Evaluate a pre-compiled template against an item.\n * Only evaluates dynamic parts and concatenates with static segments.\n */\nfunction evaluateCompiledTemplate(compiled: CompiledTemplate, item: unknown): string {\n if (!compiled.hasItemRef) return compiled.statics[0]!;\n let result = compiled.statics[0]!;\n for (let i = 0; i < compiled.dynamics.length; i++) {\n const key = compiled.dynamics[i]!;\n if (!key) {\n result += typeof item === 'object' ? JSON.stringify(item) : String(item ?? '');\n } else {\n result += String((item as Record<string, unknown>)?.[key] ?? '');\n }\n result += compiled.statics[i + 1] ?? '';\n }\n return result;\n}\n\n/**\n * Clone a template element and apply item data to all text node placeholders.\n * Stores the original template text in a WeakMap so updates can re-apply without re-cloning.\n */\nfunction cloneWithTemplateData(template: Element, item: unknown): Element {\n const clone = template.cloneNode(true) as Element;\n const walker = document.createTreeWalker(clone, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n const text = node.textContent ?? '';\n if (text.includes('{item')) {\n const compiled = compileTemplate(text);\n templateTexts.set(node, compiled); // Store compiled template\n node.textContent = evaluateCompiledTemplate(compiled, item);\n }\n }\n // Also process attributes (e.g. data-key, href, src, etc.)\n cloneAttributeTemplates(clone, item);\n return clone;\n}\n\n/**\n * Update an existing cloned element's text nodes with new item data.\n * Uses the cached original template patterns from the WeakMap.\n */\nfunction updateTemplateData(el: Element, item: unknown): void {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n const compiled = templateTexts.get(node);\n if (compiled) {\n node.textContent = evaluateCompiledTemplate(compiled, item);\n }\n }\n}\n\n/** WeakMap for caching compiled attribute templates */\nconst templateAttrs = new WeakMap<Element, Array<{ attr: string; compiled: CompiledTemplate }>>();\n\n/**\n * Process attribute templates on a cloned element and its descendants.\n * Pre-compiles patterns and resolves them with item data.\n */\n/** Directive attribute names/prefixes that bindElement processes — these must NOT be\n * template-interpolated by cloneAttributeTemplates because their values will be\n * evaluated by the reactive binding system using the child scope. */\nconst DIRECTIVE_ATTR_PREFIXES = [\n 'data-list', 'data-show', 'data-text', 'data-if', 'data-model',\n 'data-on:', 'data-class:', 'data-bind:', 'data-computed', 'data-persist', 'data-fetch',\n 'data-transition', 'data-transition:',\n];\nfunction isDirectiveAttr(name: string): boolean {\n for (const prefix of DIRECTIVE_ATTR_PREFIXES) {\n if (name === prefix || name.startsWith(prefix)) return true;\n }\n return false;\n}\n\nfunction splitClassTokens(raw: string | null): string[] {\n if (!raw) return [];\n return raw\n .trim()\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\nfunction parseDurationTokenMs(token: string): number | null {\n const t = token.trim().toLowerCase();\n if (t.endsWith('ms')) {\n const n = Number(t.slice(0, -2));\n return Number.isFinite(n) && n >= 0 ? n : null;\n }\n if (t.endsWith('s')) {\n const n = Number(t.slice(0, -1));\n return Number.isFinite(n) && n >= 0 ? n * 1000 : null;\n }\n return null;\n}\n\nfunction parseClassTokensAndDuration(raw: string | null): { classes: string[]; durationMs?: number } {\n const classes: string[] = [];\n let durationMs: number | undefined;\n for (const token of splitClassTokens(raw)) {\n const parsed = parseDurationTokenMs(token);\n if (parsed != null) {\n durationMs = parsed;\n } else {\n classes.push(token);\n }\n }\n return { classes, durationMs };\n}\n\nfunction uniqueTokens(tokens: string[]): string[] {\n return Array.from(new Set(tokens.filter(Boolean)));\n}\n\nfunction parseCssTimeListMs(raw: string): number[] {\n if (!raw) return [];\n return raw\n .split(',')\n .map((part) => parseDurationTokenMs(part.trim()))\n .filter((ms): ms is number => ms != null);\n}\n\nfunction maxCombinedTimingsMs(durations: number[], delays: number[]): number {\n if (durations.length === 0 && delays.length === 0) return 0;\n if (durations.length === 0) return Math.max(...delays, 0);\n if (delays.length === 0) return Math.max(...durations, 0);\n\n const len = Math.max(durations.length, delays.length);\n let max = 0;\n for (let i = 0; i < len; i++) {\n const d = durations[i % durations.length] ?? 0;\n const delay = delays[i % delays.length] ?? 0;\n if (d + delay > max) max = d + delay;\n }\n return max;\n}\n\nfunction resolveTransitionDurationMs(el: HTMLElement, explicitMs?: number): number {\n if (typeof explicitMs === 'number') return explicitMs;\n const cs = window.getComputedStyle(el);\n const trans = maxCombinedTimingsMs(\n parseCssTimeListMs(cs.transitionDuration),\n parseCssTimeListMs(cs.transitionDelay),\n );\n const anim = maxCombinedTimingsMs(\n parseCssTimeListMs(cs.animationDuration),\n parseCssTimeListMs(cs.animationDelay),\n );\n return Math.max(trans, anim);\n}\n\nfunction getTransitionState(el: HTMLElement): ElementTransitionState {\n const existing = (el as any)[TRANSITION_STATE_SYM] as ElementTransitionState | undefined;\n if (existing) return existing;\n const created: ElementTransitionState = { token: 0, cancel: null };\n (el as any)[TRANSITION_STATE_SYM] = created;\n return created;\n}\n\nfunction clearTransitionState(el: HTMLElement): void {\n const state = (el as any)[TRANSITION_STATE_SYM] as ElementTransitionState | undefined;\n if (state?.cancel) {\n state.cancel();\n }\n delete (el as any)[TRANSITION_STATE_SYM];\n}\n\nfunction parseTransitionSpec(el: Element): TransitionSpec | null {\n const hasTransitionAttr = el.hasAttribute('data-transition')\n || Array.from(el.attributes).some((a) => a.name.startsWith('data-transition:'));\n if (!hasTransitionAttr) return null;\n\n const base = parseClassTokensAndDuration(el.getAttribute('data-transition')).classes;\n\n const enter = parseClassTokensAndDuration(el.getAttribute('data-transition:enter'));\n const leave = parseClassTokensAndDuration(el.getAttribute('data-transition:leave'));\n const enterFrom = splitClassTokens(\n el.getAttribute('data-transition:enter-from')\n ?? el.getAttribute('data-transition:enter-start'),\n );\n const enterTo = splitClassTokens(\n el.getAttribute('data-transition:enter-to')\n ?? el.getAttribute('data-transition:enter-end'),\n );\n const leaveFrom = splitClassTokens(\n el.getAttribute('data-transition:leave-from')\n ?? el.getAttribute('data-transition:leave-start'),\n );\n const leaveTo = splitClassTokens(\n el.getAttribute('data-transition:leave-to')\n ?? el.getAttribute('data-transition:leave-end'),\n );\n\n const durationBoth = parseDurationTokenMs(el.getAttribute('data-transition:duration') ?? '');\n const enterDuration = parseDurationTokenMs(el.getAttribute('data-transition:duration-enter') ?? '')\n ?? enter.durationMs\n ?? durationBoth\n ?? undefined;\n const leaveDuration = parseDurationTokenMs(el.getAttribute('data-transition:duration-leave') ?? '')\n ?? leave.durationMs\n ?? durationBoth\n ?? undefined;\n\n return {\n enter: uniqueTokens([...base, ...enter.classes]),\n enterFrom: uniqueTokens(enterFrom),\n enterTo: uniqueTokens(enterTo),\n leave: uniqueTokens([...base, ...leave.classes]),\n leaveFrom: uniqueTokens(leaveFrom),\n leaveTo: uniqueTokens(leaveTo),\n enterDurationMs: enterDuration,\n leaveDurationMs: leaveDuration,\n };\n}\n\nfunction removeClasses(el: Element, classes: string[]): void {\n for (const cls of classes) {\n el.classList.remove(cls);\n }\n}\n\nfunction addClasses(el: Element, classes: string[]): void {\n for (const cls of classes) {\n el.classList.add(cls);\n }\n}\n\nfunction runTransitionPhase(\n el: HTMLElement,\n phaseClasses: { base: string[]; from: string[]; to: string[]; durationMs?: number },\n onDone: () => void,\n): () => void {\n const cleanupClasses = uniqueTokens([\n ...phaseClasses.base,\n ...phaseClasses.from,\n ...phaseClasses.to,\n ]);\n\n let done = false;\n let timeoutId: number | null = null;\n let raf1: number | null = null;\n let raf2: number | null = null;\n\n const finish = () => {\n if (done) return;\n done = true;\n if (timeoutId != null) window.clearTimeout(timeoutId);\n if (raf1 != null) cancelAnimationFrame(raf1);\n if (raf2 != null) cancelAnimationFrame(raf2);\n removeClasses(el, cleanupClasses);\n onDone();\n };\n\n addClasses(el, phaseClasses.base);\n addClasses(el, phaseClasses.from);\n removeClasses(el, phaseClasses.to);\n\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => {\n if (done) return;\n removeClasses(el, phaseClasses.from);\n addClasses(el, phaseClasses.to);\n\n const ms = resolveTransitionDurationMs(el, phaseClasses.durationMs);\n if (ms <= 0) {\n finish();\n return;\n }\n timeoutId = window.setTimeout(finish, ms + 25);\n });\n });\n\n return finish;\n}\n\n/**\n * Insert an element into the DOM and optionally run an enter transition.\n * The element is functional immediately — the animation is purely visual.\n */\nfunction transitionInsert(\n el: HTMLElement,\n parent: Node,\n ref: Node | null,\n spec: TransitionSpec | null,\n): void {\n parent.insertBefore(el, ref);\n if (!spec) return;\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: spec.enter,\n from: spec.enterFrom,\n to: spec.enterTo,\n durationMs: spec.enterDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n },\n );\n}\n\n/**\n * Run a leave transition on an element, then call onDone when complete.\n * Sets data-forma-leaving immediately so the element is excluded from diffs.\n * If no transition spec, calls onDone synchronously.\n */\nfunction transitionRemove(\n el: HTMLElement,\n spec: TransitionSpec | null,\n onDone: () => void,\n): void {\n // Guard: if already leaving, don't start another leave\n if (el.hasAttribute('data-forma-leaving')) {\n onDone();\n return;\n }\n\n if (!spec) {\n onDone();\n return;\n }\n\n el.setAttribute('data-forma-leaving', '');\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: spec.leave,\n from: spec.leaveFrom,\n to: spec.leaveTo,\n durationMs: spec.leaveDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n el.removeAttribute('data-forma-leaving');\n onDone();\n },\n );\n}\n\nfunction applyShowVisibility(\n el: HTMLElement,\n visible: boolean,\n transition: TransitionSpec | null,\n initial: boolean,\n): void {\n if (!transition || initial) {\n el.style.display = visible ? '' : 'none';\n if (transition) {\n removeClasses(el, uniqueTokens([\n ...transition.enter, ...transition.enterFrom, ...transition.enterTo,\n ...transition.leave, ...transition.leaveFrom, ...transition.leaveTo,\n ]));\n }\n return;\n }\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n state.cancel = null;\n\n if (visible) {\n el.style.display = '';\n state.cancel = runTransitionPhase(\n el,\n {\n base: transition.enter,\n from: transition.enterFrom,\n to: transition.enterTo,\n durationMs: transition.enterDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n },\n );\n return;\n }\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: transition.leave,\n from: transition.leaveFrom,\n to: transition.leaveTo,\n durationMs: transition.leaveDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token !== token) return;\n el.style.display = 'none';\n current.cancel = null;\n },\n );\n}\n\nfunction cloneAttributeTemplates(el: Element, item: unknown): void {\n const all = [el, ...Array.from(el.querySelectorAll('*'))];\n for (const node of all) {\n const entries: Array<{ attr: string; compiled: CompiledTemplate }> = [];\n for (const attr of Array.from(node.attributes)) {\n // Skip directive attributes — they'll be evaluated by bindElement with the child scope\n if (isDirectiveAttr(attr.name)) continue;\n if (attr.value.includes('{item')) {\n const compiled = compileTemplate(attr.value);\n entries.push({ attr: attr.name, compiled });\n const value = evaluateCompiledTemplate(compiled, item);\n if (isUnsafeAttrBinding(attr.name, value)) {\n node.removeAttribute(attr.name);\n } else {\n node.setAttribute(attr.name, value);\n }\n }\n }\n if (entries.length > 0) {\n templateAttrs.set(node, entries);\n }\n }\n}\n\n// ── Chained access / optional chaining parser ──\n\n/**\n * Represents a single step in a property/method chain.\n * - type 'prop': property access (`.name` or `?.name`)\n * - type 'call': method call (`.method(args)` or `?.method(args)`)\n */\ninterface ChainStep {\n type: 'prop' | 'call';\n name: string;\n optional: boolean; // true for `?.`\n argFns?: Array<() => unknown>; // only for 'call' type\n}\n\n/**\n * Parse an expression that starts with an identifier and is followed by\n * zero or more chain steps: `.prop`, `?.prop`, `.method(args)`, `?.method(args)`.\n * Returns null if the expression doesn't match this pattern.\n *\n * Handles: \"user.name\", \"user?.name\", \"str.trim().toUpperCase()\",\n * \"obj?.method()\", \"items.filter(x).map(y)\", \"a.b.c.d\" (any depth).\n */\nfunction parseChainedAccess(expr: string, scope: Scope): (() => unknown) | null {\n // Must start with an identifier (or Math)\n let pos = 0;\n const identMatch = expr.match(/^[a-zA-Z_$]\\w*/);\n if (!identMatch) return null;\n\n const rootName = identMatch[0]!;\n pos = rootName.length;\n\n // Must have at least one chain step after the identifier\n if (pos >= expr.length) return null;\n // Next char must be '.' or '?' (for '?.')\n if (expr[pos] !== '.' && !(expr[pos] === '?' && expr[pos + 1] === '.')) return null;\n\n const steps: ChainStep[] = [];\n\n while (pos < expr.length) {\n let optional = false;\n\n // Check for `?.` (optional chaining) or `.` (regular access)\n if (expr[pos] === '?' && expr[pos + 1] === '.') {\n optional = true;\n pos += 2;\n } else if (expr[pos] === '.') {\n pos += 1;\n } else {\n // Not a chain continuation — unexpected character\n return null;\n }\n\n // Parse property/method name\n const nameMatch = expr.slice(pos).match(/^\\w+/);\n if (!nameMatch) return null;\n const name = nameMatch[0]!;\n pos += name.length;\n\n if (UNSAFE_METHOD_NAMES.has(name)) return () => undefined;\n\n // Check if this is a method call: followed by `(`\n if (pos < expr.length && expr[pos] === '(') {\n const balanced = readBalancedSegment(expr, pos, '(', ')');\n if (!balanced) return null;\n\n const argsRaw = balanced.inner.trim();\n const argFns: Array<() => unknown> = [];\n for (const arg of splitCallArgs(argsRaw)) {\n const parsed = parseExpression(arg, scope);\n if (!parsed) return null;\n argFns.push(parsed);\n }\n\n steps.push({ type: 'call', name, optional, argFns });\n pos = balanced.end + 1;\n } else {\n steps.push({ type: 'prop', name, optional });\n }\n }\n\n // If we didn't consume the entire expression, this isn't a simple chain\n if (pos !== expr.length) return null;\n\n // If there are no steps, fall back (just an identifier)\n if (steps.length === 0) return null;\n\n // Build the root expression getter\n const rootExpr = rootName === 'Math'\n ? (() => Math)\n : (() => scope.getters[rootName]?.());\n\n return () => {\n let val: any = rootExpr();\n for (const step of steps) {\n if (val == null) {\n if (step.optional) return undefined;\n // Non-optional access on null/undefined — use ?. semantics\n // (existing behavior used ?. for dot access)\n return undefined;\n }\n if (step.type === 'prop') {\n val = val[step.name];\n } else {\n const method = val[step.name];\n if (typeof method !== 'function') return undefined;\n const args = step.argFns!.map(fn => fn());\n val = method.apply(val, args);\n }\n }\n return val;\n };\n}\n\n// ── CSP-safe expression parser ──\n\n/**\n * Parse a simple expression into a closure that evaluates against the scope.\n * Handles common patterns without requiring `new Function()` or `eval`.\n * Returns null if the expression is too complex for the CSP-safe parser.\n */\nfunction parseExpression(expr: string, scope: Scope): (() => unknown) | null {\n // Check expression factory cache first\n const cachedFactory = expressionCache.get(expr);\n if (cachedFactory) return cachedFactory(scope);\n\n const result = parseExpressionUncached(expr, scope);\n\n // Cache factory functions for common simple patterns that can be re-bound to different scopes\n if (result !== null) {\n // Cache factories for simple patterns (identifier, dot access, etc.)\n // Complex patterns with sub-expressions are scope-dependent and harder to cache as factories,\n // but we can still cache the structural match result for them.\n // Keyword literals MUST be checked before RE_IDENTIFIER — \"true\", \"false\",\n // \"null\", \"undefined\" all match /^[a-zA-Z_$]\\w*$/ and would be incorrectly\n // cached as scope variable lookups (returning undefined).\n if (expr === 'true' || expr === 'false' || expr === 'null' || expr === 'undefined') {\n const val = expr === 'true' ? true : expr === 'false' ? false : expr === 'null' ? null : undefined;\n cacheExpression(expr, () => () => val);\n } else if (RE_IDENTIFIER.test(expr)) {\n cacheExpression(expr, (s) => () => s.getters[expr]?.());\n } else if (RE_STRING_SINGLE.test(expr) || RE_STRING_DOUBLE.test(expr)) {\n const val = expr.slice(1, -1);\n cacheExpression(expr, () => () => val);\n } else if (RE_NUMBER.test(expr)) {\n const val = Number(expr);\n cacheExpression(expr, () => () => val);\n } else {\n const dotMatch = expr.match(RE_DOT_ACCESS);\n if (dotMatch) {\n const p1 = dotMatch[1]!, p2 = dotMatch[2]!;\n cacheExpression(expr, (s) => () => {\n const obj = s.getters[p1]?.();\n return (obj as any)?.[p2];\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Core expression parser — called on cache miss.\n * Uses pre-compiled module-level regexes for all pattern matching.\n */\nfunction parseExpressionUncached(expr: string, scope: Scope): (() => unknown) | null {\n expr = expr.trim();\n\n // Parenthesized group: \"(a + b)\", \"((count))\"\n const unwrapped = unwrapOuterParens(expr);\n if (unwrapped !== expr) {\n return parseExpression(unwrapped, scope);\n }\n\n // Literals first (before identifier check, since \\w matches digits)\n\n // String literals\n if (RE_STRING_SINGLE.test(expr) || RE_STRING_DOUBLE.test(expr)) {\n const val = expr.slice(1, -1);\n return () => val;\n }\n\n // Number literals\n if (RE_NUMBER.test(expr)) {\n const val = Number(expr);\n return () => val;\n }\n\n // Boolean / null / undefined literals\n if (expr === 'true') return () => true;\n if (expr === 'false') return () => false;\n if (expr === 'null') return () => null;\n if (expr === 'undefined') return () => undefined;\n\n // Simple identifier: \"count\", \"name\" (must start with letter/underscore/$)\n if (RE_IDENTIFIER.test(expr)) {\n return () => scope.getters[expr]?.();\n }\n\n // Chained access / method calls / optional chaining:\n // \"user.name\", \"user?.name\", \"str.trim().toUpperCase()\", \"obj?.method()\", \"items.filter(x).map(y)\"\n // Also handles simple dot access, deep dot access, and single method calls.\n {\n const chainResult = parseChainedAccess(expr, scope);\n if (chainResult) return chainResult;\n }\n\n // Grouped method call: \"(expr).method(args)\" — base is a parenthesized expression\n const groupedCallMatch = expr.match(RE_GROUP_METHOD_CALL);\n if (groupedCallMatch) {\n const baseRaw = groupedCallMatch[1]!.trim();\n const methodName = groupedCallMatch[2]!;\n const argsRaw = groupedCallMatch[3]!.trim();\n\n if (UNSAFE_METHOD_NAMES.has(methodName)) return () => undefined;\n\n const baseExpr = parseExpression(baseRaw, scope);\n if (!baseExpr) return null;\n\n const argFns: Array<() => unknown> = [];\n for (const arg of splitCallArgs(argsRaw)) {\n const parsed = parseExpression(arg, scope);\n if (!parsed) return null;\n argFns.push(parsed);\n }\n\n return () => {\n const base = baseExpr() as any;\n const method = base?.[methodName];\n if (typeof method !== 'function') return undefined;\n const args = argFns.map(fn => fn());\n return method.apply(base, args);\n };\n }\n\n // Negation: \"!active\", \"!user.loggedIn\"\n if (expr.startsWith('!')) {\n const inner = parseExpression(expr.slice(1).trim(), scope);\n if (inner) return () => !inner();\n }\n\n // Bracket access: \"items[0]\", \"obj['key']\"\n const bracketMatch = expr.match(RE_BRACKET);\n if (bracketMatch) {\n const objExpr = parseExpression(bracketMatch[1]!, scope);\n let key: string | number;\n const rawKey = bracketMatch[2]!;\n if (RE_DIGIT_ONLY.test(rawKey)) {\n key = Number(rawKey);\n } else {\n key = rawKey.slice(1, -1);\n }\n if (objExpr) {\n return () => (objExpr() as any)?.[key];\n }\n }\n\n // Array literal: \"[1, 2, 3]\", \"[item.name, item.id]\", \"['a', 'b']\"\n if (expr.startsWith('[')) {\n const balanced = readBalancedSegment(expr, 0, '[', ']');\n if (balanced && balanced.end === expr.length - 1) {\n const inner = balanced.inner.trim();\n if (inner === '') {\n // Empty array: []\n return () => [];\n }\n const elements = splitCallArgs(inner);\n const elementFns: Array<() => unknown> = [];\n let allParsed = true;\n for (const el of elements) {\n const parsed = parseExpression(el.trim(), scope);\n if (!parsed) { allParsed = false; break; }\n elementFns.push(parsed);\n }\n if (allParsed) {\n return () => elementFns.map(fn => fn());\n }\n }\n }\n\n // Ternary: \"expr ? a : b\"\n const ternaryMatch = expr.match(RE_TERNARY);\n if (ternaryMatch) {\n const cond = parseExpression(ternaryMatch[1]!.trim(), scope);\n const then = parseExpression(ternaryMatch[2]!.trim(), scope);\n const els = parseExpression(ternaryMatch[3]!.trim(), scope);\n if (cond && then && els) {\n return () => cond() ? then() : els();\n }\n }\n\n // Nullish coalescing: \"value ?? 'default'\"\n const nullishMatch = expr.match(RE_NULLISH);\n if (nullishMatch) {\n const left = parseExpression(nullishMatch[1]!.trim(), scope);\n const right = parseExpression(nullishMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() ?? right();\n }\n }\n\n // Logical OR: \"a || b\" (lower precedence than AND — checked first)\n const orMatch = expr.match(RE_OR);\n if (orMatch) {\n const left = parseExpression(orMatch[1]!.trim(), scope);\n const right = parseExpression(orMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() || right();\n }\n }\n\n // Logical AND: \"a && b\" (higher precedence than OR — checked after)\n const andMatch = expr.match(RE_AND);\n if (andMatch) {\n const left = parseExpression(andMatch[1]!.trim(), scope);\n const right = parseExpression(andMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() && right();\n }\n }\n\n // Comparison operators: ===, !==, ==, !=, >=, <=, >, <\n const compMatch = expr.match(RE_COMPARISON);\n if (compMatch) {\n const left = parseExpression(compMatch[1]!.trim(), scope);\n const right = parseExpression(compMatch[3]!.trim(), scope);\n if (left && right) {\n const op = compMatch[2]!;\n return () => {\n const l = left(), r = right();\n switch (op) {\n case '===': return l === r;\n case '!==': return l !== r;\n case '==': return l == r;\n case '!=': return l != r;\n case '>': return (l as number) > (r as number);\n case '<': return (l as number) < (r as number);\n case '>=': return (l as number) >= (r as number);\n case '<=': return (l as number) <= (r as number);\n }\n };\n }\n }\n\n // Arithmetic: +, -, *, /, %\n // Addition/subtraction first (lower precedence — checked first), then * / %\n const addMatch = expr.match(RE_ADD);\n if (addMatch) {\n const left = parseExpression(addMatch[1]!.trim(), scope);\n const right = parseExpression(addMatch[3]!.trim(), scope);\n if (left && right) {\n const op = addMatch[2]!;\n return () => {\n const l = left(), r = right();\n if (op === '+') return (l as any) + (r as any);\n return (l as number) - (r as number);\n };\n }\n }\n\n // Multiplication / division / modulo (higher precedence — checked after addition)\n const mulMatch = expr.match(RE_MUL);\n if (mulMatch) {\n const left = parseExpression(mulMatch[1]!.trim(), scope);\n const right = parseExpression(mulMatch[3]!.trim(), scope);\n if (left && right) {\n const op = mulMatch[2]!;\n return () => {\n const l = left() as number, r = right() as number;\n switch (op) {\n case '*': return l * r;\n case '/': return l / r;\n case '%': return l % r;\n }\n };\n }\n }\n\n // Template literals: `Hello ${name}`\n const tmplMatch = expr.match(RE_TEMPLATE_LIT);\n if (tmplMatch) {\n const raw = tmplMatch[1]!;\n // Pre-split template literal into static/dynamic segments\n const staticParts: string[] = [];\n const dynamicFns: (() => unknown)[] = [];\n let lastIndex = 0;\n // Create a fresh regex since RE_TEMPLATE_INTERP has the 'g' flag\n const re = new RegExp(RE_TEMPLATE_INTERP.source, 'g');\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n staticParts.push(raw.slice(lastIndex, m.index));\n const inner = parseExpression(m[1]!.trim(), scope);\n if (!inner) return null; // Can't parse inner expression\n dynamicFns.push(inner);\n lastIndex = re.lastIndex;\n }\n staticParts.push(raw.slice(lastIndex));\n\n // Optimized evaluation: concatenate instead of map+join\n return () => {\n let result = staticParts[0]!;\n for (let i = 0; i < dynamicFns.length; i++) {\n result += String(dynamicFns[i]!() ?? '');\n result += staticParts[i + 1] ?? '';\n }\n return result;\n };\n }\n\n // Can't parse — return null for fallback\n return null;\n}\n\n// ── Expression evaluator ──\n\nfunction getScopeCache<T>(cache: WeakMap<Scope, Map<string, T>>, scope: Scope): Map<string, T> {\n let scoped = cache.get(scope);\n if (!scoped) {\n scoped = new Map<string, T>();\n cache.set(scope, scoped);\n }\n return scoped;\n}\n\n/** Build an actionable hint for expressions/handlers that failed CSP-safe parsing. */\nfunction cspExpressionHint(expr: string): string {\n if (expr.includes('...')) {\n return `Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).`;\n }\n // Note: optional chaining (?.) is now supported by the CSP-safe parser.\n if (expr.includes('=>')) {\n return `Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).`;\n }\n return `Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true).`;\n}\n\nfunction buildEvaluator(expr: string, scope: Scope): () => unknown {\n const cleaned = expr.replace(RE_STRIP_BRACES, '').trim();\n const cache = getScopeCache(scopeExpressionCache, scope);\n const cached = cache.get(cleaned);\n if (cached) return cached;\n\n // Try CSP-safe parsing first\n const cspFn = parseExpression(cleaned, scope);\n if (cspFn) {\n cache.set(cleaned, cspFn);\n return cspFn;\n }\n\n // Fallback to Function constructor (for complex expressions)\n // __EVAL_CAPABLE__ is a compile-time constant — in the hardened build,\n // esbuild constant-folds it to false and eliminates this entire block,\n // ensuring no `new Function` appears in the hardened dist.\n if (!__EVAL_CAPABLE__ || !_allowUnsafeEval) {\n dbg('buildEvaluator: blocked unsafe eval fallback for expression:', cleaned);\n reportDiagnostic('expression-unsupported', cleaned, cspExpressionHint(cleaned));\n const blocked = () => undefined;\n cache.set(cleaned, blocked);\n return blocked;\n }\n\n // Apply UNSAFE_METHOD_NAMES blocklist before new Function — prevents\n // prototype-pollution and eval injection via the unsafe eval path.\n const blockedMethod = findBlockedMethod(cleaned);\n if (blockedMethod) {\n const msg = `Blocked unsafe method \"${blockedMethod}\" in expression`;\n reportDiagnostic('expression-unsupported', cleaned, msg);\n throw new Error(`[FormaJS] ${msg}: ${cleaned}`);\n }\n\n try {\n const fn = new Function('__scope', `with(__scope) { return (${cleaned}); }`);\n // Cache proxy — scope.getters is a mutable object, so the proxy\n // always reflects current state without needing to be recreated.\n const proxy = new Proxy(Object.create(null) as Record<string, unknown>, {\n has(_, key: string) { return key in scope.getters; },\n get(_, key: string) {\n // Defense-in-depth: block dangerous property access even if\n // findBlockedMethod missed a bypass (e.g. computed bracket names)\n if (UNSAFE_METHOD_NAMES.has(key)) return undefined;\n const g = scope.getters[key];\n return g ? g() : undefined;\n },\n });\n const unsafe = () => fn(proxy);\n cache.set(cleaned, unsafe);\n return unsafe;\n } catch {\n reportDiagnostic('expression-unsupported', cleaned, 'Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.');\n const failed = () => undefined;\n cache.set(cleaned, failed);\n return failed;\n }\n}\n\n// ── CSP-safe handler parser ──\n\n/**\n * Parse common handler patterns without `new Function()`.\n * Returns null if the expression is too complex for the CSP-safe parser.\n */\nfunction parseHandler(expr: string, scope: Scope): ((e: Event) => void) | null {\n const normalized = expr.trim().replace(/;+$/g, '').trim();\n if (!normalized) return null;\n\n const ifHandler = parseIfHandler(normalized, scope);\n if (ifHandler) return ifHandler;\n\n const stmts = splitTopLevelStatements(normalized);\n if (stmts.length > 1) {\n const handlers = stmts.map(s => parseHandler(s, scope));\n if (handlers.every(h => h !== null)) {\n return (e: Event) => {\n batch(() => {\n for (const h of handlers) h!(e);\n });\n };\n }\n return null;\n }\n\n const single = stmts[0] ?? normalized;\n\n // count++ or count--\n const incrMatch = single.match(RE_POST_INCR);\n if (incrMatch) {\n const name = incrMatch[1]!;\n const op = incrMatch[2]!;\n return () => {\n batch(() => {\n const val = scope.getters[name]?.() as number ?? 0;\n scope.setters[name]?.(op === '++' ? val + 1 : val - 1);\n });\n };\n }\n\n // ++count or --count\n const preIncrMatch = single.match(RE_PRE_INCR);\n if (preIncrMatch) {\n const op = preIncrMatch[1]!;\n const name = preIncrMatch[2]!;\n return () => {\n batch(() => {\n const val = scope.getters[name]?.() as number ?? 0;\n scope.setters[name]?.(op === '++' ? val + 1 : val - 1);\n });\n };\n }\n\n // prop = !prop (toggle)\n const toggleMatch = single.match(RE_TOGGLE);\n if (toggleMatch && toggleMatch[1] === toggleMatch[2]) {\n const name = toggleMatch[1]!;\n return () => {\n batch(() => {\n scope.setters[name]?.(!scope.getters[name]?.());\n });\n };\n }\n\n // prop = expr (simple assignment)\n const assignMatch = single.match(RE_ASSIGN);\n if (assignMatch) {\n const name = assignMatch[1]!;\n const valExpr = parseExpression(assignMatch[2]!.trim(), scope);\n if (valExpr) {\n if (_debug) dbg(`parseHandler: assignment \"${name} = ...\" — setter exists:`, !!scope.setters[name], ', getter exists:', !!scope.getters[name]);\n return () => {\n batch(() => {\n const val = valExpr();\n if (_debug) dbg(`SETTER: ${name} = ${val} (was: ${scope.getters[name]?.()})`);\n scope.setters[name]?.(val);\n });\n };\n }\n }\n\n // prop += value, prop -= value, prop *= value, prop /= value\n const compoundMatch = single.match(RE_COMPOUND);\n if (compoundMatch) {\n const name = compoundMatch[1]!;\n const op = compoundMatch[2]!;\n const valExpr = parseExpression(compoundMatch[3]!.trim(), scope);\n if (valExpr) {\n return () => {\n batch(() => {\n const current = scope.getters[name]?.() as number ?? 0;\n const val = valExpr() as number;\n switch (op) {\n case '+=': scope.setters[name]?.(current + val); break;\n case '-=': scope.setters[name]?.(current - val); break;\n case '*=': scope.setters[name]?.(current * val); break;\n case '/=': scope.setters[name]?.(current / val); break;\n }\n });\n };\n }\n }\n\n // $refetch('id') — imperative data-fetch trigger (CSP-safe)\n const refetchMatch = single.match(RE_REFETCH_CALL);\n if (refetchMatch) {\n const fetchId = refetchMatch[1]!;\n return () => $refetch(fetchId);\n }\n\n return null;\n}\n\nfunction buildHandler(expr: string, scope: Scope): HandlerBuildResult {\n // Strip balanced outer braces (e.g., `{count++}` → `count++`) but NOT\n // unbalanced ones like `if (x) { a = b }` where the `}` is a code-block close.\n let cleaned = expr.trim();\n if (cleaned.startsWith('{')) {\n const seg = readBalancedSegment(cleaned, 0, '{', '}');\n if (seg && seg.end === cleaned.length - 1) {\n cleaned = seg.inner.trim();\n }\n }\n const cache = getScopeCache(scopeHandlerCache, scope);\n const cached = cache.get(cleaned);\n if (cached) return cached;\n\n // Try CSP-safe parsing first\n const cspFn = parseHandler(cleaned, scope);\n if (cspFn) {\n const result: HandlerBuildResult = { handler: cspFn, supported: true };\n cache.set(cleaned, result);\n return result;\n }\n\n // Fallback to Function constructor (for complex expressions)\n // __EVAL_CAPABLE__ gate ensures hardened build eliminates this entire block.\n if (!__EVAL_CAPABLE__ || !_allowUnsafeEval) {\n dbg('buildHandler: blocked unsafe eval fallback for expression:', cleaned);\n reportDiagnostic('handler-unsupported', cleaned, cspExpressionHint(cleaned));\n const result: HandlerBuildResult = {\n handler: () => {},\n supported: false,\n };\n cache.set(cleaned, result);\n return result;\n }\n\n // Apply UNSAFE_METHOD_NAMES blocklist before new Function — prevents\n // prototype-pollution and eval injection via the unsafe eval path.\n const blockedMethod = findBlockedMethod(cleaned);\n if (blockedMethod) {\n const msg = `Blocked unsafe method \"${blockedMethod}\" in handler`;\n reportDiagnostic('handler-unsupported', cleaned, msg);\n throw new Error(`[FormaJS] ${msg}: ${cleaned}`);\n }\n\n try {\n // Accept both `$event` and bare `event` — Claude sometimes generates either.\n const fn = new Function('__scope', '$event', 'event', `with(__scope) { ${cleaned} }`);\n // Cache proxy — scope.getters/setters are mutable objects, so the proxy\n // always reflects current state without needing to be recreated.\n const proxy = new Proxy(Object.create(null) as Record<string, unknown>, {\n has(_, key: string) {\n // Do NOT intercept '$event' or 'event' — let them fall through to\n // function parameters so $event.key, event.stopPropagation(), etc. work.\n if (key === '$event' || key === 'event') return false;\n return key in scope.getters || key in scope.setters;\n },\n get(_, key: string) {\n // Defense-in-depth: block dangerous property access\n if (UNSAFE_METHOD_NAMES.has(key)) return undefined;\n const g = scope.getters[key];\n return g ? g() : undefined;\n },\n set(_, key: string, value: unknown) {\n const s = scope.setters[key];\n if (s) s(value);\n return true;\n },\n });\n const unsafeHandler = (e: Event) => {\n batch(() => fn(proxy, e, e));\n };\n const result: HandlerBuildResult = {\n handler: unsafeHandler,\n supported: true,\n };\n cache.set(cleaned, result);\n return result;\n } catch {\n reportDiagnostic('handler-unsupported', cleaned, 'Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.');\n const result: HandlerBuildResult = {\n handler: () => {},\n supported: false,\n };\n cache.set(cleaned, result);\n return result;\n }\n}\n\n// ── State initialization ──\n\nconst FORBIDDEN_STATE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction parseState(raw: string): Record<string, unknown> {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw);\n } catch {\n if (_debug) {\n dbg('parseState: Invalid JSON in data-forma-state — use valid JSON with quoted keys. Got:', raw.slice(0, 200));\n }\n return {};\n }\n // Strip prototype-pollution keys\n for (const key of FORBIDDEN_STATE_KEYS) {\n if (key in parsed) delete parsed[key];\n }\n return parsed;\n}\n\n// ── DOM scanner ──\n\nfunction initScope(stateEl: Element): Scope {\n const raw = stateEl.getAttribute('data-forma-state') ?? '{}';\n const state = parseState(raw);\n const keys = Object.keys(state);\n if (_debug) {\n dbg('initScope: parsed', keys.length, 'keys:', keys.join(', '));\n if (keys.length === 0) {\n dbg('initScope: WARNING — empty state! Raw attribute:', raw.slice(0, 200));\n }\n }\n const getters: Record<string, Getter> = {};\n const setters: Record<string, Setter> = {};\n\n for (const [key, initial] of Object.entries(state)) {\n const [get, set] = createSignal(initial);\n getters[key] = get;\n setters[key] = set as Setter;\n }\n\n // Inject $refetch as a callable getter so handlers can use $refetch('id')\n getters['$refetch'] = () => $refetch;\n\n return { getters, setters };\n}\n\n// ── Safe $el proxy ──\n// Allowlist of properties exposed on the $el magic. Everything else\n// (ownerDocument, parentNode, innerHTML, …) returns undefined so that\n// attacker-authored expressions cannot escape to window/document.\n\nconst SAFE_EL_PROPS = new Set([\n // Identity & attributes\n 'id', 'className', 'tagName', 'nodeName',\n 'getAttribute', 'setAttribute', 'removeAttribute', 'hasAttribute', 'toggleAttribute',\n 'dataset', 'classList',\n // Content\n 'textContent', 'innerText',\n // Form elements\n 'value', 'checked', 'disabled', 'selected', 'type', 'name', 'placeholder',\n 'readOnly', 'required', 'min', 'max', 'step', 'pattern',\n // Dimensions & position\n 'getBoundingClientRect', 'offsetWidth', 'offsetHeight',\n 'offsetTop', 'offsetLeft', 'clientWidth', 'clientHeight',\n 'scrollWidth', 'scrollHeight', 'scrollTop', 'scrollLeft',\n // Style\n 'style', 'hidden',\n // Focus & interaction\n 'focus', 'blur', 'click', 'scrollIntoView', 'scrollTo',\n // Traversal (safe — returns elements, not window/document)\n 'closest', 'matches', 'querySelector', 'querySelectorAll',\n 'children', 'childElementCount', 'firstElementChild', 'lastElementChild',\n 'nextElementSibling', 'previousElementSibling',\n]);\n\nfunction createSafeElProxy(el: Element): Element {\n return new Proxy(el, {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n if (!SAFE_EL_PROPS.has(prop)) return undefined;\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') return false;\n if (!SAFE_EL_PROPS.has(prop)) return false;\n return Reflect.set(target, prop, value);\n },\n });\n}\n\nfunction bindElement(el: Element, scope: Scope, disposers: (() => void)[]): void {\n // Inject per-element magics: $el and $dispatch\n // Each element gets its own child scope so $el resolves to the correct element.\n const elMagics: Record<string, unknown> = {\n $el: createSafeElProxy(el),\n $dispatch: (name: string, detail?: unknown) => {\n el.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true, // crosses Shadow DOM boundaries (important for <forma-stage>)\n detail,\n }));\n },\n };\n scope = createChildScope(scope, elMagics);\n\n // When the server provides a directive map, we know exactly which directives\n // this element has. Skip getAttribute calls for directives it doesn't have.\n // `known` is null when no map is available (fallback: check everything).\n const known = getDirectives(el);\n\n // data-computed=\"name = expr\" or \"a = expr1; b = expr2\"\n const computedAttr = (!known || known.has('data-computed')) ? el.getAttribute('data-computed') : null;\n if (computedAttr) {\n // Split multi-statement computed: \"a = expr1; b = expr2; c = expr3\"\n // Uses lookahead to split at \"; identifier =\" boundaries without\n // breaking arrow functions (=>) or comparisons (===, ==).\n const parts = computedAttr.split(/;\\s*(?=\\w+\\s*=[^=])/);\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed) continue;\n const match = trimmed.match(RE_COMPUTED);\n if (match) {\n const name = match[1]!;\n const expr = match[2]!;\n // Remove the computed name from getters before building evaluator\n // to prevent self-referential cycle (computed reading itself)\n const prevGetter = scope.getters[name];\n delete scope.getters[name];\n const evaluate = buildEvaluator(`{${expr}}`, scope);\n const getter = createComputed(evaluate);\n scope.getters[name] = getter;\n // Keep the original setter so manual overrides still work\n if (!prevGetter) {\n // If there was no initial state entry, remove the setter too\n delete scope.setters[name];\n }\n }\n }\n }\n\n // data-text=\"{expr}\"\n const textExpr = (!known || known.has('data-text')) ? el.getAttribute('data-text') : null;\n if (textExpr) {\n const evaluate = buildEvaluator(textExpr, scope);\n const dispose = internalEffect(() => {\n setElementTextFast(el, toTextValue(evaluate()));\n });\n disposers.push(dispose);\n }\n\n // data-show=\"{expr}\"\n const showExpr = (!known || known.has('data-show')) ? el.getAttribute('data-show') : null;\n if (showExpr) {\n const evaluate = buildEvaluator(showExpr, scope);\n const transition = parseTransitionSpec(el);\n if (_debug) {\n const tag = el.tagName.toLowerCase();\n const cls = el.className ? `.${String(el.className).split(' ')[0]}` : '';\n dbg(`bindElement: data-show=\"${showExpr}\" on <${tag}${cls}>`);\n }\n let initialized = false;\n const dispose = internalEffect(() => {\n const visible = !!evaluate();\n if (_debug) dbg(`data-show effect: \"${showExpr}\" → ${visible}`);\n applyShowVisibility(el as HTMLElement, visible, transition, !initialized);\n initialized = true;\n });\n disposers.push(dispose);\n if (transition) {\n disposers.push(() => clearTransitionState(el as HTMLElement));\n }\n }\n\n // data-if=\"{expr}\" — conditional DOM insertion/removal with optional transitions\n const ifExpr = (!known || known.has('data-if')) ? el.getAttribute('data-if') : null;\n if (ifExpr) {\n const evaluate = buildEvaluator(ifExpr, scope);\n const transition = parseTransitionSpec(el);\n const placeholder = document.createComment('forma-if');\n const parent = el.parentNode;\n let inserted = true;\n let initialized = false;\n\n const dispose = internalEffect(() => {\n const show = !!evaluate();\n\n if (show && !inserted) {\n // Cancel any in-flight leave\n clearTransitionState(el as HTMLElement);\n el.removeAttribute('data-forma-leaving');\n if (initialized && transition) {\n transitionInsert(el as HTMLElement, parent!, placeholder, transition);\n } else {\n parent?.insertBefore(el, placeholder);\n }\n inserted = true;\n } else if (!show && inserted) {\n if (initialized && transition) {\n transitionRemove(el as HTMLElement, transition, () => {\n if (el.parentNode) {\n parent?.insertBefore(placeholder, el);\n el.remove();\n }\n });\n } else {\n parent?.insertBefore(placeholder, el);\n el.remove();\n }\n inserted = false;\n }\n initialized = true;\n });\n\n disposers.push(dispose);\n if (transition) {\n disposers.push(() => clearTransitionState(el as HTMLElement));\n }\n }\n\n // data-model=\"{prop}\"\n const modelExpr = (!known || known.has('data-model')) ? el.getAttribute('data-model') : null;\n if (modelExpr) {\n const prop = modelExpr.replace(RE_STRIP_BRACES, '').trim();\n const getter = scope.getters[prop];\n const setter = scope.setters[prop];\n if (getter && setter) {\n const input = el as HTMLInputElement;\n const dispose = internalEffect(() => {\n const val = getter();\n if (input.type === 'checkbox') {\n input.checked = !!val;\n } else {\n input.value = String(val ?? '');\n }\n });\n disposers.push(dispose);\n const event = input.type === 'checkbox' ? 'change' : 'input';\n const onModelInput = () => {\n if (input.type === 'checkbox') {\n setter(input.checked);\n } else if (input.type === 'number' || input.type === 'range') {\n setter(Number(input.value));\n } else {\n setter(input.value);\n }\n };\n input.addEventListener(event, onModelInput);\n disposers.push(() => {\n input.removeEventListener(event, onModelInput);\n });\n }\n }\n\n // Single-pass over attributes for data-on:*, data-class:*, data-bind:*\n // When directive map is available, skip the loop entirely if none of these are present.\n const hasColonDirectives = !known || hasAnyPrefix(known, 'data-on:', 'data-class:', 'data-bind:');\n const attrs = el.attributes;\n if (hasColonDirectives) for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i]!;\n const name = attr.name;\n\n if (name.startsWith('data-on:')) {\n const event = name.slice(8); // 'data-on:'.length === 8\n const built = buildHandler(attr.value, scope);\n const handler = built.handler;\n if (_debug) {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n const cls = el.className ? `.${String(el.className).split(' ')[0]}` : '';\n dbg(`bindElement: data-on:${event}=\"${attr.value}\" on <${tag}${id}${cls}>`);\n }\n if (!built.supported) {\n el.setAttribute('data-forma-handler-error', 'unsupported');\n } else if (el.hasAttribute('data-forma-handler-error')) {\n el.removeAttribute('data-forma-handler-error');\n }\n if (_debug) {\n const attrVal = attr.value;\n const tracedHandler = (e: Event) => {\n dbg(`HANDLER FIRED: data-on:${event}=\"${attrVal}\"`, 'isTrusted:', e.isTrusted);\n handler(e);\n };\n el.addEventListener(event, tracedHandler);\n disposers.push(() => { el.removeEventListener(event, tracedHandler); });\n } else {\n el.addEventListener(event, handler);\n disposers.push(() => { el.removeEventListener(event, handler); });\n }\n } else if (name.startsWith('data-class:')) {\n const cls = name.slice(11); // 'data-class:'.length === 11\n const evaluate = buildEvaluator(attr.value, scope);\n const dispose = internalEffect(() => {\n el.classList.toggle(cls, !!evaluate());\n });\n disposers.push(dispose);\n } else if (name.startsWith('data-bind:')) {\n const attrName = name.slice(10); // 'data-bind:'.length === 10\n const evaluate = buildEvaluator(attr.value, scope);\n const dispose = internalEffect(() => {\n const val = evaluate();\n if (val == null || val === false) {\n el.removeAttribute(attrName);\n } else {\n const str = String(val);\n // Drop event-handler and dangerous-URL bindings — a bound value from\n // state/data-fetch must not be able to inject javascript: URLs or\n // inline handlers. Applies to standard and hardened builds alike.\n if (isUnsafeAttrBinding(attrName, str)) {\n el.removeAttribute(attrName);\n } else {\n el.setAttribute(attrName, str);\n }\n }\n });\n disposers.push(dispose);\n }\n }\n\n // data-persist=\"{prop}\"\n const persistExpr = (!known || known.has('data-persist')) ? el.getAttribute('data-persist') : null;\n if (persistExpr) {\n const prop = persistExpr.replace(RE_STRIP_BRACES, '').trim();\n const getter = scope.getters[prop];\n const setter = scope.setters[prop];\n if (getter && setter) {\n const key = 'forma:' + prop;\n try {\n const saved = localStorage.getItem(key);\n if (saved !== null) setter(JSON.parse(saved));\n } catch { /* ignore parse errors */ }\n const dispose = internalEffect(() => {\n try { localStorage.setItem(key, JSON.stringify(getter())); } catch { /* quota */ }\n });\n disposers.push(dispose);\n }\n }\n\n // data-list=\"{expr}\" — keyed reconciliation with LIS\n const listExpr = (!known || known.has('data-list')) ? el.getAttribute('data-list') : null;\n if (listExpr) {\n const evaluate = buildEvaluator(listExpr, scope);\n const templateEl = el.children[0] as Element | undefined;\n if (templateEl) {\n const template = templateEl.cloneNode(true) as Element;\n // Remove original template from DOM\n el.removeChild(templateEl);\n\n // Detect key attribute: data-key=\"{item.id}\" -> extracts \"id\"\n const keyAttr = template.getAttribute('data-key');\n const keyProp = keyAttr\n ? keyAttr.replace(RE_STRIP_ITEM_BRACES, '').trim()\n : null;\n\n // Parse transition spec from the list container element\n const listTransition = parseTransitionSpec(el);\n\n let oldItems: unknown[] = [];\n let oldNodes: Node[] = [];\n\n // For index-based keying (no data-key), we wrap items in objects\n // that carry their index so the keyFn can extract it without a\n // second argument. For property-based keying, items pass through raw.\n interface IndexWrapped { __idx: number; __item: unknown }\n\n /** Dispose all bindings stored on a clone element */\n function disposeCloneBindings(node: Node): void {\n const el = node as any;\n if (Array.isArray(el.__formaDisposers)) {\n for (const d of el.__formaDisposers) {\n try { d(); } catch { /* ensure all disposers run */ }\n }\n delete el.__formaDisposers;\n }\n }\n\n /** Clone template, bind directives via child scope */\n function createBoundClone(item: unknown, index: number): Element {\n const clone = cloneWithTemplateData(template, item);\n const childScope = createChildScope(scope, { item, index });\n const itemDisposers: (() => void)[] = [];\n bindElement(clone, childScope, itemDisposers);\n for (const desc of Array.from(clone.querySelectorAll('*'))) {\n bindElement(desc, childScope, itemDisposers);\n }\n (clone as any).__formaDisposers = itemDisposers;\n return clone;\n }\n\n /** Dispose old bindings and rebind with fresh data */\n function updateBoundClone(node: Node, item: unknown, index: number): void {\n disposeCloneBindings(node);\n updateTemplateData(node as Element, item);\n const childScope = createChildScope(scope, { item, index });\n const itemDisposers: (() => void)[] = [];\n bindElement(node as Element, childScope, itemDisposers);\n for (const desc of Array.from((node as Element).querySelectorAll('*'))) {\n bindElement(desc, childScope, itemDisposers);\n }\n (node as any).__formaDisposers = itemDisposers;\n }\n\n // Build transition hooks for reconcileList (only when transition attrs present)\n const listHooks: ListTransitionHooks | undefined = listTransition ? {\n onInsert: (node: Node) => {\n const htmlEl = node as HTMLElement;\n if (!htmlEl.setAttribute) return; // text node guard\n const state = getTransitionState(htmlEl);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n state.cancel = runTransitionPhase(\n htmlEl,\n {\n base: listTransition.enter,\n from: listTransition.enterFrom,\n to: listTransition.enterTo,\n durationMs: listTransition.enterDurationMs,\n },\n () => {\n const current = getTransitionState(htmlEl);\n if (current.token === token) current.cancel = null;\n },\n );\n },\n onBeforeRemove: (node: Node, done: () => void) => {\n const htmlEl = node as HTMLElement;\n if (!htmlEl.setAttribute) { done(); return; } // text node guard\n disposeCloneBindings(node);\n transitionRemove(htmlEl, listTransition, () => {\n done();\n });\n },\n } : undefined;\n\n const dispose = internalEffect(() => {\n const rawItems = evaluate();\n if (!Array.isArray(rawItems)) {\n // Remove all — dispose bindings first\n for (const n of oldNodes) {\n disposeCloneBindings(n);\n el.removeChild(n);\n }\n oldItems = [];\n oldNodes = [];\n return;\n }\n\n // Cancel any in-flight leave animations before reconciliation\n if (listTransition) {\n const leavingNodes = el.querySelectorAll('[data-forma-leaving]');\n for (const ln of Array.from(leavingNodes)) {\n clearTransitionState(ln as HTMLElement);\n ln.removeAttribute('data-forma-leaving');\n if (ln.parentNode) ln.parentNode.removeChild(ln);\n }\n }\n\n // Snapshot old nodes before reconciliation to detect removals\n const prevNodes = new Set(oldNodes);\n\n if (keyProp) {\n // ── Property-based keying ──\n const result = reconcileList(\n el,\n oldItems,\n rawItems,\n oldNodes,\n (item: unknown) => String((item as Record<string, unknown>)?.[keyProp] ?? ''),\n (item: unknown) => {\n const idx = rawItems.indexOf(item);\n return createBoundClone(item, idx);\n },\n (node: Node, item: unknown) => {\n const idx = rawItems.indexOf(item);\n updateBoundClone(node, item, idx);\n },\n undefined, // beforeNode\n listHooks,\n );\n // Dispose bindings on nodes that were removed by reconcileList\n const nextNodes = new Set(result.nodes);\n for (const n of prevNodes) {\n if (!nextNodes.has(n)) {\n // Skip nodes mid-leave — onBeforeRemove already disposed them\n if ((n as Element).hasAttribute?.('data-forma-leaving')) continue;\n disposeCloneBindings(n);\n }\n }\n oldItems = result.items;\n oldNodes = result.nodes;\n } else {\n // ── Index-based keying ──\n // Wrap items so each carries its index as the key.\n const wrapped: IndexWrapped[] = rawItems.map((item, i) => ({ __idx: i, __item: item }));\n const oldWrapped = oldItems as IndexWrapped[];\n\n const result = reconcileList<IndexWrapped>(\n el,\n oldWrapped,\n wrapped,\n oldNodes,\n (w: IndexWrapped) => w.__idx,\n (w: IndexWrapped) => createBoundClone(w.__item, w.__idx),\n (node: Node, w: IndexWrapped) => updateBoundClone(node, w.__item, w.__idx),\n undefined, // beforeNode\n listHooks,\n );\n // Dispose bindings on nodes that were removed by reconcileList\n const nextNodes = new Set(result.nodes);\n for (const n of prevNodes) {\n if (!nextNodes.has(n)) {\n // Skip nodes mid-leave — onBeforeRemove already disposed them\n if ((n as Element).hasAttribute?.('data-forma-leaving')) continue;\n disposeCloneBindings(n);\n }\n }\n oldItems = result.items;\n oldNodes = result.nodes;\n }\n });\n disposers.push(dispose);\n }\n }\n\n // data-fetch=\"[METHOD] url → prop [|loading:prop] [|error:prop] [|poll:ms]\"\n const fetchExpr = (!known || known.has('data-fetch')) ? el.getAttribute('data-fetch') : null;\n if (fetchExpr) {\n const arrowMatch = fetchExpr.match(RE_FETCH);\n if (arrowMatch) {\n const urlPart = arrowMatch[1]!.trim();\n const target = arrowMatch[2]!.trim();\n const modifiers = arrowMatch[3]?.trim() ?? '';\n\n let method = 'GET';\n let url = urlPart;\n const methodMatch = urlPart.match(RE_FETCH_METHOD);\n if (methodMatch) {\n method = methodMatch[1]!.toUpperCase();\n url = methodMatch[2]!.trim();\n }\n\n let loadingTarget: string | undefined;\n let errorTarget: string | undefined;\n let interval: number | undefined;\n for (const mod of modifiers.split('|').filter(Boolean)) {\n const [k, v] = mod.split(':').map(s => s.trim());\n if (k === 'loading') loadingTarget = v;\n else if (k === 'error') errorTarget = v;\n else if (k === 'poll') interval = parseInt(v ?? '0', 10);\n }\n\n // Create signals for target, loading, and error\n const [getTarget, setTarget] = createSignal<unknown>(null);\n scope.getters[target] = getTarget;\n scope.setters[target] = setTarget as Setter;\n if (loadingTarget) {\n const [gl, sl] = createSignal(false);\n scope.getters[loadingTarget] = gl;\n scope.setters[loadingTarget] = sl as Setter;\n }\n if (errorTarget) {\n const [ge, se] = createSignal<unknown>(null);\n scope.getters[errorTarget] = ge;\n scope.setters[errorTarget] = se as Setter;\n }\n\n const doFetch = () => {\n if (loadingTarget) scope.setters[loadingTarget]!(true);\n fetch(url, { method })\n .then(r => r.json())\n .then(data => {\n setTarget(data);\n if (loadingTarget) scope.setters[loadingTarget]!(false);\n })\n .catch(err => {\n if (errorTarget) scope.setters[errorTarget]!(err.message);\n if (loadingTarget) scope.setters[loadingTarget]!(false);\n });\n };\n\n // Register in $refetch registry if data-fetch-id is present\n const fetchId = el.getAttribute('data-fetch-id');\n if (fetchId) {\n _refetchRegistry.set(fetchId, doFetch);\n disposers.push(() => _refetchRegistry.delete(fetchId));\n }\n\n doFetch();\n if (interval && interval > 0) {\n const id = setInterval(doFetch, interval);\n disposers.push(() => clearInterval(id));\n }\n }\n }\n}\n\n// ── Scope mounting / unmounting (single data-forma-state element) ──\n\n/**\n * Mount a single `data-forma-state` element — creates signals, binds\n * all descendants, stores disposers on the element for cleanup.\n * Idempotent: skips elements that are already mounted.\n */\n/** CSS selector matching elements with at least one Forma directive.\n * Avoids scanning every descendant — only visits directive-bearing elements. */\nconst DIRECTIVE_SELECTOR = [\n '[data-text]', '[data-show]', '[data-if]', '[data-model]',\n '[data-computed]', '[data-persist]', '[data-list]', '[data-fetch]',\n '[data-bind\\\\:*]', '[data-class\\\\:*]', '[data-on\\\\:*]',\n // Catch-all for colon-prefixed data attrs that the escaped selectors miss in some engines\n '[data-transition]',\n].join(',');\n\n/** Fast check: does this element have any Forma directive attribute? */\nfunction hasDirective(el: Element): boolean {\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const name = attrs[i]!.name;\n if (name.startsWith('data-text') || name.startsWith('data-show') ||\n name.startsWith('data-if') || name.startsWith('data-model') ||\n name.startsWith('data-computed') || name.startsWith('data-persist') ||\n name.startsWith('data-list') || name.startsWith('data-fetch') ||\n name.startsWith('data-on:') || name.startsWith('data-class:') ||\n name.startsWith('data-bind:') || name.startsWith('data-transition')) {\n return true;\n }\n }\n return false;\n}\n\n// ── Pre-compiled Directive Map ──\n//\n// When the server sends a directive_map sidecar (data-forma-id → directive names),\n// the runtime uses it in two ways:\n//\n// 1. mountScope(): targeted CSS selector queries only directive-bearing elements\n// instead of querySelectorAll('*') + attribute scan on every descendant.\n//\n// 2. bindElement(): skips getAttribute calls for directives the element doesn't\n// have, avoiding unnecessary work for elements with only 1-2 directives.\n\n/** Full map: data-forma-id → Set of directive attribute names. */\nlet _directiveMap: Map<string, Set<string>> | null = null;\n\n/**\n * Load a pre-compiled directive map from the server.\n * Keys are data-forma-id values, values are arrays of directive attribute names.\n */\nfunction setDirectiveMap(map: Record<string, string[]> | null): void {\n if (!map || Object.keys(map).length === 0) {\n _directiveMap = null;\n return;\n }\n _directiveMap = new Map();\n for (const id in map) {\n _directiveMap.set(id, new Set(map[id]!));\n }\n}\n\n/**\n * Build a CSS selector that targets only elements with known directives.\n * Returns null when the map has too many entries (selector would be huge)\n * or when no map is available.\n */\nfunction buildDirectiveSelector(): string | null {\n if (!_directiveMap || _directiveMap.size === 0) return null;\n // Cap at 200 IDs to avoid pathologically long selectors.\n // Above that, querySelectorAll('*') + Set check is likely faster.\n if (_directiveMap.size > 200) return null;\n const parts: string[] = [];\n for (const id of _directiveMap.keys()) {\n parts.push(`[data-forma-id=\"${id}\"]`);\n }\n return parts.join(',');\n}\n\n/** Get the directive set for an element, or null if unknown. */\nfunction getDirectives(el: Element): Set<string> | null {\n if (!_directiveMap) return null;\n const id = el.getAttribute('data-forma-id');\n if (!id) return null;\n return _directiveMap.get(id) ?? null;\n}\n\n/** Check if any entry in a Set starts with one of the given prefixes. */\nfunction hasAnyPrefix(set: Set<string>, ...prefixes: string[]): boolean {\n for (const entry of set) {\n for (const prefix of prefixes) {\n if (entry.startsWith(prefix)) return true;\n }\n }\n return false;\n}\n\nfunction mountScope(root: Element): void {\n // Idempotency guard — never double-bind\n if ((root as any).__formaDisposers) {\n if (_debug) dbg('mountScope: SKIPPED (already mounted)');\n return;\n }\n\n const scope = initScope(root);\n const disposers: (() => void)[] = [];\n\n // Build $refs — a lazy proxy that resolves data-ref=\"name\" to elements.\n // Scanned once at mount time; the proxy resolves lazily on access.\n const refsMap = new Map<string, Element>();\n const refEls = root.querySelectorAll('[data-ref]');\n for (let i = 0; i < refEls.length; i++) {\n const el = refEls[i]!;\n const name = el.getAttribute('data-ref');\n if (name) refsMap.set(name, el);\n }\n // Also check the root itself\n const rootRefName = root.getAttribute('data-ref');\n if (rootRefName) refsMap.set(rootRefName, root);\n\n scope.getters['$refs'] = () => new Proxy({} as Record<string, Element>, {\n get(_, name: string) {\n return refsMap.get(name) ?? undefined;\n },\n has(_, name: string) {\n return refsMap.has(name);\n },\n });\n\n // Bind the root itself\n bindElement(root, scope, disposers);\n\n // Bind only directive-bearing descendants (skip inert elements).\n // When the server provides a directive map, we build a targeted CSS selector\n // that queries only elements with known directives — no querySelectorAll('*').\n let boundCount = 0;\n const selector = buildDirectiveSelector();\n if (selector) {\n // Fast path: query only elements the server told us have directives\n const targets = root.querySelectorAll(selector);\n for (let i = 0; i < targets.length; i++) {\n bindElement(targets[i]!, scope, disposers);\n boundCount++;\n }\n } else {\n // Fallback: scan all descendants and check attributes\n const descendants = root.querySelectorAll('*');\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i]!;\n if (hasDirective(el)) {\n bindElement(el, scope, disposers);\n boundCount++;\n }\n }\n }\n\n // Store disposers on the root element for cleanup\n (root as any).__formaDisposers = disposers;\n // Expose scope for devtools (State Inspector panel)\n (root as any).__formaScope = scope;\n (root as any).__formaInitialState = root.getAttribute('data-forma-state') ?? '{}';\n if (_debug) dbg('mountScope: DONE —', boundCount, 'elements bound,', disposers.length, 'disposers', selector ? '(targeted)' : '(full scan)');\n}\n\n/**\n * Unmount a single `data-forma-state` element — disposes all effects,\n * intervals, and event listeners. Safe to call on already-unmounted elements.\n */\nfunction unmountScope(root: Element): void {\n const disposers = (root as any).__formaDisposers as (() => void)[] | undefined;\n if (disposers) {\n for (const d of disposers) {\n try { d(); } catch { /* ensure all disposers run */ }\n }\n delete (root as any).__formaDisposers;\n delete (root as any).__formaScope;\n delete (root as any).__formaInitialState;\n }\n}\n\n// ── MutationObserver — auto-discovery of new data-forma-state elements ──\n//\n// Cost: O(addedNodes) per mutation batch. Never re-scans the whole document.\n// The observer only fires for childList mutations (nodes added/removed) and\n// attribute mutations on the `data-forma-state` attribute specifically.\n\nlet _observer: MutationObserver | null = null;\nconst ELEMENT_NODE = 1;\nconst MUTATION_CHUNK_SIZE = 40;\nlet _pendingMutations: MutationRecord[] = [];\nlet _drainingMutations = false;\n\nfunction processMutation(mutation: MutationRecord): void {\n // ── Removed nodes: clean up disposers to prevent memory leaks ──\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const node = mutation.removedNodes[i]!;\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element;\n if (el.hasAttribute('data-forma-state')) {\n if (_debug) dbg('MutationObserver: REMOVED scope');\n unmountScope(el);\n }\n const removed = el.querySelectorAll('[data-forma-state]');\n for (let j = 0; j < removed.length; j++) {\n unmountScope(removed[j]!);\n }\n }\n\n // ── Added nodes: auto-mount new scopes ──\n for (let i = 0; i < mutation.addedNodes.length; i++) {\n const node = mutation.addedNodes[i]!;\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element;\n if (el.closest('[data-forma-leaving]')) continue;\n if (el.hasAttribute('data-forma-state')) {\n if (_debug) dbg('MutationObserver: ADDED scope via mutation');\n mountScope(el);\n }\n const added = el.querySelectorAll('[data-forma-state]');\n if (_debug && added.length > 0) {\n dbg('MutationObserver: found', added.length, 'nested scope(s) in added subtree');\n }\n for (let j = 0; j < added.length; j++) {\n const desc = added[j]!;\n if (desc.closest('[data-forma-leaving]')) continue;\n mountScope(desc);\n }\n }\n\n // ── Attribute change: data-forma-state added/removed/changed ──\n if (mutation.type === 'attributes' && mutation.attributeName === 'data-forma-state') {\n const target = mutation.target as Element;\n // Always unmount first (cleans up old bindings)\n unmountScope(target);\n // Re-mount if the attribute still exists (value may have changed)\n if (target.hasAttribute('data-forma-state')) {\n mountScope(target);\n }\n }\n}\n\nasync function drainMutationQueue(): Promise<void> {\n try {\n while (_pendingMutations.length > 0) {\n const batch = _pendingMutations.splice(0, MUTATION_CHUNK_SIZE);\n for (let i = 0; i < batch.length; i++) {\n processMutation(batch[i]!);\n }\n if (_pendingMutations.length > 0) {\n await yieldToMain();\n }\n }\n } finally {\n _drainingMutations = false;\n // Handle races where new mutations were queued after the while-check.\n if (_pendingMutations.length > 0 && !_drainingMutations) {\n _drainingMutations = true;\n void drainMutationQueue();\n }\n }\n}\n\nfunction handleMutations(mutations: MutationRecord[]): void {\n if (_debug) dbg('MutationObserver: queued', mutations.length, 'mutation(s)');\n _pendingMutations.push(...mutations);\n if (_drainingMutations) return;\n _drainingMutations = true;\n void drainMutationQueue();\n}\n\nfunction startObserver(): void {\n if (_observer) return;\n _observer = new MutationObserver(handleMutations);\n const target = document.body || document.documentElement;\n if (target) {\n _observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-forma-state'],\n });\n }\n}\n\nfunction stopObserver(): void {\n if (_observer) {\n _observer.disconnect();\n _observer = null;\n }\n}\n\n// ── Main init ──\n\nfunction initRuntime(): void {\n if (_autoContainment) {\n applyContainmentHints(document, { skipIfAlreadySet: true });\n }\n const stateRoots = document.querySelectorAll('[data-forma-state]');\n if (_debug) dbg('initRuntime: found', stateRoots.length, 'scope(s)');\n for (const root of Array.from(stateRoots)) {\n mountScope(root);\n }\n // Start auto-discovery after initial scan\n startObserver();\n if (_debug) dbg('initRuntime: MutationObserver started');\n}\n\n/** Dispose all FormaJS scopes — clears effects, intervals, event listeners, and stops the observer. */\nfunction destroyRuntime(): void {\n stopObserver();\n const stateRoots = document.querySelectorAll('[data-forma-state]');\n for (const root of Array.from(stateRoots)) {\n unmountScope(root);\n }\n}\n\n/**\n * Mount a specific element or subtree — scans for `data-forma-state`\n * elements and initializes their reactive bindings.\n *\n * Use this for manual control when injecting HTML dynamically.\n * With the MutationObserver active, this is usually not needed.\n *\n * @param el - The root element to scan (checks itself and all descendants).\n */\nfunction mount(el: Element): void {\n if (el.hasAttribute('data-forma-state')) {\n mountScope(el);\n }\n const descendants = el.querySelectorAll('[data-forma-state]');\n for (const desc of Array.from(descendants)) {\n mountScope(desc);\n }\n}\n\n/**\n * Unmount a specific element or subtree — disposes all reactive bindings\n * for `data-forma-state` elements within.\n *\n * @param el - The root element to clean up (checks itself and all descendants).\n */\nfunction unmount(el: Element): void {\n if (el.hasAttribute('data-forma-state')) {\n unmountScope(el);\n }\n const descendants = el.querySelectorAll('[data-forma-state]');\n for (const desc of Array.from(descendants)) {\n unmountScope(desc);\n }\n}\n\n// Auto-init in browser contexts on DOMContentLoaded (or immediately if already loaded).\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initRuntime);\n } else {\n initRuntime();\n }\n}\n\n/** Enable/disable debug logging. Also toggleable via window.__FORMA_DEBUG = true */\nfunction setDebug(on: boolean): void { _debug = on; }\n/** Set unsafe-eval mode. `locked-off` is hardened and non-toggleable via setUnsafeEval. */\nfunction setUnsafeEvalMode(mode: UnsafeEvalMode): void {\n if (_unsafeEvalMode === mode) return;\n _unsafeEvalMode = mode;\n if (mode === 'locked-off') _allowUnsafeEval = false;\n if (mode === 'locked-on') _allowUnsafeEval = true;\n if (mode === 'mutable') _allowUnsafeEval = true;\n // Rebuild caches whenever policy changes.\n scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n}\n/** Enable/disable unsafe `new Function` fallback for complex expressions. */\nfunction setUnsafeEval(on: boolean): void {\n if (_unsafeEvalMode !== 'mutable') {\n dbg(\n `setUnsafeEval ignored (mode=${_unsafeEvalMode}); unsafe fallback is locked`,\n );\n return;\n }\n if (_allowUnsafeEval === on) return;\n _allowUnsafeEval = on;\n // Rebuild handlers/evaluators after mode change so cached blocked results\n // don't persist when toggling trusted mode at runtime.\n scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n}\n/** Get current unsafe-eval policy mode. */\nfunction getUnsafeEvalMode(): UnsafeEvalMode { return _unsafeEvalMode; }\n/** Enable/disable runtime diagnostics for unsupported expressions/handlers. */\nfunction setDiagnostics(on: boolean): void { _diagnosticsEnabled = on; }\n\n/** Runtime diagnostics captured while parsing/binding templates. */\nfunction getDiagnostics(): RuntimeDiagnostic[] {\n return Array.from(diagnostics.values()).map(d => ({ ...d }));\n}\n\n/** Clear runtime diagnostics collected so far. */\nfunction clearDiagnostics(): void {\n diagnostics.clear();\n}\n\n// ── DevTools API — State Inspector ──\n\ninterface ScopeDescriptor {\n element: Element;\n id: string;\n values: Record<string, { value: unknown; type: string }>;\n initialJSON: string;\n}\n\n/**\n * DevTools: enumerate all active scopes and their current signal values.\n * Only called when the State Inspector panel is open — zero overhead otherwise.\n */\nfunction getScopes(): ScopeDescriptor[] {\n const roots = document.querySelectorAll('[data-forma-state]');\n const result: ScopeDescriptor[] = [];\n\n for (const root of Array.from(roots)) {\n if (root.closest('[data-forma-leaving]')) continue;\n const scope = (root as any).__formaScope as Scope | undefined;\n const initialJSON = (root as any).__formaInitialState as string | undefined;\n if (!scope) continue;\n\n const values: Record<string, { value: unknown; type: string }> = {};\n for (const key of Object.keys(scope.getters)) {\n const val = scope.getters[key]!();\n values[key] = { value: val, type: typeof val };\n }\n\n result.push({\n element: root,\n id: root.getAttribute('data-forma-id') || root.id || root.tagName.toLowerCase(),\n values,\n initialJSON: initialJSON ?? '{}',\n });\n }\n return result;\n}\n\n/**\n * DevTools: set a state value on a specific scope element.\n * Triggers normal reactive effects (data-show, data-text, etc.).\n */\nfunction setScopeValue(element: Element, key: string, value: unknown): void {\n const scope = (element as any).__formaScope as Scope | undefined;\n if (!scope?.setters[key]) return;\n batch(() => { scope.setters[key]!(value); });\n}\n\n/**\n * DevTools: reset all values on a scope to their initial JSON state.\n */\nfunction resetScope(element: Element): void {\n const scope = (element as any).__formaScope as Scope | undefined;\n const initialJSON = (element as any).__formaInitialState as string | undefined;\n if (!scope || !initialJSON) return;\n\n const initial = parseState(initialJSON);\n batch(() => {\n for (const [key, val] of Object.entries(initial)) {\n scope.setters[key]?.(val);\n }\n });\n}\n\n// ── Reconciler ──\n\nlet _reconciler: ((container: Element, html: string) => void) | null = null;\n\nfunction getReconciler() {\n if (!_reconciler) {\n _reconciler = createReconciler({\n mountScope,\n unmountScope,\n disconnectObserver() {\n if (_observer) {\n _observer.disconnect();\n }\n },\n reconnectObserver() {\n if (_observer) {\n const target = document.body || document.documentElement;\n if (target) {\n _observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-forma-state'],\n });\n }\n }\n },\n batch,\n });\n }\n return _reconciler;\n}\n\n/** Reconcile a container's DOM against a new HTML string. */\nfunction reconcile(container: Element, html: string): void {\n getReconciler()(container, html);\n}\n\nexport {\n initRuntime,\n destroyRuntime,\n mount,\n unmount,\n reconcile,\n setDebug,\n setUnsafeEvalMode,\n getUnsafeEvalMode,\n setUnsafeEval,\n yieldToMain,\n applyContainmentHints,\n setDirectiveMap,\n setDiagnostics,\n getDiagnostics,\n clearDiagnostics,\n getScopes,\n setScopeValue,\n resetScope,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/reactive/dev.ts","../src/reactive/signal.ts","../src/reactive/effect.ts","../src/reactive/computed.ts","../src/reactive/batch.ts","../src/dom/list.ts","../src/dom/reconcile.ts","../src/security/url-safety.ts","../src/runtime.ts"],"names":["createRawSignal","rawEffect","rawComputed","reconcile","value","disposeCloneBindings","el","createBoundClone","updateBoundClone","batch"],"mappings":"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","file":"runtime-hardened.js","sourcesContent":["/**\n * Forma Reactive - Dev Mode\n *\n * Development utilities stripped from production builds via __DEV__ flag.\n * Bundlers replace __DEV__ with false → dead-code elimination removes all dev paths.\n */\n\n// __DEV__ is replaced by the bundler (tsup define) for dead-code elimination in\n// dist. For unbundled/raw-source usage it derives from NODE_ENV, and — when the\n// environment is indeterminate — defaults to *false* (production-safe: no console\n// noise) unless a consumer opts in via a global __FORMA_DEV__.\ndeclare const process: { env?: Record<string, string | undefined> } | undefined;\ndeclare const __FORMA_DEV__: boolean | undefined;\n\n/**\n * Lazily evaluate whether we're in a dev environment. Read per-call (not frozen\n * at import) so runtime NODE_ENV changes are honored and so official prod dist\n * builds — where tsup hard-defines __DEV__ = false — stay quiet regardless.\n */\nfunction isDev(): boolean {\n if (typeof process !== 'undefined') {\n return process!.env?.NODE_ENV !== 'production';\n }\n return typeof __FORMA_DEV__ !== 'undefined' ? !!__FORMA_DEV__ : false;\n}\n\nexport const __DEV__: boolean = isDev();\n\n// ---------------------------------------------------------------------------\n// Global error handlers\n// ---------------------------------------------------------------------------\n\n/** Callback signature for a global {@link onError} handler. */\nexport type ErrorHandler = (error: unknown, info?: { source?: string }) => void;\n\nconst _errorHandlers = new Set<ErrorHandler>();\n\n/**\n * Install a global error handler for FormaJS reactive errors. Called when\n * effects, computeds, or event handlers throw. Multiple handlers may be\n * registered; returns an unsubscribe function that removes only this handler.\n *\n * ```ts\n * const off = onError((err, info) => {\n * Sentry.captureException(err, { tags: { source: info?.source } });\n * });\n * // later: off();\n * ```\n */\nexport function onError(handler: ErrorHandler): () => void {\n _errorHandlers.add(handler);\n return () => { _errorHandlers.delete(handler); };\n}\n\n/** @internal */\nexport function reportError(error: unknown, source?: string): void {\n for (const handler of _errorHandlers) {\n try { handler(error, source ? { source } : {}); } catch { /* prevent infinite loop */ }\n }\n if (isDev()) {\n console.error(`[forma] ${source ?? 'Unknown'} error:`, error);\n }\n}\n","/**\n * Forma Reactive - Signal\n *\n * Fine-grained reactive primitive backed by alien-signals.\n * API: createSignal returns [getter, setter] tuple following SolidJS conventions.\n *\n * TC39 Signals equivalent: Signal.State\n */\n\nimport { signal as createRawSignal, setActiveSub, trigger } from 'alien-signals';\nimport { __DEV__ } from './dev.js';\n\n// Debug names live in a side table rather than on the getter's `.name`, so\n// alien-signals' isSignal() (which keys off the bound function name) still\n// recognizes named signals.\nconst signalNames = new WeakMap<object, string>();\n\n/** Debug name of a signal getter, if one was provided (dev-only). */\nexport function getSignalName(fn: unknown): string | undefined {\n return typeof fn === 'function' ? signalNames.get(fn as object) : undefined;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/** A function that reads the current value of a signal. */\nexport type SignalGetter<T> = () => T;\n/** A function that updates a signal — accepts a value or an updater function. */\nexport type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;\n\nexport interface SignalOptions<T> {\n /** Debug name — attached to getter in dev mode for devtools inspection. */\n name?: string;\n /**\n * Custom equality check. When provided, the setter will read the current\n * value and only update the signal if `equals(prev, next)` returns `false`.\n *\n * Default: none (alien-signals uses strict inequality `!==` internally).\n *\n * ```ts\n * const [pos, setPos] = createSignal(\n * { x: 0, y: 0 },\n * { equals: (a, b) => a.x === b.x && a.y === b.y },\n * );\n *\n * setPos({ x: 0, y: 0 }); // skipped — equals returns true\n * setPos({ x: 1, y: 0 }); // applied — equals returns false\n * ```\n */\n equals?: (prev: T, next: T) => boolean;\n}\n\n/**\n * Wrap a value so the setter treats it as a literal value, not a functional updater.\n *\n * When `T` is itself a function type, passing a function to the setter is\n * ambiguous -- it looks like a functional update (`prev => next`). Use\n * `value()` to disambiguate:\n *\n * ```ts\n * const [getFn, setFn] = createSignal<() => void>(() => console.log('a'));\n *\n * // BUG: interpreted as a functional update -- calls the arrow with prev\n * // setFn(() => console.log('b'));\n *\n * // Correct: wraps in a thunk so the setter stores it as-is\n * setFn(value(() => console.log('b')));\n * ```\n */\nexport function value<T>(v: T): () => T {\n return () => v;\n}\n\ntype RawSignal<T> = {\n (): T;\n (value: T): void;\n};\n\nfunction applySignalSet<T>(\n s: RawSignal<T>,\n v: T | ((prev: T) => T),\n equals?: (prev: T, next: T) => boolean,\n): void {\n // Fast path: plain value, no equals — no prev read needed. (A running effect\n // writing its own dependency is detected at the effect level via the Pending\n // flag, so signal.ts does not need to do anything special here.)\n if (typeof v !== 'function') {\n if (!equals) {\n s(v);\n return;\n }\n const prevSub = setActiveSub(undefined);\n const prev = s();\n setActiveSub(prevSub);\n if (equals(prev, v)) return; // suppressed by custom equality\n s(v);\n if (Object.is(prev, v)) forceNotify(s);\n return;\n }\n\n // Functional update: read prev without tracking.\n const prevSub = setActiveSub(undefined);\n const prev = s();\n setActiveSub(prevSub);\n const next = (v as (prev: T) => T)(prev);\n if (equals && equals(prev, next)) return; // suppressed by custom equality\n s(next);\n if (equals && Object.is(prev, next)) forceNotify(s);\n}\n\n/**\n * When a custom `equals` decided to APPLY (returned false) but the value is the\n * identical reference, alien-signals suppresses propagation (its guard is\n * `pendingValue !== value`). Force-notify subscribers so `equals: () => false`\n * (\"always notify\") works for mutate-in-place patterns.\n */\nfunction forceNotify<T>(s: RawSignal<T>): void {\n trigger(() => { s(); });\n}\n\n/**\n * Create a reactive signal.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * console.log(count()); // 0\n * setCount(1);\n * setCount(prev => prev + 1);\n * ```\n *\n * With custom equality:\n *\n * ```ts\n * const [pos, setPos] = createSignal(\n * { x: 0, y: 0 },\n * { equals: (a, b) => a.x === b.x && a.y === b.y },\n * );\n * ```\n */\nexport function createSignal<T>(initialValue: T, options?: SignalOptions<T>): [get: SignalGetter<T>, set: SignalSetter<T>] {\n const s = createRawSignal<T>(initialValue) as RawSignal<T>;\n const getter = s as unknown as SignalGetter<T>;\n if (__DEV__ && options?.name) {\n signalNames.set(getter as object, options.name);\n }\n const eq = options?.equals;\n const setter: SignalSetter<T> = (v: T | ((prev: T) => T)) => applySignalSet(s, v, eq);\n\n return [getter, setter];\n}\n","/**\n * Forma Reactive - Effect\n *\n * Side-effectful reactive computation that auto-tracks signal dependencies.\n * Backed by alien-signals for automatic dependency tracking.\n *\n * TC39 Signals equivalent: Signal.subtle.Watcher (effect is a userland concept)\n */\n\nimport { effect as rawEffect, getActiveSub } from 'alien-signals';\nimport {\n hasActiveRoot,\n registerDisposer,\n getOwner,\n runWithOwner,\n registerOwnerDisposer,\n createChildOwner,\n disposeOwner,\n type Owner,\n} from './root.js';\nimport { setCleanupCollector } from './cleanup.js';\nimport { reportError } from './dev.js';\n\n// ---------------------------------------------------------------------------\n// Cleanup array pool — avoids allocating a new array every effect re-run\n// ---------------------------------------------------------------------------\n\nconst POOL_SIZE = 32;\nconst MAX_REENTRANT_RUNS = 100;\nconst pool: (() => void)[][] = [];\nfor (let i = 0; i < POOL_SIZE; i++) pool.push([]);\nlet poolIdx = POOL_SIZE;\n\n// ---------------------------------------------------------------------------\n// Self-write detection — alien-signals' propagate() never notifies a subscriber\n// that is currently running, so an effect writing a signal it depends on is left\n// stale. When that happens alien-signals still sets the Pending flag on the\n// running subscriber's node (but skips the re-run). We read that flag on the\n// EFFECT's own node after each run and loop, so a self-dependent effect\n// converges. Reading the effect's own node (not a global) makes this precise:\n// writes to signals the effect does not depend on, writes from a nested computed,\n// and a nested effect's self-write never set THIS node's Pending, so they cause\n// no spurious re-run. It also works through batch() (Pending is set at flush).\n// ---------------------------------------------------------------------------\n\n// alien-signals ReactiveFlags.Pending (not exported from the package root).\nconst PENDING = 32;\n\ninterface SubNode { flags: number; }\n\nfunction acquireArray(): (() => void)[] {\n if (poolIdx > 0) {\n const arr = pool[--poolIdx]!;\n arr.length = 0;\n return arr;\n }\n return [];\n}\n\nfunction releaseArray(arr: (() => void)[]): void {\n arr.length = 0;\n if (poolIdx < POOL_SIZE) {\n pool[poolIdx++] = arr;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unified cleanup runner — single function for both re-run and dispose paths\n// ---------------------------------------------------------------------------\n\nfunction runCleanup(fn: (() => void) | undefined): void {\n if (fn === undefined) return;\n try {\n fn();\n } catch (e) {\n reportError(e, 'effect cleanup');\n }\n}\n\nfunction runCleanups(bag: (() => void)[] | undefined): void {\n if (bag === undefined) return;\n for (let i = 0; i < bag.length; i++) {\n try { bag[i]!(); } catch (e) { reportError(e, 'effect cleanup'); }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactive effect that auto-tracks signal dependencies.\n *\n * The provided function runs immediately and re-runs whenever any signal it\n * reads changes. If the function returns a cleanup function, that cleanup is\n * called before each re-run and on disposal.\n *\n * Additionally, `onCleanup()` can be called inside the effect to register\n * cleanup functions composably.\n *\n * Returns a dispose function that stops the effect.\n */\n/**\n * @internal — Lightweight effect for Forma's internal DOM bindings.\n *\n * Bypasses createEffect's cleanup infrastructure (pool, collector, error\n * reporting, engine compression) since internal effects never use\n * onCleanup() or return cleanup functions. This saves ~4 function calls\n * per effect creation and per re-run.\n *\n * ONLY use for effects that:\n * 1. Never call onCleanup()\n * 2. Never return a cleanup function\n * 3. Contain simple \"read signal → write DOM\" logic\n */\nexport function internalEffect(fn: () => void): () => void {\n const dispose = rawEffect(fn);\n if (hasActiveRoot()) {\n registerDisposer(dispose);\n }\n return dispose;\n}\n\nexport function createEffect(fn: () => void | (() => void)): () => void {\n // Capture the owner active at creation time so this effect's disposer is owned\n // by whatever created it — a root, or (for a nested effect) the parent effect's\n // current child-owner. This replaces a hasActiveRoot() snapshot so nested\n // effects created during a parent re-run (when no root is lexically active) are\n // still owned and disposed.\n const ownerAtCreate = getOwner();\n\n // This effect owns its nested effects/roots via a reusable child-owner: it is\n // disposed (nested cleanups run) at the top of each run and on disposal, then\n // reused for the next generation. One small allocation per createEffect; the\n // hot DOM path uses internalEffect, which has no child-owner.\n const childOwner: Owner = createChildOwner();\n\n // Most effects have zero or one cleanup. Track the single-cleanup case\n // without array allocation; only promote to pooled array when needed.\n let cleanup: (() => void) | undefined;\n let cleanupBag: (() => void)[] | undefined;\n let nextCleanup: (() => void) | undefined;\n let nextCleanupBag: (() => void)[] | undefined;\n\n const addCleanup = (cb: () => void) => {\n if (nextCleanupBag !== undefined) {\n nextCleanupBag.push(cb);\n return;\n }\n if (nextCleanup !== undefined) {\n const bag = acquireArray();\n bag.push(nextCleanup, cb);\n nextCleanup = undefined;\n nextCleanupBag = bag;\n return;\n }\n nextCleanup = cb;\n };\n\n const runOnce = () => {\n // Dispose the previous generation of nested effects/roots (running their\n // cleanups) FIRST — children before parents, matching wrappedDispose so the\n // teardown order is consistent between the re-run and dispose paths and a\n // nested cleanup never observes parent-owned state already freed. (alien's\n // raw unwatched teardown of a nested effect bypasses our cleanup, so we own\n // nested work explicitly.)\n disposeOwner(childOwner);\n\n // Run and clear this effect's own previous cleanups.\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n\n nextCleanup = undefined;\n nextCleanupBag = undefined;\n\n // Always install the collector so onCleanup()/returned cleanups are captured\n // on EVERY run. (The old skipCleanupInfra fast-path latched after a clean\n // first run and then silently dropped — or cross-registered — cleanups\n // registered on later runs.) The single-cleanup/pooled-array promotion below\n // keeps the zero/one-cleanup case allocation-free.\n const prevCollector = setCleanupCollector(addCleanup);\n\n try {\n // Run the body with this effect's child-owner installed so any nested\n // effects/roots it creates are owned by this generation.\n const result = runWithOwner(childOwner, fn);\n if (typeof result === 'function') {\n addCleanup(result as () => void);\n }\n // Commit this run's cleanups. When none were registered, both stay\n // undefined (allocation-free).\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else if (nextCleanup !== undefined) {\n cleanup = nextCleanup;\n }\n } catch (e) {\n reportError(e, 'effect');\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else if (nextCleanup !== undefined) {\n cleanup = nextCleanup;\n }\n } finally {\n setCleanupCollector(prevCollector);\n }\n };\n\n const safeFn = () => {\n // alien-signals sets activeSub to this effect's node for the duration of this\n // callback, so getActiveSub() is our own node. If the body writes a signal we\n // depend on, alien-signals marks this node Pending but skips the re-run; we\n // detect that and run again, bounded so a genuine cycle is reported instead of\n // hanging.\n const node = getActiveSub() as SubNode | undefined;\n let reentrantRuns = 0;\n do {\n if (node) node.flags &= ~PENDING; // clear before running so we detect a fresh set\n runOnce();\n if (node === undefined || (node.flags & PENDING) === 0) break;\n if (++reentrantRuns >= MAX_REENTRANT_RUNS) {\n node.flags &= ~PENDING;\n reportError(\n new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} self-triggered re-runs (cycle?)`),\n 'effect',\n );\n break;\n }\n } while (true);\n };\n\n const dispose = rawEffect(safeFn);\n\n // Wrap dispose to also run final cleanups\n let disposed = false;\n const wrappedDispose = () => {\n if (disposed) return;\n disposed = true;\n dispose();\n // Dispose nested effects/roots this effect owns, then run its own cleanups.\n disposeOwner(childOwner);\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n };\n\n // Register this effect's disposer with the owner active at creation (a root, or\n // a parent effect's child-owner).\n if (ownerAtCreate) {\n registerOwnerDisposer(ownerAtCreate, wrappedDispose);\n }\n\n return wrappedDispose;\n}\n","/**\n * Forma Reactive - Computed\n *\n * Lazy, cached derived value that participates in the reactive graph.\n * Backed by alien-signals for automatic dependency tracking\n * and cache invalidation.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { computed as rawComputed } from 'alien-signals';\nimport { reportError } from './dev.js';\n\n/** Unique per-throw marker so alien-signals sees a value change and propagates. */\nconst ERR = Symbol('formaComputedError');\ninterface ErrBox { [ERR]: unknown; }\nfunction isErrBox(v: unknown): v is ErrBox {\n return typeof v === 'object' && v !== null && ERR in (v as object);\n}\n\n/**\n * Create a lazy, cached computed value.\n *\n * Note: Unlike SolidJS's createComputed (which is an eager synchronous\n * side effect), this is a lazy cached derivation — equivalent to\n * SolidJS's createMemo. Both createComputed and createMemo in FormaJS\n * are identical.\n *\n * The getter receives the previous value as an argument, enabling\n * efficient diffing patterns without a separate signal:\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createComputed(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n *\n * With previous value (for diffing):\n *\n * ```ts\n * const changes = createComputed((prev) => {\n * const next = items();\n * if (prev) console.log(`changed from ${prev.length} to ${next.length} items`);\n * return next;\n * });\n * ```\n */\nexport function createComputed<T>(fn: (previousValue?: T) => T): () => T {\n // alien-signals' updateComputed leaves a throwing computed flagged clean with a\n // stale value, so a later read silently returns the stale value and never\n // rethrows. We cache the error in closure and rethrow on read until a\n // dependency changes (TC39/Solid). On throw we return a FRESH sentinel object so\n // alien-signals sees a value change and propagates the error to subscribers; the\n // user getter only ever sees the last GOOD value as `previousValue`.\n let errored = false;\n let error: unknown;\n let lastGood: T | undefined;\n\n const raw = rawComputed<T | ErrBox>(() => {\n try {\n const v = fn(lastGood);\n errored = false;\n error = undefined;\n lastGood = v;\n return v;\n } catch (e) {\n errored = true;\n error = e;\n reportError(e, 'computed');\n return { [ERR]: e };\n }\n });\n\n const reader = () => {\n const v = raw();\n if (errored || isErrBox(v)) throw error;\n return v as T;\n };\n // Preserve alien-signals' isComputed() recognition, which keys off the bound\n // function name (`bound computedOper`). Our reader wraps the raw computed, so\n // copy the raw name onto it.\n Object.defineProperty(reader, 'name', { value: raw.name, configurable: true });\n return reader;\n}\n","/**\n * Forma Reactive - Batch\n *\n * Groups multiple signal updates and defers effect execution until the\n * outermost batch completes. Prevents intermediate re-renders.\n * Backed by alien-signals.\n *\n * TC39 Signals: no built-in batch — this is a userland optimization.\n */\n\nimport { startBatch, endBatch } from 'alien-signals';\n\n/**\n * Group multiple signal updates so that effects only run once after all\n * updates have been applied.\n *\n * ```ts\n * batch(() => {\n * setA(1);\n * setB(2);\n * // effects that depend on A and B won't run yet\n * });\n * // effects run here, once\n * ```\n *\n * Batches are nestable — only the outermost batch triggers the flush.\n */\nexport function batch(fn: () => void): void {\n startBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n}\n","/**\n * Forma DOM - List\n *\n * Keyed list reconciliation with Longest Increasing Subsequence (LIS).\n * The LIS tells us the maximum set of DOM nodes that can stay in place;\n * only the remaining nodes need to be moved. This minimises DOM operations\n * to exactly `n - LIS_length` moves — provably optimal.\n *\n * Algorithm used by ivi, Inferno, and (with variations) Solid, Vue 3, Svelte.\n *\n * Uses comment-node markers instead of a wrapper <div>, so the list can be\n * placed inside <table>, <ul>, <select>, etc. without breaking semantics.\n *\n * Total module budget: <2KB minified.\n */\n\nimport { createSignal, internalEffect, untrack, createRoot, registerDisposer, __DEV__ } from '../reactive';\nimport { hydrating } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Return value from {@link reconcileList} — the new nodes and items arrays. */\nexport interface ReconcileResult<T> {\n /** The DOM nodes currently in the list, in order. */\n nodes: Node[];\n /** The items array corresponding to the current nodes. */\n items: T[];\n}\n\n/** Animation hooks for list transitions. */\nexport interface ListTransitionHooks {\n /** Called after a new node is inserted into the DOM. */\n onInsert?: (node: Node) => void;\n /** Called before a node is removed. Call `done()` when the exit animation finishes. */\n onBeforeRemove?: (node: Node, done: () => void) => void;\n}\n\ninterface CachedItem<T> {\n element: HTMLElement;\n item: T;\n getIndex: () => number;\n setIndex: (v: number) => void;\n dispose: () => void;\n}\n\nexport interface CreateListOptions {\n /**\n * How to handle same-key items whose object identity changed.\n * - 'none' (default): keep the existing row node for maximum throughput.\n * - 'rerender': re-render changed rows and patch static row DOM in place.\n */\n updateOnItemChange?: 'none' | 'rerender';\n}\n\n// ---------------------------------------------------------------------------\n// LIS — O(n log n) via patience sorting + binary search\n// ---------------------------------------------------------------------------\n\n/**\n * Find the longest increasing subsequence.\n * Returns indices into the input array.\n * O(n log n) time, O(n) space.\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // Pre-allocate typed arrays — avoids V8 array growth overhead on push\n const tails = new Int32Array(n);\n const tailIndices = new Int32Array(n);\n const predecessor = new Int32Array(n).fill(-1);\n let tailsLen = 0;\n\n for (let i = 0; i < n; i++) {\n const val = arr[i]!;\n\n // Binary search: leftmost tail >= val\n let lo = 0, hi = tailsLen;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n tails[lo] = val;\n tailIndices[lo] = i;\n if (lo > 0) predecessor[i] = tailIndices[lo - 1]!;\n if (lo >= tailsLen) tailsLen++;\n }\n\n // Reconstruct — return plain array since callers expect number[]\n const result = new Array<number>(tailsLen);\n let idx = tailIndices[tailsLen - 1]!;\n for (let i = tailsLen - 1; i >= 0; i--) {\n result[i] = idx;\n idx = predecessor[idx]!;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// reconcileList — low-level keyed reconciler\n// ---------------------------------------------------------------------------\n\n/** Below this threshold, use flat array scan instead of Map for better cache locality. */\nconst SMALL_LIST_THRESHOLD = 32;\nconst ABORT_SYM = Symbol.for('forma-abort');\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction canPatchStaticElement(target: Node, source: Node): target is HTMLElement {\n return target instanceof HTMLElement\n && source instanceof HTMLElement\n && target.tagName === source.tagName\n && !(target as any)[ABORT_SYM]\n && !(target as any)[CACHE_SYM]\n && !(target as any)[DYNAMIC_CHILD_SYM]\n && !(source as any)[ABORT_SYM]\n && !(source as any)[CACHE_SYM]\n && !(source as any)[DYNAMIC_CHILD_SYM];\n}\n\nfunction patchStaticElement(target: HTMLElement, source: HTMLElement): void {\n // Sync attributes (events/reactive bindings are excluded by canPatchStaticElement).\n const sourceAttrNames = new Set<string>();\n for (const attr of Array.from(source.attributes)) {\n sourceAttrNames.add(attr.name);\n if (target.getAttribute(attr.name) !== attr.value) {\n target.setAttribute(attr.name, attr.value);\n }\n }\n for (const attr of Array.from(target.attributes)) {\n if (!sourceAttrNames.has(attr.name)) {\n target.removeAttribute(attr.name);\n }\n }\n\n // Move freshly rendered children into the existing keyed node.\n target.replaceChildren(...Array.from(source.childNodes));\n}\n\n/**\n * Small-list reconciler: uses flat arrays + indexOf instead of Map/Set.\n * For < 32 items, linear scan is faster than hash computation overhead.\n */\nfunction reconcileSmall<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // Build flat arrays for old keys/nodes — better cache locality than Map\n const oldKeys: (string | number)[] = new Array(oldLen);\n for (let i = 0; i < oldLen; i++) {\n oldKeys[i] = keyFn(oldItems[i]!);\n }\n\n // Classify each new item: find matching old index via linear scan\n const oldIndices = new Array<number>(newLen);\n const oldUsed = new Uint8Array(oldLen); // 0 = unused, 1 = used\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n let found = -1;\n for (let j = 0; j < oldLen; j++) {\n if (!oldUsed[j] && oldKeys[j] === key) {\n found = j;\n oldUsed[j] = 1;\n break;\n }\n }\n oldIndices[i] = found;\n }\n\n // Remove old items not reused\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // Fast path: same keys, same order -> just update, 0 DOM moves\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // LIS for minimum moves (still needed even for small lists)\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = [];\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array as a bitmap instead of Set for small lists\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // Build result: walk right-to-left for stable insertBefore targets\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n/**\n * Reconcile a DOM parent's children to match a new array of items.\n * Uses keyed reconciliation with LIS for minimum DOM operations.\n *\n * For small lists (< 32 items), uses a flat array scan path that avoids\n * Map/Set hash overhead and provides better cache locality.\n *\n * @param parent - The container DOM element\n * @param oldItems - Previous array (from last reconciliation)\n * @param newItems - New array to render\n * @param oldNodes - Previous DOM nodes array\n * @param keyFn - Extracts a unique key from each item\n * @param createFn - Creates a new DOM node for an item\n * @param updateFn - Updates an existing DOM node with new item data\n * @param beforeNode - Optional boundary marker. When provided, new nodes are\n * inserted before this node instead of appended to parent.\n * This allows the reconciler to operate within a range\n * delimited by comment markers.\n * @returns Object with new nodes array and items array for next call\n */\nexport function reconcileList<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // --- Trivial: new is empty -> remove all ---\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n return { nodes: [], items: [] };\n }\n\n // --- Trivial: old is empty -> create all ---\n if (oldLen === 0) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = createFn(newItems[i]!);\n if (beforeNode) {\n parent.insertBefore(node, beforeNode);\n } else {\n parent.appendChild(node);\n }\n hooks?.onInsert?.(node);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n\n // --- Small list path: flat array scan, no Map/Set overhead ---\n if (oldLen < SMALL_LIST_THRESHOLD) {\n return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);\n }\n\n // --- Large list path: Map-based approach ---\n // Bucket occurrences per key so DUPLICATE keys are consumed one-per-match\n // (matching the small-list path). A single index per key collapsed duplicates\n // to one node, dropping duplicate-keyed rows once a list crossed the threshold.\n const oldKeyMap = new Map<string | number, number[]>();\n for (let i = 0; i < oldLen; i++) {\n const k = keyFn(oldItems[i]!);\n const bucket = oldKeyMap.get(k);\n if (bucket) bucket.push(i);\n else oldKeyMap.set(k, [i]);\n }\n\n // --- Classify each new item: reuse or create ---\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const oldIndices = new Array<number>(newLen); // -1 means new item\n const oldUsed = new Uint8Array(oldLen);\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n const bucket = oldKeyMap.get(key);\n if (bucket && bucket.length > 0) {\n const oldIdx = bucket.shift()!; // consume next unused occurrence (left-to-right)\n oldIndices[i] = oldIdx;\n oldUsed[oldIdx] = 1;\n } else {\n oldIndices[i] = -1;\n }\n }\n\n // --- Remove old items not in new array ---\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // --- Fast path: same keys, same order -> just update, 0 DOM moves ---\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // --- Find LIS of old indices (reused items only) ---\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = []; // position in new array\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // --- Build result: walk right-to-left for stable insertBefore targets ---\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n // NEW: create and insert\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n // REUSE: update content\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n // LIS item: already in correct relative position, don't move\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n // Insert/move into position\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n// ---------------------------------------------------------------------------\n// createList — high-level reactive API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactively-bound list of DOM elements with keyed reconciliation.\n *\n * Returns a `DocumentFragment` containing two comment markers\n * (`<!--forma-list-start-->` and `<!--forma-list-end-->`) that delimit the\n * list's range in the DOM. All managed elements live between these markers.\n *\n * This avoids a wrapper `<div>` which would break `<table>`, `<ul>`,\n * `<select>` semantics and pollute the DOM.\n *\n * When the `items` signal changes, only the minimal set of DOM mutations is\n * performed using the LIS algorithm:\n * - New keys: create elements via `renderFn`\n * - Removed keys: remove elements from DOM\n * - Moved keys: reorder elements using minimum moves (n - LIS)\n * - Same keys: keep row nodes and update index signals\n * (or re-render row content when `updateOnItemChange: 'rerender'`)\n *\n * @param items Signal getter returning the current array of items.\n * @param keyFn Extracts a unique key from each item.\n * @param renderFn Renders a single item. Receives the item and a reactive index getter.\n * @returns A DocumentFragment to insert into the DOM. The fragment includes\n * start/end comment markers and any initial list items.\n *\n * ```ts\n * const frag = createList(\n * todos,\n * (t) => t.id,\n * (todo, index) => h('li', null, () => `${index() + 1}. ${todo.text}`),\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createList<T>(\n items: () => T[],\n keyFn: (item: T) => string | number,\n renderFn: (item: T, index: () => number) => HTMLElement,\n options?: CreateListOptions,\n): DocumentFragment {\n if (hydrating) {\n return { type: 'list', items, keyFn, renderFn, options } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-list-start');\n const endMarker = document.createComment('forma-list-end');\n\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Cache: key -> { element, item, setIndex }\n let cache = new Map<string | number, CachedItem<T>>();\n let currentNodes: Node[] = [];\n let currentItems: T[] = [];\n const updateOnItemChange = options?.updateOnItemChange ?? 'none';\n\n internalEffect(() => {\n const newItems = items();\n\n // The parent is discovered lazily: once the fragment has been inserted\n // into the live DOM the markers have a parentNode.\n const parent = startMarker.parentNode;\n if (!parent) {\n // Markers are not yet in the DOM — nothing to reconcile.\n // This can happen if the effect fires synchronously before mount.\n return;\n }\n\n // Edge case: non-array\n if (!Array.isArray(newItems)) {\n if (__DEV__) {\n console.warn('[forma] createList: value is not an array, treating as empty');\n }\n // Remove all nodes between the markers\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node);\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n return;\n }\n\n // Filter nullish items — avoid array allocation when no nulls found (common case)\n let cleanItems: T[] = newItems;\n for (let i = 0; i < newItems.length; i++) {\n if (newItems[i] == null) {\n cleanItems = newItems.filter(item => item != null);\n break;\n }\n }\n\n // Dev-mode duplicate key detection\n if (__DEV__) {\n const seen = new Set<string | number>();\n for (const item of cleanItems) {\n const key = keyFn(item);\n if (seen.has(key)) {\n console.warn('[forma] createList: duplicate key detected:', key);\n }\n seen.add(key);\n }\n }\n\n const updateRow = updateOnItemChange === 'rerender'\n ? (node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (!cached) return;\n if (cached.item === item) return;\n cached.item = item;\n\n if (!(node instanceof HTMLElement)) return;\n if ((node as any)[ABORT_SYM] || (node as any)[CACHE_SYM] || (node as any)[DYNAMIC_CHILD_SYM]) {\n return;\n }\n\n const next = untrack(() => renderFn(item, cached.getIndex));\n if (canPatchStaticElement(node, next)) {\n patchStaticElement(node, next);\n cached.element = node;\n }\n }\n : (_node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n };\n\n const oldCache = cache;\n\n const result = reconcileList<T>(\n parent,\n currentItems,\n cleanItems,\n currentNodes,\n keyFn,\n // createFn: create element + cache entry.\n // Each item is rendered inside createRoot + untrack so that inner\n // effects are owned by the item's root (not the parent), and are\n // disposed when the item is removed from the list.\n (item) => {\n const key = keyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n let itemDispose!: () => void;\n const element = createRoot((dispose) => {\n itemDispose = dispose;\n return untrack(() => renderFn(item, getIndex));\n });\n cache.set(key, { element, item, getIndex, setIndex, dispose: itemDispose });\n return element;\n },\n updateRow,\n // beforeNode: insert items before the end marker\n endMarker,\n );\n\n // Rebuild cache + update index signals in a single pass.\n // Avoids .map() array allocation + Set construction from the previous approach.\n const newCache = new Map<string | number, CachedItem<T>>();\n for (let i = 0; i < cleanItems.length; i++) {\n const key = keyFn(cleanItems[i]!);\n const cached = oldCache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n\n // Dispose removed items' reactive roots\n for (const [key, cached] of oldCache) {\n if (!newCache.has(key)) {\n cached.dispose();\n }\n }\n\n cache = newCache;\n\n currentNodes = result.nodes;\n currentItems = result.items;\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached item roots and clear references. Item roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const cached of cache.values()) {\n cached.dispose();\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n });\n\n return fragment;\n}\n","/**\n * Forma Reconciler — DOM diffing and patching engine.\n *\n * Replaces morphdom with a purpose-built reconciler that understands\n * Forma's directive system (data-forma-state, data-list, data-if, etc.).\n *\n * Usage:\n * const rec = createReconciler({ mountScope, unmountScope, ... });\n * rec(container, htmlString);\n *\n * Scope modes for data-forma-state elements matched by data-forma-id:\n * PRESERVE — same data-module + same state shape → patch attrs, keep bindings\n * RESET — same data-module + different state shape → unmount, patch, remount\n * REPLACE — different data-module → remove old, insert new, mount fresh\n */\n\n// ── Types ─────────────────────────────────────────────────────────────\n\nexport interface ReconcilerConfig {\n mountScope: (el: Element) => void;\n unmountScope: (el: Element) => void;\n disconnectObserver: () => void;\n reconnectObserver: () => void;\n batch: (fn: () => void) => void;\n}\n\ntype ScopeMode = 'PRESERVE' | 'RESET' | 'REPLACE';\n\n// ── Attribute helpers ─────────────────────────────────────────────────\n\n/** Check if an element has data-bind:X targeting a specific attribute */\nfunction getBindTargets(el: Element): Set<string> {\n const targets = new Set<string>();\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const name = attrs[i]!.name;\n if (name.startsWith('data-bind:')) {\n targets.add(name.slice(10));\n }\n }\n return targets;\n}\n\n/** Check if an element owns its subtree (data-list or data-if) */\nfunction ownsSubtree(el: Element): boolean {\n return el.hasAttribute('data-list') || el.hasAttribute('data-if');\n}\n\n// ── State shape comparison ────────────────────────────────────────────\n\nfunction getStateKeys(json: string): string[] {\n try {\n const obj = JSON.parse(json);\n return Object.keys(obj).sort();\n } catch {\n return [];\n }\n}\n\nfunction sameShape(keysA: string[], keysB: string[]): boolean {\n if (keysA.length !== keysB.length) return false;\n for (let i = 0; i < keysA.length; i++) {\n if (keysA[i] !== keysB[i]) return false;\n }\n return true;\n}\n\n// ── Scope mode determination ──────────────────────────────────────────\n\nfunction determineScopeMode(liveEl: Element, newEl: Element): ScopeMode {\n const liveModule = liveEl.getAttribute('data-module');\n const newModule = newEl.getAttribute('data-module');\n\n if (liveModule !== newModule) return 'REPLACE';\n\n // Compare state shape: use __formaInitialState (set at mount time) for the\n // live element, and the raw attribute for the new element.\n const liveInitialState = (liveEl as any).__formaInitialState as string | undefined;\n const liveStateJSON = liveInitialState ?? liveEl.getAttribute('data-forma-state') ?? '{}';\n const newStateJSON = newEl.getAttribute('data-forma-state') ?? '{}';\n\n const liveKeys = getStateKeys(liveStateJSON);\n const newKeys = getStateKeys(newStateJSON);\n\n if (sameShape(liveKeys, newKeys)) return 'PRESERVE';\n return 'RESET';\n}\n\n// ── HTML parsing ──────────────────────────────────────────────────────\n\n/** Reused template element — avoids creating a new one per reconcile call. */\nlet _parseTemplate: HTMLTemplateElement | null = null;\n\nfunction parseHTML(html: string): DocumentFragment {\n if (!_parseTemplate) _parseTemplate = document.createElement('template');\n _parseTemplate.innerHTML = html;\n // content is consumed (moved) by the caller, so template is empty after\n return _parseTemplate.content;\n}\n\n// ── Attribute patching ────────────────────────────────────────────────\n\nfunction patchAttributes(liveEl: Element, newEl: Element): void {\n const bindTargets = getBindTargets(liveEl);\n const hasDataShow = liveEl.hasAttribute('data-show');\n const hasDataModel = liveEl.hasAttribute('data-model');\n\n // Check for class directives without Array.from allocation\n let liveHasClassDirectives = false;\n const liveAttrs = liveEl.attributes;\n for (let i = 0; i < liveAttrs.length; i++) {\n if (liveAttrs[i]!.name.startsWith('data-class:')) {\n liveHasClassDirectives = true;\n break;\n }\n }\n\n // Set/update attributes from newEl\n const newAttrs = newEl.attributes;\n for (let i = 0; i < newAttrs.length; i++) {\n const attr = newAttrs[i]!;\n // Skip directive-owned attributes\n if (attr.name === 'style' && hasDataShow) continue;\n if (attr.name === 'class' && liveHasClassDirectives) continue;\n if ((attr.name === 'value' || attr.name === 'checked') && hasDataModel) continue;\n if (bindTargets.has(attr.name)) continue;\n\n const liveVal = liveEl.getAttribute(attr.name);\n if (liveVal !== attr.value) {\n liveEl.setAttribute(attr.name, attr.value);\n }\n }\n\n // Remove attributes that are no longer present in newEl\n // Iterate backwards since removeAttribute shifts indices\n for (let i = liveAttrs.length - 1; i >= 0; i--) {\n const attr = liveAttrs[i]!;\n if (!newEl.hasAttribute(attr.name)) {\n if (attr.name === 'style' && hasDataShow) continue;\n if (attr.name === 'class' && liveHasClassDirectives) continue;\n if ((attr.name === 'value' || attr.name === 'checked') && hasDataModel) continue;\n if (bindTargets.has(attr.name)) continue;\n\n liveEl.removeAttribute(attr.name);\n }\n }\n}\n\n// ── Text node patching ────────────────────────────────────────────────\n\nfunction patchTextNodes(liveEl: Element, newEl: Element): void {\n // data-text directive owns this element's text content — don't overwrite\n if (liveEl.hasAttribute('data-text')) return;\n\n const liveTexts: Text[] = [];\n const newTexts: { node: Text; index: number }[] = [];\n\n for (const child of Array.from(liveEl.childNodes)) {\n if (child.nodeType === Node.TEXT_NODE) liveTexts.push(child as Text);\n }\n for (let i = 0; i < newEl.childNodes.length; i++) {\n const child = newEl.childNodes[i];\n if (child.nodeType === Node.TEXT_NODE) newTexts.push({ node: child as Text, index: i });\n }\n\n // Fast path: same count, just patch content\n if (liveTexts.length === newTexts.length) {\n for (let i = 0; i < liveTexts.length; i++) {\n if (liveTexts[i].textContent !== newTexts[i].node.textContent) {\n liveTexts[i].textContent = newTexts[i].node.textContent;\n }\n }\n return;\n }\n\n // Count mismatch: reuse live text nodes in order, insert/remove as needed\n const usedLive = new Set<Text>();\n let liveIdx = 0;\n\n for (const { node: newText, index: newChildIdx } of newTexts) {\n if (liveIdx < liveTexts.length) {\n // Reuse existing text node\n const liveText = liveTexts[liveIdx]!;\n liveIdx++;\n usedLive.add(liveText);\n if (liveText.textContent !== newText.textContent) {\n liveText.textContent = newText.textContent;\n }\n } else {\n // Insert new text node at correct position\n const ref = findTextInsertionRef(liveEl, newEl, newChildIdx);\n liveEl.insertBefore(document.createTextNode(newText.textContent ?? ''), ref);\n }\n }\n\n // Remove unused live text nodes\n for (const lt of liveTexts) {\n if (!usedLive.has(lt) && lt.parentNode === liveEl) {\n liveEl.removeChild(lt);\n }\n }\n}\n\n/** Find the insertion reference node for a text node being inserted into liveEl. */\nfunction findTextInsertionRef(liveEl: Element, newEl: Element, newIdx: number): Node | null {\n for (let j = newIdx + 1; j < newEl.childNodes.length; j++) {\n const sibling = newEl.childNodes[j];\n if (sibling.nodeType === Node.ELEMENT_NODE) {\n const key = (sibling as Element).getAttribute('data-forma-id');\n if (key) {\n const match = liveEl.querySelector(`[data-forma-id=\"${CSS.escape(key)}\"]`);\n if (match && match.parentElement === liveEl) return match;\n }\n }\n }\n return null;\n}\n\n// ── Recursive element diffing ─────────────────────────────────────────\n\nfunction diffChildren(\n liveParent: Element,\n newParent: Element,\n config: ReconcilerConfig,\n): void {\n // Skip directive-owned subtrees\n if (ownsSubtree(liveParent)) return;\n\n // Patch text nodes at this level\n patchTextNodes(liveParent, newParent);\n\n // Collect child elements (ignore text nodes for structural diff)\n const liveChildren = Array.from(liveParent.children);\n const newChildren = Array.from(newParent.children);\n\n // Build keyed maps for data-forma-id elements\n const liveKeyed = new Map<string, Element>();\n const liveUnkeyed: Element[] = [];\n for (const child of liveChildren) {\n if (child.hasAttribute('data-forma-leaving')) continue;\n const key = child.getAttribute('data-forma-id');\n if (key) {\n liveKeyed.set(key, child);\n } else {\n liveUnkeyed.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n\n // Walk new children in order\n const usedLiveElements = new Set<Element>();\n\n for (const newChild of newChildren) {\n const key = newChild.getAttribute('data-forma-id');\n let liveMatch: Element | undefined;\n\n if (key) {\n liveMatch = liveKeyed.get(key);\n } else {\n // Match unkeyed elements by position and tag\n while (unkeyedIdx < liveUnkeyed.length) {\n const candidate = liveUnkeyed[unkeyedIdx];\n unkeyedIdx++;\n if (candidate.tagName === newChild.tagName && !usedLiveElements.has(candidate)) {\n liveMatch = candidate;\n break;\n }\n }\n }\n\n if (liveMatch) {\n usedLiveElements.add(liveMatch);\n\n // Check if this is a data-forma-state scope element\n if (liveMatch.hasAttribute('data-forma-state') && newChild.hasAttribute('data-forma-state')) {\n const mode = determineScopeMode(liveMatch, newChild);\n\n switch (mode) {\n case 'PRESERVE':\n // Patch attributes only, keep reactive bindings alive\n patchAttributes(liveMatch, newChild);\n // Recurse into non-directive-owned children\n diffChildren(liveMatch, newChild, config);\n break;\n\n case 'RESET':\n // Unmount old scope, patch DOM, mount fresh\n config.unmountScope(liveMatch);\n patchAttributes(liveMatch, newChild);\n // Replace inner content\n replaceInnerContent(liveMatch, newChild);\n config.mountScope(liveMatch);\n break;\n\n case 'REPLACE': {\n // Full element swap\n config.unmountScope(liveMatch);\n const replacement = newChild.cloneNode(true) as Element;\n liveParent.replaceChild(replacement, liveMatch);\n config.mountScope(replacement);\n usedLiveElements.delete(liveMatch);\n liveMatch = replacement;\n usedLiveElements.add(replacement);\n break;\n }\n }\n } else {\n // Non-scope element: patch attrs and recurse\n patchAttributes(liveMatch, newChild);\n diffChildren(liveMatch, newChild, config);\n }\n\n // Ensure element is in the correct position\n // Find where it should be relative to previousSibling\n ensurePosition(liveParent, liveMatch, newChild, newChildren);\n } else {\n // New element — insert it\n const clone = newChild.cloneNode(true) as Element;\n // Find insertion point\n const insertionRef = findInsertionPoint(liveParent, newChild, newChildren);\n liveParent.insertBefore(clone, insertionRef);\n usedLiveElements.add(clone);\n\n // Mount any scopes in the new element\n if (clone.hasAttribute('data-forma-state')) {\n config.mountScope(clone);\n }\n const nestedScopes = clone.querySelectorAll('[data-forma-state]');\n for (const nested of Array.from(nestedScopes)) {\n config.mountScope(nested);\n }\n }\n }\n\n // Remove live children that are no longer in new children\n for (const child of liveChildren) {\n if (!usedLiveElements.has(child)) {\n // Guard: element may already be detached (e.g. after REPLACE)\n if (child.parentElement !== liveParent) continue;\n // Guard: element is mid-leave transition — its transition will remove it\n if (child.hasAttribute('data-forma-leaving')) continue;\n // Unmount any scopes\n if (child.hasAttribute('data-forma-state')) {\n config.unmountScope(child);\n }\n const nestedScopes = child.querySelectorAll('[data-forma-state]');\n for (const nested of Array.from(nestedScopes)) {\n config.unmountScope(nested);\n }\n liveParent.removeChild(child);\n }\n }\n}\n\n/** Replace inner content of live element with content from new element */\nfunction replaceInnerContent(liveEl: Element, newEl: Element): void {\n // Remove all children\n while (liveEl.firstChild) {\n liveEl.removeChild(liveEl.firstChild);\n }\n // Clone and append all children from new element\n for (const child of Array.from(newEl.childNodes)) {\n liveEl.appendChild(child.cloneNode(true));\n }\n}\n\n/** Ensure a live element is at the correct position */\nfunction ensurePosition(\n parent: Element,\n liveEl: Element,\n _newEl: Element,\n newChildren: Element[],\n): void {\n const newIdx = newChildren.indexOf(_newEl);\n const liveChildElements = Array.from(parent.children);\n const currentIdx = liveChildElements.indexOf(liveEl);\n\n if (currentIdx !== newIdx) {\n // Find the element that should come after this one\n const nextNewChild = newChildren[newIdx + 1];\n if (nextNewChild) {\n const nextKey = nextNewChild.getAttribute('data-forma-id');\n if (nextKey) {\n // Find this element in live DOM\n const nextLive = parent.querySelector(`[data-forma-id=\"${CSS.escape(nextKey)}\"]`);\n if (nextLive && nextLive.parentElement === parent) {\n parent.insertBefore(liveEl, nextLive);\n return;\n }\n }\n }\n // Append to end\n parent.appendChild(liveEl);\n }\n}\n\n/** Find the correct insertion point for a new element */\nfunction findInsertionPoint(\n parent: Element,\n newChild: Element,\n newChildren: Element[],\n): Node | null {\n const newIdx = newChildren.indexOf(newChild);\n\n // Look for the next sibling in the new children that exists in the live DOM\n for (let i = newIdx + 1; i < newChildren.length; i++) {\n const key = newChildren[i].getAttribute('data-forma-id');\n if (key) {\n const existing = parent.querySelector(`[data-forma-id=\"${CSS.escape(key)}\"]`);\n if (existing && existing.parentElement === parent) {\n return existing;\n }\n }\n }\n\n return null; // Append to end\n}\n\n// ── Factory ───────────────────────────────────────────────────────────\n\nexport function createReconciler(config: ReconcilerConfig) {\n /** Last HTML successfully reconciled into each container, keyed per container.\n * A single reconciler instance is shared across all containers, so a shared\n * scalar cache made a second container reconciled to the same HTML a no-op.\n * The WeakMap lets detached containers be GC'd. */\n const lastHtmlByContainer = new WeakMap<Element, string>();\n\n return function reconcile(container: Element, html: string): void {\n const trimmed = html.trim();\n if (!trimmed) return;\n\n // Fast path: skip reconciliation when this container's HTML is unchanged.\n if (lastHtmlByContainer.get(container) === trimmed && container.hasChildNodes()) return;\n lastHtmlByContainer.set(container, trimmed);\n\n // Disconnect observer to prevent double-mount during patching\n config.disconnectObserver();\n\n try {\n // ── Fast path: empty container ──\n if (!container.hasChildNodes() || container.children.length === 0) {\n container.innerHTML = trimmed;\n\n // Mount all data-forma-state scopes\n config.batch(() => {\n const scopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(scopes)) {\n config.mountScope(scope);\n }\n });\n\n return;\n }\n\n // ── Parse new HTML into a DocumentFragment ──\n const fragment = parseHTML(trimmed);\n const templateContainer = document.createElement('div');\n templateContainer.appendChild(fragment);\n\n // ── Full-replacement fast path ──\n // When there is zero data-forma-id overlap between live and new children,\n // skip the diff entirely — dispose all live scopes, innerHTML, mount fresh.\n // This handles module-switch scenarios cleanly and avoids issues with\n // corrupted HTML confusing the diff.\n const liveKeys = new Set<string>();\n for (const child of Array.from(container.children)) {\n if (child.hasAttribute('data-forma-leaving')) continue;\n const key = child.getAttribute('data-forma-id');\n if (key) liveKeys.add(key);\n }\n let hasOverlap = false;\n if (liveKeys.size > 0) {\n for (const child of Array.from(templateContainer.children)) {\n const key = child.getAttribute('data-forma-id');\n if (key && liveKeys.has(key)) { hasOverlap = true; break; }\n }\n }\n\n if (liveKeys.size > 0 && !hasOverlap) {\n // Full replacement: unmount all live scopes, replace content, mount new\n config.batch(() => {\n const liveScopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(liveScopes)) {\n config.unmountScope(scope);\n }\n container.innerHTML = trimmed;\n const newScopes = container.querySelectorAll('[data-forma-state]');\n for (const scope of Array.from(newScopes)) {\n config.mountScope(scope);\n }\n });\n return;\n }\n\n // ── Diff and patch ──\n config.batch(() => {\n diffChildren(container, templateContainer, config);\n });\n } finally {\n // Always reconnect observer, even if an error occurred\n config.reconnectObserver();\n }\n };\n}\n","/**\n * URL / attribute safety helpers shared by the SSR renderer (`src/ssr`) and the\n * DOM runtime (`src/runtime.ts`).\n *\n * The subtle part is scheme detection. Browsers strip ASCII whitespace and C0\n * control characters out of a URL before resolving its scheme, so\n * `java\\tscript:alert(1)`, `javas\\ncript:...` and `\\x01javascript:...` all\n * execute even though a naive `/^javascript:/` test does not match them. We\n * normalize the value the same way the browser does *before* testing.\n *\n * This module has no dependencies so it can be pulled into every build variant\n * (standard, hardened/CSP, SSR) cheaply.\n */\n\n// C0 controls + space (0x00-0x20), DEL and C1 controls (0x7F-0x9F). These are\n// exactly the bytes a URL parser ignores/strips when reading the scheme.\nconst URL_IGNORED_CHARS_RE = /[\\u0000-\\u0020\\u007F-\\u009F]/g;\n\n// Schemes that can execute script or smuggle an active HTML document.\n// Kept intentionally narrow to avoid blocking legitimate `data:image/*` inline\n// assets; `data:image/svg+xml` in a navigable context is handled separately.\nconst DANGEROUS_SCHEME_RE = /^(?:javascript|vbscript|data:text\\/html)/i;\n\n/** Attributes whose values are resolved as URLs and must be scheme-checked. */\nexport const URL_ATTRS = new Set([\n 'href',\n 'src',\n 'action',\n 'formaction',\n 'xlink:href',\n 'poster',\n 'background',\n]);\n\n/** True if `name` is a URL-bearing attribute (case-insensitive). */\nexport function isUrlAttr(name: string): boolean {\n return URL_ATTRS.has(name.toLowerCase());\n}\n\n/**\n * True if `value` uses a scheme that can execute script, after normalizing away\n * the whitespace and control characters that browsers ignore in a URL scheme.\n */\nexport function isDangerousUrl(value: string): boolean {\n const normalized = value.replace(URL_IGNORED_CHARS_RE, '');\n return DANGEROUS_SCHEME_RE.test(normalized);\n}\n\n/** True for any `on…` event-handler attribute name (case-insensitive). */\nexport function isEventHandlerAttr(name: string): boolean {\n return /^on/i.test(name);\n}\n\n// A well-formed HTML attribute name: starts with a letter/`_`/`:`, followed by\n// letters, digits, `-`, `_`, `:` or `.`. Rejects whitespace, `=`, quotes and\n// `/`, which is what an attacker needs to break out and inject a new attribute.\nconst SAFE_ATTR_NAME_RE = /^[A-Za-z_:][-A-Za-z0-9_:.]*$/;\n\n/** True if `name` is safe to emit verbatim as an attribute name. */\nexport function isSafeAttrName(name: string): boolean {\n return SAFE_ATTR_NAME_RE.test(name);\n}\n","/**\n * FormaJS HTML Runtime\n *\n * Declarative reactive UI via data-* attributes, powered by fine-grained\n * signals (alien-signals 3.x). Combined into a single, CSP-safe runtime\n * with zero build step required.\n *\n * Design inspirations:\n * Alpine.js — data-* directive model, progressive enhancement\n * SolidJS — fine-grained signals, [getter, setter] tuple, real DOM\n * Qwik — deferred hydration triggers (idle, interaction, visible)\n * Astro — islands architecture, independent interactive regions\n * Hotwire — server-driven UI, reconciler with scope modes\n * Lit — root element access during hydration, (el, props) pattern\n *\n * ┌─────────────────────────────────────────────────────────────────────┐\n * │ Yes, this file is ~3,300 lines. It's a monolith on purpose. │\n * │ │\n * │ The HTML Runtime is a self-contained unit: expression parser, │\n * │ handler compiler, transition system, DOM scanner, and observer │\n * │ all share mutable state (debug flags, caches, eval mode). Keeping │\n * │ them in one file avoids circular imports, simplifies the build │\n * │ (single IIFE for CDN), and means `grep` always finds what you │\n * │ need. The sections are clearly marked — use the map below. │\n * │ │\n * │ Will it be split someday? Maybe. But today it works, it's tested │\n * │ and the CDN runtime bundle ships at ~24KB gzipped. If you're │\n * │ judging the line count — fair. But read the code first. :) │\n * └─────────────────────────────────────────────────────────────────────┘\n *\n * This file is the HTML Runtime — a subpath of @getforma/core:\n * import '@getforma/core/runtime' (ESM)\n * <script src=\"...runtime.global.js\"> (CDN)\n *\n * It is separate from the main @getforma/core entry point, which exports\n * signals, h(), mount, stores, etc. The main entry has zero network code.\n * HTTP/storage/server are at @getforma/core/http, /storage, /server.\n *\n * Usage (CDN):\n * <script src=\"https://unpkg.com/@getforma/core@1.0.1/dist/formajs-runtime.global.js\"></script>\n * <div data-forma-state='{\"count\": 0}'>\n * <p data-text=\"{count}\"></p>\n * <button data-on:click=\"{count++}\">+1</button>\n * </div>\n *\n * Build outputs from this source file:\n * dist/runtime.js ESM (import '@getforma/core/runtime')\n * dist/runtime.cjs CommonJS (require)\n * dist/formajs-runtime.global.js IIFE for <script> tags (auto-inits)\n * dist/runtime-hardened.js ESM, unsafe-eval locked off (zero new Function)\n * dist/formajs-runtime-hardened.global.js IIFE, unsafe-eval locked off (zero new Function)\n *\n * ── FILE MAP ──────────────────────────────────────────────────────────\n *\n * Line ~31-71 Core types & scope (Getter, Setter, Scope, createChildScope)\n * Line ~73-253 Configuration & diagnostics (debug, CSP modes, containment)\n * Line ~254-344 Performance utilities (yieldToMain, containment hints)\n * Line ~346-534 Regexes, caches, security blocklist (findBlockedMethod)\n * Line ~536-923 Parsing utilities (splitCallArgs, readBalancedSegment, if-handler)\n * Line ~925-1049 Template compilation (data-list templates)\n * Line ~1051-1396 CSS Transitions (parse, run, enter/leave phases)\n * Line ~1398-1809 CSP-safe expression parser (chained access, operators, literals)\n * Line ~1811-2091 Evaluator & handler builder (CSP path + new Function fallback)\n * Line ~2093-2184 State initialization & safe $el proxy\n * Line ~2186-2682 bindElement() — the central directive processor\n * Line ~2684-2952 MutationObserver, directive map, mountScope/unmountScope\n * Line ~2954-3064 Init/destroy, mount/unmount, public API setters\n * Line ~3066-3188 DevTools API, reconciler bridge, exports\n *\n * ── SUPPORTED DIRECTIVES ──────────────────────────────────────────────\n *\n * State & Reactivity:\n * data-forma-state='{\"key\": val}' Declare reactive state (valid JSON)\n * data-computed=\"name = expr\" Derived value (lazy, cached)\n * data-persist=\"{prop}\" Sync state to localStorage\n *\n * Content Binding:\n * data-text=\"{expr}\" Bind text content\n * data-show=\"{expr}\" Toggle visibility (display: none)\n * data-if=\"{expr}\" Conditional render (remove/insert DOM)\n * data-model=\"{prop}\" Two-way input binding\n * data-list=\"{expr}\" List rendering (keyed reconciliation)\n *\n * Attributes & Classes:\n * data-on:event=\"{expr}\" Event handler (e.g. data-on:click)\n * data-class:name=\"{expr}\" Conditional CSS class\n * data-bind:attr=\"{expr}\" Dynamic attribute binding\n *\n * Transitions (for data-show and data-if):\n * data-transition:enter=\"classes\" Classes during enter phase\n * data-transition:enter-from=\"classes\" Classes at enter start\n * data-transition:enter-to=\"classes\" Classes at enter end\n * data-transition:leave=\"classes\" Classes during leave phase\n * data-transition:leave-from=\"classes\" Classes at leave start\n * data-transition:leave-to=\"classes\" Classes at leave end\n *\n * Refs:\n * data-ref=\"name\" Register element for $refs.name access\n *\n * Data Fetching:\n * data-fetch=\"GET /url → prop\" Fetch data into state\n * data-fetch=\"POST /url → prop\" POST with state as body\n * data-fetch-id=\"name\" Register for $refetch('name')\n *\n * Configuration (on <script> tag):\n * data-forma-unsafe-eval=\"true\" Enable new Function() fallback\n * data-forma-diagnostics=\"true\" Enable expression diagnostics\n * data-forma-auto-containment=\"true\" Enable CSS containment hints\n *\n * ── MAGIC VARIABLES ──────────────────────────────────────────────────\n *\n * Available in all expressions and handlers:\n * $el The current DOM element (safe proxy — see createSafeElProxy)\n * $dispatch Fire a CustomEvent: $dispatch('name', detail?)\n * Events bubble and cross Shadow DOM (composed: true)\n * $event The DOM event object (in data-on:* handlers only)\n * event Alias for $event (also in data-on:* handlers)\n * $refs Named element references: $refs.myInput (via data-ref=\"myInput\")\n * $refetch Re-trigger a data-fetch: $refetch('fetch-id')\n */\nimport { createSignal, internalEffect, createComputed, batch } from './reactive';\nimport { reconcileList, type ListTransitionHooks } from './dom/list';\nimport { createReconciler } from './dom/reconcile';\nimport { isDangerousUrl, isUrlAttr, isEventHandlerAttr } from './security/url-safety';\n\n/**\n * True if writing `value` to attribute `name` via setAttribute would create an\n * XSS sink: an `on*` inline event handler, or a URL attribute carrying a\n * script-executing scheme. Shared by data-bind:* and list-template binding.\n */\nfunction isUnsafeAttrBinding(name: string, value: string): boolean {\n if (isEventHandlerAttr(name)) return true;\n if (isUrlAttr(name) && isDangerousUrl(value)) return true;\n return false;\n}\n\ntype Getter = () => unknown;\ntype Setter = (v: unknown) => void;\n\ninterface Scope {\n getters: Record<string, Getter>;\n setters: Record<string, Setter>;\n}\n\n// ── $refetch registry ──\n// Maps data-fetch-id values to their doFetch() functions so handlers can\n// trigger imperative refetches via $refetch('id').\nconst _refetchRegistry = new Map<string, () => void>();\n\nfunction $refetch(id: string): void {\n const fn = _refetchRegistry.get(id);\n if (fn) {\n fn();\n } else if (_debug) {\n dbg(`$refetch: no data-fetch with id \"${id}\" found`);\n }\n}\n\nfunction createChildScope(parent: Scope, locals: Record<string, unknown>): Scope {\n const localGetters: Record<string, Getter> = Object.create(null);\n for (const key of Object.keys(locals)) {\n localGetters[key] = () => locals[key];\n }\n\n return {\n getters: new Proxy(parent.getters, {\n get(target, prop: string) {\n if (prop in localGetters) return localGetters[prop];\n return target[prop];\n },\n has(target, prop: string) {\n return prop in localGetters || prop in target;\n },\n }),\n setters: parent.setters,\n };\n}\n\n// ── Debug logger — enable via FormaRuntime.debug = true or window.__FORMA_DEBUG = true ──\nlet _debug = false;\ntype UnsafeEvalMode = 'mutable' | 'locked-off' | 'locked-on';\nlet _unsafeEvalMode: UnsafeEvalMode = 'mutable';\nlet _allowUnsafeEval = false;\nlet _diagnosticsEnabled = true;\nfunction dbg(...args: unknown[]): void {\n if (_debug || (typeof window !== 'undefined' && (window as any).__FORMA_DEBUG)) {\n console.log('[FormaJS]', ...args);\n }\n}\n\ninterface RuntimeConfig {\n allowUnsafeEval?: boolean;\n unsafeEvalMode?: UnsafeEvalMode;\n lockUnsafeEval?: boolean;\n diagnostics?: boolean;\n autoContainment?: boolean;\n}\n\ninterface RuntimeDiagnostic {\n kind: 'handler-unsupported' | 'expression-unsupported';\n expr: string;\n reason: string;\n count: number;\n firstSeenAt: number;\n lastSeenAt: number;\n}\n\nconst diagnostics = new Map<string, RuntimeDiagnostic>();\n\nfunction parseBooleanFlag(raw: string | null | undefined): boolean | undefined {\n if (raw == null) return undefined;\n const normalized = raw.trim().toLowerCase();\n if (normalized === '1' || normalized === 'true' || normalized === 'on' || normalized === 'yes') return true;\n if (normalized === '0' || normalized === 'false' || normalized === 'off' || normalized === 'no') return false;\n return undefined;\n}\n\nfunction parseUnsafeEvalMode(raw: string | null | undefined): UnsafeEvalMode | undefined {\n if (raw == null) return undefined;\n const normalized = raw.trim().toLowerCase();\n if (normalized === 'mutable') return 'mutable';\n if (normalized === 'locked-off' || normalized === 'off' || normalized === 'disabled') {\n return 'locked-off';\n }\n if (normalized === 'locked-on' || normalized === 'on' || normalized === 'enabled') {\n return 'locked-on';\n }\n return undefined;\n}\n\nfunction readRuntimeConfig(): RuntimeConfig {\n const config: RuntimeConfig = {};\n\n if (typeof window !== 'undefined') {\n const globalConfig = (window as any).__FORMA_RUNTIME_CONFIG as RuntimeConfig | undefined;\n if (globalConfig) {\n if (typeof globalConfig.allowUnsafeEval === 'boolean') {\n config.allowUnsafeEval = globalConfig.allowUnsafeEval;\n }\n if (typeof globalConfig.unsafeEvalMode === 'string') {\n const parsed = parseUnsafeEvalMode(globalConfig.unsafeEvalMode);\n if (parsed) config.unsafeEvalMode = parsed;\n }\n if (typeof globalConfig.lockUnsafeEval === 'boolean') {\n config.lockUnsafeEval = globalConfig.lockUnsafeEval;\n }\n if (typeof globalConfig.diagnostics === 'boolean') {\n config.diagnostics = globalConfig.diagnostics;\n }\n if (typeof globalConfig.autoContainment === 'boolean') {\n config.autoContainment = globalConfig.autoContainment;\n }\n }\n }\n\n if (typeof document !== 'undefined') {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script) {\n const unsafeFromAttr = parseBooleanFlag(script.getAttribute('data-forma-unsafe-eval'));\n if (unsafeFromAttr !== undefined) {\n config.allowUnsafeEval = unsafeFromAttr;\n }\n const modeFromAttr = parseUnsafeEvalMode(\n script.getAttribute('data-forma-unsafe-eval-mode'),\n );\n if (modeFromAttr !== undefined) {\n config.unsafeEvalMode = modeFromAttr;\n }\n const lockFromAttr = parseBooleanFlag(script.getAttribute('data-forma-lock-unsafe-eval'));\n if (lockFromAttr !== undefined) {\n config.lockUnsafeEval = lockFromAttr;\n }\n const diagnosticsFromAttr = parseBooleanFlag(script.getAttribute('data-forma-diagnostics'));\n if (diagnosticsFromAttr !== undefined) {\n config.diagnostics = diagnosticsFromAttr;\n }\n const containmentFromAttr = parseBooleanFlag(script.getAttribute('data-forma-auto-containment'));\n if (containmentFromAttr !== undefined) {\n config.autoContainment = containmentFromAttr;\n }\n }\n }\n\n return config;\n}\n\nfunction reportDiagnostic(\n kind: RuntimeDiagnostic['kind'],\n expr: string,\n reason: string,\n): void {\n if (!_diagnosticsEnabled) return;\n\n const key = `${kind}|${reason}|${expr}`;\n const now = Date.now();\n const existing = diagnostics.get(key);\n\n if (existing) {\n existing.count += 1;\n existing.lastSeenAt = now;\n } else {\n diagnostics.set(key, {\n kind,\n expr,\n reason,\n count: 1,\n firstSeenAt: now,\n lastSeenAt: now,\n });\n console.warn(`[FormaJS] ${reason}: ${expr}`);\n }\n\n try {\n if (typeof window !== 'undefined') {\n const detail = {\n kind,\n expr,\n reason,\n count: diagnostics.get(key)?.count ?? 1,\n };\n window.dispatchEvent(new CustomEvent('formajs:diagnostic', { detail }));\n }\n } catch {\n // Ignore event dispatch failures\n }\n}\n\ndeclare const __FORMA_UNSAFE_EVAL_MODE__: string | undefined;\n\n/**\n * Compile-time flag: true when the build CAN use new Function().\n * In the hardened build, __FORMA_UNSAFE_EVAL_MODE__ is \"locked-off\" and\n * esbuild constant-folds this to `false`, allowing dead code elimination\n * of all new Function() paths. This ensures Socket.dev/Snyk static analysis\n * does not flag eval usage in the hardened build.\n */\nconst __EVAL_CAPABLE__ = typeof __FORMA_UNSAFE_EVAL_MODE__ !== 'string'\n || __FORMA_UNSAFE_EVAL_MODE__ !== 'locked-off';\n\nconst buildUnsafeEvalMode = parseUnsafeEvalMode(\n typeof __FORMA_UNSAFE_EVAL_MODE__ === 'string'\n ? __FORMA_UNSAFE_EVAL_MODE__\n : undefined,\n);\n\nif (buildUnsafeEvalMode) {\n _unsafeEvalMode = buildUnsafeEvalMode;\n if (_unsafeEvalMode === 'locked-off') _allowUnsafeEval = false;\n if (_unsafeEvalMode === 'locked-on') _allowUnsafeEval = true;\n if (_unsafeEvalMode === 'mutable') _allowUnsafeEval = true;\n}\n\nconst runtimeConfig = readRuntimeConfig();\nconst configUnsafeMode = runtimeConfig.lockUnsafeEval\n ? 'locked-off'\n : runtimeConfig.unsafeEvalMode;\nif (configUnsafeMode) {\n _unsafeEvalMode = configUnsafeMode;\n if (_unsafeEvalMode === 'locked-off') _allowUnsafeEval = false;\n if (_unsafeEvalMode === 'locked-on') _allowUnsafeEval = true;\n}\nif (\n _unsafeEvalMode === 'mutable'\n && typeof runtimeConfig.allowUnsafeEval === 'boolean'\n) {\n _allowUnsafeEval = runtimeConfig.allowUnsafeEval;\n}\nif (typeof runtimeConfig.diagnostics === 'boolean') {\n _diagnosticsEnabled = runtimeConfig.diagnostics;\n}\nconst _autoContainment = runtimeConfig.autoContainment === true;\n\ninterface SchedulerLike {\n yield?: () => Promise<unknown>;\n postTask?: (\n callback: () => void,\n options?: { priority?: 'user-blocking' | 'user-visible' | 'background' },\n ) => Promise<unknown>;\n}\n\nfunction getScheduler(): SchedulerLike | undefined {\n const candidate = (globalThis as any)?.scheduler as SchedulerLike | undefined;\n if (!candidate) return undefined;\n if (typeof candidate.yield === 'function' || typeof candidate.postTask === 'function') {\n return candidate;\n }\n return undefined;\n}\n\n/** Yield control to keep the main thread responsive during large batches. */\nasync function yieldToMain(): Promise<void> {\n const scheduler = getScheduler();\n if (scheduler?.yield) {\n await scheduler.yield();\n return;\n }\n if (scheduler?.postTask) {\n await scheduler.postTask(() => {}, { priority: 'background' });\n return;\n }\n await new Promise<void>((resolve) => setTimeout(resolve, 0));\n}\n\ninterface ContainmentHintsOptions {\n selector?: string;\n contain?: string;\n contentVisibility?: string;\n containIntrinsicSize?: string;\n skipIfAlreadySet?: boolean;\n}\n\n/** Apply CSS containment hints to opt-in containers for lower layout/paint cost. */\nfunction applyContainmentHints(\n root: ParentNode = document,\n options: ContainmentHintsOptions = {},\n): number {\n const selector = options.selector ?? '[data-forma-contain]';\n if (!selector) return 0;\n if (typeof (root as ParentNode).querySelectorAll !== 'function') return 0;\n\n const nodes = root.querySelectorAll(selector);\n let applied = 0;\n for (let i = 0; i < nodes.length; i++) {\n const el = nodes[i] as HTMLElement;\n if (!el?.style) continue;\n\n const contain = el.getAttribute('data-forma-contain') ?? options.contain ?? 'layout style paint';\n const contentVisibility = el.getAttribute('data-forma-content-visibility')\n ?? options.contentVisibility\n ?? 'auto';\n const containIntrinsicSize = el.getAttribute('data-forma-contain-intrinsic-size')\n ?? options.containIntrinsicSize\n ?? 'auto 800px';\n const skipExisting = options.skipIfAlreadySet === true;\n let changed = false;\n\n const containCurrent = el.style.getPropertyValue('contain');\n const contentVisCurrent = el.style.getPropertyValue('content-visibility');\n const containSizeCurrent = el.style.getPropertyValue('contain-intrinsic-size');\n\n if (contain !== 'off' && (!skipExisting || !containCurrent)) {\n el.style.setProperty('contain', contain);\n changed = true;\n }\n if (contentVisibility !== 'off' && (!skipExisting || !contentVisCurrent)) {\n el.style.setProperty('content-visibility', contentVisibility);\n changed = true;\n }\n if (containIntrinsicSize !== 'off' && (!skipExisting || !containSizeCurrent)) {\n el.style.setProperty('contain-intrinsic-size', containIntrinsicSize);\n changed = true;\n }\n\n if (changed) applied++;\n }\n\n if (_debug && applied > 0) {\n dbg('applyContainmentHints: applied to', applied, 'element(s)');\n }\n return applied;\n}\n\n// ── Pre-compiled regexes (avoid re-creation in hot paths) ──\n\nconst RE_STRING_SINGLE = /^'[^']*'$/;\nconst RE_STRING_DOUBLE = /^\"[^\"]*\"$/;\nconst RE_NUMBER = /^-?\\d+(\\.\\d+)?$/;\nconst RE_IDENTIFIER = /^[a-zA-Z_$]\\w*$/;\nconst RE_DOT_ACCESS = /^(\\w+)\\.(\\w+)$/;\nconst RE_DEEP_DOT = /^(\\w+)\\.(\\w+)\\.(\\w+)(?:\\.(\\w+))?$/;\nconst RE_BRACKET = /^(\\w+)\\[(\\d+|'[^']*'|\"[^\"]*\")\\]$/;\nconst RE_TERNARY = /^(.+?)\\s*\\?\\s*(.+?)\\s*:\\s*(.+)$/;\nconst RE_NULLISH = /^(.+?)\\s*\\?\\?\\s*(.+)$/;\nconst RE_AND = /^(.+?)\\s*&&\\s*(.+)$/;\nconst RE_OR = /^(.+?)\\s*\\|\\|\\s*(.+)$/;\n\n/**\n * Split an expression at the FIRST top-level occurrence of one of `ops`,\n * skipping operators that appear inside string/template literals or nested\n * brackets. This replaces whole-string regexes that mis-split operators inside\n * string literals (e.g. `'a' + '-' + 'b'` split at the '-' inside the literal).\n * Splits at the RIGHTMOST top-level binary operator so the recursive descent is\n * left-associative (`a - b - c` => `(a - b) - c`). A `+`/`-` that follows another\n * operator or an open bracket is treated as unary and never split on.\n */\nconst UNARY_PRECEDERS = '+-*/%<>=!&|^~(,[{?:';\nfunction matchBinaryOp(\n expr: string,\n ops: readonly string[],\n): { left: string; op: string; right: string } | null {\n const SQ = String.fromCharCode(39); // '\n const DQ = String.fromCharCode(34); // \"\n const BT = String.fromCharCode(96); // `\n const BS = String.fromCharCode(92); // backslash\n let depth = 0;\n let inSingle = false, inDouble = false, inTemplate = false, escaped = false;\n let prevSig = ''; // previous significant (non-space) char at depth 0\n let bestIdx = -1;\n let bestOp = '';\n for (let i = 0; i < expr.length; i++) {\n const ch = expr[i]!;\n if (escaped) { escaped = false; continue; }\n if (ch === BS && (inSingle || inDouble || inTemplate)) { escaped = true; continue; }\n if (inSingle) { if (ch === SQ) { inSingle = false; prevSig = DQ; } continue; }\n if (inDouble) { if (ch === DQ) { inDouble = false; prevSig = DQ; } continue; }\n if (inTemplate) { if (ch === BT) { inTemplate = false; prevSig = DQ; } continue; }\n if (ch === SQ) { inSingle = true; continue; }\n if (ch === DQ) { inDouble = true; continue; }\n if (ch === BT) { inTemplate = true; continue; }\n if (ch === '(' || ch === '[' || ch === '{') { depth++; prevSig = ch; continue; }\n if (ch === ')' || ch === ']' || ch === '}') { if (depth > 0) depth--; prevSig = ch; continue; }\n if (depth !== 0) continue;\n if (ch === ' ' || ch === '\\t' || ch === '\\n') continue; // whitespace is transparent\n if (i > 0) {\n let matchedOp = '';\n for (const op of ops) {\n if (expr.startsWith(op, i)) { matchedOp = op; break; }\n }\n if (matchedOp) {\n const isPlusMinus = matchedOp === '+' || matchedOp === '-';\n const unary = isPlusMinus && (prevSig === '' || UNARY_PRECEDERS.includes(prevSig));\n // Record the rightmost BINARY operator (skip unary +/-).\n if (!unary) { bestIdx = i; bestOp = matchedOp; }\n i += matchedOp.length - 1;\n prevSig = matchedOp[matchedOp.length - 1]!;\n continue;\n }\n }\n prevSig = ch;\n }\n if (bestIdx === -1) return null;\n return { left: expr.slice(0, bestIdx).trim(), op: bestOp, right: expr.slice(bestIdx + bestOp.length).trim() };\n}\nconst RE_TEMPLATE_LIT = /^`([^`]*)`$/;\nconst RE_TEMPLATE_INTERP = /\\$\\{([^}]+)\\}/g;\nconst RE_METHOD_CALL = /^(\\w+)\\.(\\w+)\\((.*)\\)$/;\nconst RE_GROUP_METHOD_CALL = /^\\((.+)\\)\\.(\\w+)\\((.*)\\)$/;\nconst RE_STRIP_BRACES = /^\\{|\\}$/g;\nconst RE_ITEM_TEMPLATE = /\\{item\\.?(\\w*)\\}/g;\nconst RE_DIGIT_ONLY = /^\\d+$/;\nconst RE_POST_INCR = /^(\\w+)(\\+\\+|--)$/;\nconst RE_PRE_INCR = /^(\\+\\+|--)(\\w+)$/;\nconst RE_TOGGLE = /^(\\w+)\\s*=\\s*!(\\w+)$/;\nconst RE_ASSIGN = /^(\\w+)\\s*=\\s*(.+)$/;\nconst RE_COMPOUND = /^(\\w+)\\s*(\\+=|-=|\\*=|\\/=)\\s*(.+)$/;\nconst RE_IF_PREFIX = /^if\\b/;\n// RE_UNQUOTED_KEYS removed in v0.5.0 — relaxed JSON parsing corrupted URLs\n// and string values containing colons. Use valid JSON in data-forma-state.\nconst RE_COMPUTED = /^(\\w+)\\s*=\\s*(.+)$/;\nconst RE_FETCH = /^(.+?)(?:→|->)\\s*(\\S+)(.*)$/;\nconst RE_FETCH_METHOD = /^(GET|POST|PUT|PATCH|DELETE)\\s+(.+)$/i;\nconst RE_STRIP_ITEM_BRACES = /^\\{item\\.?|\\}$/g;\n// Detect expressions referencing DOM event parameters — these can't be resolved\n// through scope getters and must fall through to the new Function handler path.\nconst RE_EVENT_REF = /\\bevent\\s*[.([]|\\$event\\b/;\nconst RE_REFETCH_CALL = /^\\$refetch\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)$/;\n\ninterface TransitionSpec {\n enter: string[];\n enterFrom: string[];\n enterTo: string[];\n leave: string[];\n leaveFrom: string[];\n leaveTo: string[];\n enterDurationMs?: number;\n leaveDurationMs?: number;\n}\n\ninterface ElementTransitionState {\n token: number;\n cancel: (() => void) | null;\n}\n\nconst TRANSITION_STATE_SYM = Symbol.for('forma-transition-state');\n\n// ── Expression factory cache ──\n// Maps expression string -> factory function that takes a scope and returns a getter.\n// This avoids re-parsing the same expression pattern across different scopes.\ntype ExpressionFactory = (scope: Scope) => (() => unknown) | null;\nconst EXPRESSION_CACHE_MAX = 2048;\nconst expressionCache = new Map<string, ExpressionFactory>();\nfunction cacheExpression(key: string, factory: ExpressionFactory): void {\n if (expressionCache.size >= EXPRESSION_CACHE_MAX) {\n // Evict oldest entry (first inserted)\n const first = expressionCache.keys().next().value;\n if (first !== undefined) expressionCache.delete(first);\n }\n expressionCache.set(key, factory);\n}\nlet scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n\ninterface HandlerBuildResult {\n handler: (e: Event) => void;\n supported: boolean;\n}\n\nlet scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n\n// ── Compiled template cache ──\n// Pre-splits template text into static/dynamic segments for fast re-evaluation.\ninterface CompiledTemplate {\n statics: string[];\n dynamics: string[]; // expression strings between {item.xxx}\n hasItemRef: boolean;\n}\n\nconst compiledTemplateCache = new Map<string, CompiledTemplate>();\nconst COMPILED_TEMPLATE_CACHE_MAX = 2048;\nfunction cacheCompiledTemplate(key: string, template: CompiledTemplate): void {\n if (compiledTemplateCache.size >= COMPILED_TEMPLATE_CACHE_MAX) {\n // Evict oldest entry (first inserted)\n const first = compiledTemplateCache.keys().next().value;\n if (first !== undefined) compiledTemplateCache.delete(first);\n }\n compiledTemplateCache.set(key, template);\n}\nconst UNSAFE_METHOD_NAMES = new Set([\n 'constructor', '__proto__', 'prototype',\n '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__',\n 'eval', 'Function',\n]);\n\n/**\n * Pre-compiled regexes for each blocked method name — avoids re-creating\n * RegExp objects on every call.\n */\nconst BLOCKED_METHOD_REGEXES: Array<{ name: string; dotRe: RegExp; bracketRe: RegExp }> = (() => {\n const result: Array<{ name: string; dotRe: RegExp; bracketRe: RegExp }> = [];\n for (const name of UNSAFE_METHOD_NAMES) {\n const escaped = name.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n result.push({\n name,\n // Match as property access (.name) or bare identifier at start\n dotRe: new RegExp(`(?:^|\\\\.)${escaped}(?:\\\\s*\\\\(|\\\\s*$|[^\\\\w$])`, 'm'),\n // Match bracket access with single quotes, double quotes, or backticks\n bracketRe: new RegExp(`\\\\[\\\\s*(?:'${escaped}'|\"${escaped}\"|` + '`' + escaped + '`' + `)\\\\s*\\\\]`),\n });\n }\n return result;\n})();\n\n/**\n * Scan an expression string for any UNSAFE_METHOD_NAMES usage.\n * Uses word-boundary matching to avoid false positives on substrings\n * (e.g. \"constructorValue\" should not match \"constructor\").\n *\n * Before scanning:\n * 1. Strips JS block comments and line comments\n * 2. Normalizes whitespace around dots (e.g. \"x . constructor\" → \"x.constructor\")\n * 3. Checks bracket access with static string literals and backtick templates\n * 4. Detects string concatenation inside brackets that could produce a blocked name\n *\n * Returns the matched blocked name, or null if clean.\n */\nfunction findBlockedMethod(expr: string): string | null {\n // Strip block comments (/* ... */)\n let cleaned = expr.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n // Strip line comments (// ... to end of line)\n cleaned = cleaned.replace(/\\/\\/[^\\n]*/g, '');\n // Normalize whitespace around dots: \"x . constructor\" → \"x.constructor\"\n cleaned = cleaned.replace(/\\s*\\.\\s*/g, '.');\n\n for (const { name, dotRe, bracketRe } of BLOCKED_METHOD_REGEXES) {\n if (dotRe.test(cleaned)) return name;\n if (bracketRe.test(cleaned)) return name;\n }\n\n // Layer 2: detect string concatenation inside brackets that could produce\n // a blocked name. Extract all bracket contents and check if concatenated\n // string fragments could form a blocked name.\n // e.g. x['constr' + 'uctor'] → extract 'constr' and 'uctor' → 'constructor'\n if (cleaned.includes('[')) {\n const bracketContents = extractBracketContents(cleaned);\n for (const content of bracketContents) {\n // Only check contents with concatenation operators\n if (!content.includes('+')) continue;\n // Extract all string literal fragments and join them\n const fragments = content.match(/['\"`]([^'\"`]*?)['\"`]/g);\n if (!fragments) continue;\n const joined = fragments.map(f => f.slice(1, -1)).join('');\n if (UNSAFE_METHOD_NAMES.has(joined)) return joined;\n }\n }\n\n return null;\n}\n\n/** Extract the contents of all bracket access expressions (between [ and ]). */\nfunction extractBracketContents(expr: string): string[] {\n const results: string[] = [];\n let depth = 0;\n let start = -1;\n for (let i = 0; i < expr.length; i++) {\n if (expr[i] === '[') {\n if (depth === 0) start = i + 1;\n depth++;\n } else if (expr[i] === ']') {\n depth--;\n if (depth === 0 && start >= 0) {\n results.push(expr.slice(start, i));\n start = -1;\n }\n }\n }\n return results;\n}\n\nconst TEXT_BINDING_SYM = Symbol.for('forma-text-binding-cache');\n\ninterface TextBindingCache {\n initialized: boolean;\n last: string;\n node: Text | null;\n}\n\nfunction toTextValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string') return value;\n if (typeof value === 'symbol') return value.toString();\n return String(value);\n}\n\nfunction setElementTextFast(el: Element, next: string): void {\n let cache = (el as any)[TEXT_BINDING_SYM] as TextBindingCache | undefined;\n if (!cache) {\n cache = { initialized: false, last: '', node: null };\n (el as any)[TEXT_BINDING_SYM] = cache;\n }\n\n if (cache.initialized && cache.last === next) return;\n\n // Reuse direct text-node writes when this element is a single text child.\n let node = cache.node;\n if (!node || node.parentNode !== el || el.childNodes.length !== 1 || el.firstChild !== node) {\n if (el.childNodes.length === 1 && el.firstChild?.nodeType === Node.TEXT_NODE) {\n node = el.firstChild as Text;\n cache.node = node;\n } else {\n el.textContent = next;\n const first = el.firstChild;\n cache.node = (first && first.nodeType === Node.TEXT_NODE && el.childNodes.length === 1)\n ? (first as Text)\n : null;\n cache.last = next;\n cache.initialized = true;\n return;\n }\n }\n\n node.data = next;\n cache.last = next;\n cache.initialized = true;\n}\n\nfunction splitCallArgs(raw: string): string[] {\n const out: string[] = [];\n if (raw.trim() === '') return out;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let escaped = false;\n let start = 0;\n\n for (let i = 0; i < raw.length; i++) {\n const ch = raw[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n\n if (ch === '(') {\n depth++;\n continue;\n }\n if (ch === ')') {\n if (depth > 0) depth--;\n continue;\n }\n\n if (ch === ',' && depth === 0) {\n out.push(raw.slice(start, i).trim());\n start = i + 1;\n }\n }\n\n out.push(raw.slice(start).trim());\n return out.filter(Boolean);\n}\n\nfunction readBalancedSegment(\n input: string,\n start: number,\n open: string,\n close: string,\n): { inner: string; end: number } | null {\n if (input[start] !== open) return null;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n\n for (let i = start; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === open) {\n depth++;\n continue;\n }\n if (ch === close) {\n depth--;\n if (depth === 0) {\n return {\n inner: input.slice(start + 1, i),\n end: i,\n };\n }\n }\n }\n\n return null;\n}\n\nfunction splitTopLevelStatements(raw: string): string[] {\n const input = raw.trim();\n if (!input) return [];\n\n const out: string[] = [];\n let depthParen = 0;\n let depthBrace = 0;\n let depthBracket = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n let start = 0;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n else if (ch === '{') depthBrace++;\n else if (ch === '}' && depthBrace > 0) depthBrace--;\n else if (ch === '[') depthBracket++;\n else if (ch === ']' && depthBracket > 0) depthBracket--;\n\n if (ch === ';' && depthParen === 0 && depthBrace === 0 && depthBracket === 0) {\n const stmt = input.slice(start, i).trim();\n if (stmt) out.push(stmt);\n start = i + 1;\n }\n }\n\n const tail = input.slice(start).trim();\n if (tail) out.push(tail);\n return out;\n}\n\nfunction consumeStatement(raw: string): { body: string; rest: string } | null {\n const input = raw.trim();\n if (!input) return null;\n\n if (input.startsWith('{')) {\n const block = readBalancedSegment(input, 0, '{', '}');\n if (!block) return null;\n const body = block.inner.trim();\n let rest = input.slice(block.end + 1).trim();\n if (rest.startsWith(';')) rest = rest.slice(1).trim();\n return { body, rest };\n }\n\n let depthParen = 0;\n let depthBrace = 0;\n let depthBracket = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let escaped = false;\n\n for (let i = 0; i < input.length; i++) {\n const ch = input[i]!;\n\n if (escaped) {\n escaped = false;\n continue;\n }\n\n if (ch === '\\\\' && (inSingle || inDouble || inTemplate)) {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === '\\'') inSingle = false;\n continue;\n }\n if (inDouble) {\n if (ch === '\"') inDouble = false;\n continue;\n }\n if (inTemplate) {\n if (ch === '`') inTemplate = false;\n continue;\n }\n\n if (ch === '\\'') {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (ch === '`') {\n inTemplate = true;\n continue;\n }\n\n if (ch === '(') depthParen++;\n else if (ch === ')' && depthParen > 0) depthParen--;\n else if (ch === '{') depthBrace++;\n else if (ch === '}' && depthBrace > 0) depthBrace--;\n else if (ch === '[') depthBracket++;\n else if (ch === ']' && depthBracket > 0) depthBracket--;\n\n if (ch === ';' && depthParen === 0 && depthBrace === 0 && depthBracket === 0) {\n return {\n body: input.slice(0, i).trim(),\n rest: input.slice(i + 1).trim(),\n };\n }\n }\n\n return {\n body: input,\n rest: '',\n };\n}\n\nfunction parseIfHandler(expr: string, scope: Scope): ((e: Event) => void) | null {\n const input = expr.trim();\n if (!RE_IF_PREFIX.test(input)) return null;\n\n // If the expression references DOM event parameters (`event`, `$event`),\n // bail out — these aren't in scope getters and must use new Function.\n if (RE_EVENT_REF.test(input)) return null;\n\n let idx = 2;\n while (idx < input.length && /\\s/.test(input[idx]!)) idx++;\n if (input[idx] !== '(') return null;\n\n const condSegment = readBalancedSegment(input, idx, '(', ')');\n if (!condSegment) return null;\n\n const condExpr = parseExpression(condSegment.inner.trim(), scope);\n if (!condExpr) return null;\n\n let rest = input.slice(condSegment.end + 1).trim();\n const thenStmt = consumeStatement(rest);\n if (!thenStmt || !thenStmt.body) return null;\n\n const thenHandler = parseHandler(thenStmt.body, scope);\n if (!thenHandler) return null;\n\n rest = thenStmt.rest.trim();\n let elseHandler: ((e: Event) => void) | null = null;\n if (rest.startsWith('else')) {\n rest = rest.slice('else'.length).trim();\n const elseStmt = consumeStatement(rest);\n if (!elseStmt || !elseStmt.body) return null;\n elseHandler = parseHandler(elseStmt.body, scope);\n if (!elseHandler) return null;\n rest = elseStmt.rest.trim();\n }\n\n if (rest.length > 0) return null;\n\n return (e: Event) => {\n batch(() => {\n if (condExpr()) thenHandler(e);\n else elseHandler?.(e);\n });\n };\n}\n\nfunction unwrapOuterParens(raw: string): string {\n let expr = raw.trim();\n while (expr.startsWith('(')) {\n const segment = readBalancedSegment(expr, 0, '(', ')');\n if (!segment || segment.end !== expr.length - 1) break;\n const inner = segment.inner.trim();\n if (!inner) break;\n expr = inner;\n }\n return expr;\n}\n\nfunction compileTemplate(text: string): CompiledTemplate {\n const cached = compiledTemplateCache.get(text);\n if (cached) return cached;\n\n const statics: string[] = [];\n const dynamics: string[] = [];\n let lastIndex = 0;\n // Use a fresh regex each time since it has the 'g' flag\n const re = /\\{item\\.?(\\w*)\\}/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n statics.push(text.slice(lastIndex, m.index));\n dynamics.push(m[1]!); // the key after \"item.\" (empty string means whole item)\n lastIndex = re.lastIndex;\n }\n statics.push(text.slice(lastIndex));\n\n const result: CompiledTemplate = {\n statics,\n dynamics,\n hasItemRef: dynamics.length > 0,\n };\n cacheCompiledTemplate(text, result);\n return result;\n}\n\n// ── Template text caching for data-list ──\n\n/** Maps text nodes to their compiled template (pre-split static/dynamic segments). */\nconst templateTexts = new WeakMap<Node, CompiledTemplate>();\n\n/**\n * Resolve template placeholders in a text string using pre-compiled template.\n * Concatenates static segments with evaluated dynamic segments.\n */\nfunction resolveTemplate(text: string, item: unknown): string {\n const compiled = compileTemplate(text);\n return evaluateCompiledTemplate(compiled, item);\n}\n\n/**\n * Evaluate a pre-compiled template against an item.\n * Only evaluates dynamic parts and concatenates with static segments.\n */\nfunction evaluateCompiledTemplate(compiled: CompiledTemplate, item: unknown): string {\n if (!compiled.hasItemRef) return compiled.statics[0]!;\n let result = compiled.statics[0]!;\n for (let i = 0; i < compiled.dynamics.length; i++) {\n const key = compiled.dynamics[i]!;\n if (!key) {\n result += typeof item === 'object' ? JSON.stringify(item) : String(item ?? '');\n } else {\n result += String((item as Record<string, unknown>)?.[key] ?? '');\n }\n result += compiled.statics[i + 1] ?? '';\n }\n return result;\n}\n\n/**\n * Clone a template element and apply item data to all text node placeholders.\n * Stores the original template text in a WeakMap so updates can re-apply without re-cloning.\n */\nfunction cloneWithTemplateData(template: Element, item: unknown): Element {\n const clone = template.cloneNode(true) as Element;\n const walker = document.createTreeWalker(clone, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n const text = node.textContent ?? '';\n if (text.includes('{item')) {\n const compiled = compileTemplate(text);\n templateTexts.set(node, compiled); // Store compiled template\n node.textContent = evaluateCompiledTemplate(compiled, item);\n }\n }\n // Also process attributes (e.g. data-key, href, src, etc.)\n cloneAttributeTemplates(clone, item);\n return clone;\n}\n\n/**\n * Update an existing cloned element's text nodes with new item data.\n * Uses the cached original template patterns from the WeakMap.\n */\nfunction updateTemplateData(el: Element, item: unknown): void {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n while (walker.nextNode()) {\n const node = walker.currentNode;\n const compiled = templateTexts.get(node);\n if (compiled) {\n node.textContent = evaluateCompiledTemplate(compiled, item);\n }\n }\n}\n\n/** WeakMap for caching compiled attribute templates */\nconst templateAttrs = new WeakMap<Element, Array<{ attr: string; compiled: CompiledTemplate }>>();\n\n/**\n * Process attribute templates on a cloned element and its descendants.\n * Pre-compiles patterns and resolves them with item data.\n */\n/** Directive attribute names/prefixes that bindElement processes — these must NOT be\n * template-interpolated by cloneAttributeTemplates because their values will be\n * evaluated by the reactive binding system using the child scope. */\nconst DIRECTIVE_ATTR_PREFIXES = [\n 'data-list', 'data-show', 'data-text', 'data-if', 'data-model',\n 'data-on:', 'data-class:', 'data-bind:', 'data-computed', 'data-persist', 'data-fetch',\n 'data-transition', 'data-transition:',\n];\nfunction isDirectiveAttr(name: string): boolean {\n for (const prefix of DIRECTIVE_ATTR_PREFIXES) {\n if (name === prefix || name.startsWith(prefix)) return true;\n }\n return false;\n}\n\nfunction splitClassTokens(raw: string | null): string[] {\n if (!raw) return [];\n return raw\n .trim()\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\nfunction parseDurationTokenMs(token: string): number | null {\n const t = token.trim().toLowerCase();\n if (t.endsWith('ms')) {\n const n = Number(t.slice(0, -2));\n return Number.isFinite(n) && n >= 0 ? n : null;\n }\n if (t.endsWith('s')) {\n const n = Number(t.slice(0, -1));\n return Number.isFinite(n) && n >= 0 ? n * 1000 : null;\n }\n return null;\n}\n\nfunction parseClassTokensAndDuration(raw: string | null): { classes: string[]; durationMs?: number } {\n const classes: string[] = [];\n let durationMs: number | undefined;\n for (const token of splitClassTokens(raw)) {\n const parsed = parseDurationTokenMs(token);\n if (parsed != null) {\n durationMs = parsed;\n } else {\n classes.push(token);\n }\n }\n return { classes, durationMs };\n}\n\nfunction uniqueTokens(tokens: string[]): string[] {\n return Array.from(new Set(tokens.filter(Boolean)));\n}\n\nfunction parseCssTimeListMs(raw: string): number[] {\n if (!raw) return [];\n return raw\n .split(',')\n .map((part) => parseDurationTokenMs(part.trim()))\n .filter((ms): ms is number => ms != null);\n}\n\nfunction maxCombinedTimingsMs(durations: number[], delays: number[]): number {\n if (durations.length === 0 && delays.length === 0) return 0;\n if (durations.length === 0) return Math.max(...delays, 0);\n if (delays.length === 0) return Math.max(...durations, 0);\n\n const len = Math.max(durations.length, delays.length);\n let max = 0;\n for (let i = 0; i < len; i++) {\n const d = durations[i % durations.length] ?? 0;\n const delay = delays[i % delays.length] ?? 0;\n if (d + delay > max) max = d + delay;\n }\n return max;\n}\n\nfunction resolveTransitionDurationMs(el: HTMLElement, explicitMs?: number): number {\n if (typeof explicitMs === 'number') return explicitMs;\n const cs = window.getComputedStyle(el);\n const trans = maxCombinedTimingsMs(\n parseCssTimeListMs(cs.transitionDuration),\n parseCssTimeListMs(cs.transitionDelay),\n );\n const anim = maxCombinedTimingsMs(\n parseCssTimeListMs(cs.animationDuration),\n parseCssTimeListMs(cs.animationDelay),\n );\n return Math.max(trans, anim);\n}\n\nfunction getTransitionState(el: HTMLElement): ElementTransitionState {\n const existing = (el as any)[TRANSITION_STATE_SYM] as ElementTransitionState | undefined;\n if (existing) return existing;\n const created: ElementTransitionState = { token: 0, cancel: null };\n (el as any)[TRANSITION_STATE_SYM] = created;\n return created;\n}\n\nfunction clearTransitionState(el: HTMLElement): void {\n const state = (el as any)[TRANSITION_STATE_SYM] as ElementTransitionState | undefined;\n if (state?.cancel) {\n state.cancel();\n }\n delete (el as any)[TRANSITION_STATE_SYM];\n}\n\nfunction parseTransitionSpec(el: Element): TransitionSpec | null {\n const hasTransitionAttr = el.hasAttribute('data-transition')\n || Array.from(el.attributes).some((a) => a.name.startsWith('data-transition:'));\n if (!hasTransitionAttr) return null;\n\n const base = parseClassTokensAndDuration(el.getAttribute('data-transition')).classes;\n\n const enter = parseClassTokensAndDuration(el.getAttribute('data-transition:enter'));\n const leave = parseClassTokensAndDuration(el.getAttribute('data-transition:leave'));\n const enterFrom = splitClassTokens(\n el.getAttribute('data-transition:enter-from')\n ?? el.getAttribute('data-transition:enter-start'),\n );\n const enterTo = splitClassTokens(\n el.getAttribute('data-transition:enter-to')\n ?? el.getAttribute('data-transition:enter-end'),\n );\n const leaveFrom = splitClassTokens(\n el.getAttribute('data-transition:leave-from')\n ?? el.getAttribute('data-transition:leave-start'),\n );\n const leaveTo = splitClassTokens(\n el.getAttribute('data-transition:leave-to')\n ?? el.getAttribute('data-transition:leave-end'),\n );\n\n const durationBoth = parseDurationTokenMs(el.getAttribute('data-transition:duration') ?? '');\n const enterDuration = parseDurationTokenMs(el.getAttribute('data-transition:duration-enter') ?? '')\n ?? enter.durationMs\n ?? durationBoth\n ?? undefined;\n const leaveDuration = parseDurationTokenMs(el.getAttribute('data-transition:duration-leave') ?? '')\n ?? leave.durationMs\n ?? durationBoth\n ?? undefined;\n\n return {\n enter: uniqueTokens([...base, ...enter.classes]),\n enterFrom: uniqueTokens(enterFrom),\n enterTo: uniqueTokens(enterTo),\n leave: uniqueTokens([...base, ...leave.classes]),\n leaveFrom: uniqueTokens(leaveFrom),\n leaveTo: uniqueTokens(leaveTo),\n enterDurationMs: enterDuration,\n leaveDurationMs: leaveDuration,\n };\n}\n\nfunction removeClasses(el: Element, classes: string[]): void {\n for (const cls of classes) {\n el.classList.remove(cls);\n }\n}\n\nfunction addClasses(el: Element, classes: string[]): void {\n for (const cls of classes) {\n el.classList.add(cls);\n }\n}\n\nfunction runTransitionPhase(\n el: HTMLElement,\n phaseClasses: { base: string[]; from: string[]; to: string[]; durationMs?: number },\n onDone: () => void,\n): () => void {\n const cleanupClasses = uniqueTokens([\n ...phaseClasses.base,\n ...phaseClasses.from,\n ...phaseClasses.to,\n ]);\n\n let done = false;\n let timeoutId: number | null = null;\n let raf1: number | null = null;\n let raf2: number | null = null;\n\n const finish = () => {\n if (done) return;\n done = true;\n if (timeoutId != null) window.clearTimeout(timeoutId);\n if (raf1 != null) cancelAnimationFrame(raf1);\n if (raf2 != null) cancelAnimationFrame(raf2);\n removeClasses(el, cleanupClasses);\n onDone();\n };\n\n addClasses(el, phaseClasses.base);\n addClasses(el, phaseClasses.from);\n removeClasses(el, phaseClasses.to);\n\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => {\n if (done) return;\n removeClasses(el, phaseClasses.from);\n addClasses(el, phaseClasses.to);\n\n const ms = resolveTransitionDurationMs(el, phaseClasses.durationMs);\n if (ms <= 0) {\n finish();\n return;\n }\n timeoutId = window.setTimeout(finish, ms + 25);\n });\n });\n\n return finish;\n}\n\n/**\n * Insert an element into the DOM and optionally run an enter transition.\n * The element is functional immediately — the animation is purely visual.\n */\nfunction transitionInsert(\n el: HTMLElement,\n parent: Node,\n ref: Node | null,\n spec: TransitionSpec | null,\n): void {\n parent.insertBefore(el, ref);\n if (!spec) return;\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: spec.enter,\n from: spec.enterFrom,\n to: spec.enterTo,\n durationMs: spec.enterDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n },\n );\n}\n\n/**\n * Run a leave transition on an element, then call onDone when complete.\n * Sets data-forma-leaving immediately so the element is excluded from diffs.\n * If no transition spec, calls onDone synchronously.\n */\nfunction transitionRemove(\n el: HTMLElement,\n spec: TransitionSpec | null,\n onDone: () => void,\n): void {\n // Guard: if already leaving, don't start another leave\n if (el.hasAttribute('data-forma-leaving')) {\n onDone();\n return;\n }\n\n if (!spec) {\n onDone();\n return;\n }\n\n el.setAttribute('data-forma-leaving', '');\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: spec.leave,\n from: spec.leaveFrom,\n to: spec.leaveTo,\n durationMs: spec.leaveDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n el.removeAttribute('data-forma-leaving');\n onDone();\n },\n );\n}\n\nfunction applyShowVisibility(\n el: HTMLElement,\n visible: boolean,\n transition: TransitionSpec | null,\n initial: boolean,\n): void {\n if (!transition || initial) {\n el.style.display = visible ? '' : 'none';\n if (transition) {\n removeClasses(el, uniqueTokens([\n ...transition.enter, ...transition.enterFrom, ...transition.enterTo,\n ...transition.leave, ...transition.leaveFrom, ...transition.leaveTo,\n ]));\n }\n return;\n }\n\n const state = getTransitionState(el);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n state.cancel = null;\n\n if (visible) {\n el.style.display = '';\n state.cancel = runTransitionPhase(\n el,\n {\n base: transition.enter,\n from: transition.enterFrom,\n to: transition.enterTo,\n durationMs: transition.enterDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token === token) current.cancel = null;\n },\n );\n return;\n }\n\n state.cancel = runTransitionPhase(\n el,\n {\n base: transition.leave,\n from: transition.leaveFrom,\n to: transition.leaveTo,\n durationMs: transition.leaveDurationMs,\n },\n () => {\n const current = getTransitionState(el);\n if (current.token !== token) return;\n el.style.display = 'none';\n current.cancel = null;\n },\n );\n}\n\nfunction cloneAttributeTemplates(el: Element, item: unknown): void {\n const all = [el, ...Array.from(el.querySelectorAll('*'))];\n for (const node of all) {\n const entries: Array<{ attr: string; compiled: CompiledTemplate }> = [];\n for (const attr of Array.from(node.attributes)) {\n // Skip directive attributes — they'll be evaluated by bindElement with the child scope\n if (isDirectiveAttr(attr.name)) continue;\n if (attr.value.includes('{item')) {\n const compiled = compileTemplate(attr.value);\n entries.push({ attr: attr.name, compiled });\n const value = evaluateCompiledTemplate(compiled, item);\n if (isUnsafeAttrBinding(attr.name, value)) {\n node.removeAttribute(attr.name);\n } else {\n node.setAttribute(attr.name, value);\n }\n }\n }\n if (entries.length > 0) {\n templateAttrs.set(node, entries);\n }\n }\n}\n\n// ── Chained access / optional chaining parser ──\n\n/**\n * Represents a single step in a property/method chain.\n * - type 'prop': property access (`.name` or `?.name`)\n * - type 'call': method call (`.method(args)` or `?.method(args)`)\n */\ninterface ChainStep {\n type: 'prop' | 'call';\n name: string;\n optional: boolean; // true for `?.`\n argFns?: Array<() => unknown>; // only for 'call' type\n}\n\n/**\n * Parse an expression that starts with an identifier and is followed by\n * zero or more chain steps: `.prop`, `?.prop`, `.method(args)`, `?.method(args)`.\n * Returns null if the expression doesn't match this pattern.\n *\n * Handles: \"user.name\", \"user?.name\", \"str.trim().toUpperCase()\",\n * \"obj?.method()\", \"items.filter(x).map(y)\", \"a.b.c.d\" (any depth).\n */\nfunction parseChainedAccess(expr: string, scope: Scope): (() => unknown) | null {\n // Must start with an identifier (or Math)\n let pos = 0;\n const identMatch = expr.match(/^[a-zA-Z_$]\\w*/);\n if (!identMatch) return null;\n\n const rootName = identMatch[0]!;\n pos = rootName.length;\n\n // Must have at least one chain step after the identifier\n if (pos >= expr.length) return null;\n // Next char must be '.' or '?' (for '?.')\n if (expr[pos] !== '.' && !(expr[pos] === '?' && expr[pos + 1] === '.')) return null;\n\n const steps: ChainStep[] = [];\n\n while (pos < expr.length) {\n let optional = false;\n\n // Check for `?.` (optional chaining) or `.` (regular access)\n if (expr[pos] === '?' && expr[pos + 1] === '.') {\n optional = true;\n pos += 2;\n } else if (expr[pos] === '.') {\n pos += 1;\n } else {\n // Not a chain continuation — unexpected character\n return null;\n }\n\n // Parse property/method name\n const nameMatch = expr.slice(pos).match(/^\\w+/);\n if (!nameMatch) return null;\n const name = nameMatch[0]!;\n pos += name.length;\n\n if (UNSAFE_METHOD_NAMES.has(name)) return () => undefined;\n\n // Check if this is a method call: followed by `(`\n if (pos < expr.length && expr[pos] === '(') {\n const balanced = readBalancedSegment(expr, pos, '(', ')');\n if (!balanced) return null;\n\n const argsRaw = balanced.inner.trim();\n const argFns: Array<() => unknown> = [];\n for (const arg of splitCallArgs(argsRaw)) {\n const parsed = parseExpression(arg, scope);\n if (!parsed) return null;\n argFns.push(parsed);\n }\n\n steps.push({ type: 'call', name, optional, argFns });\n pos = balanced.end + 1;\n } else {\n steps.push({ type: 'prop', name, optional });\n }\n }\n\n // If we didn't consume the entire expression, this isn't a simple chain\n if (pos !== expr.length) return null;\n\n // If there are no steps, fall back (just an identifier)\n if (steps.length === 0) return null;\n\n // Build the root expression getter\n const rootExpr = rootName === 'Math'\n ? (() => Math)\n : (() => scope.getters[rootName]?.());\n\n return () => {\n let val: any = rootExpr();\n for (const step of steps) {\n if (val == null) {\n if (step.optional) return undefined;\n // Non-optional access on null/undefined — use ?. semantics\n // (existing behavior used ?. for dot access)\n return undefined;\n }\n if (step.type === 'prop') {\n val = val[step.name];\n } else {\n const method = val[step.name];\n if (typeof method !== 'function') return undefined;\n const args = step.argFns!.map(fn => fn());\n val = method.apply(val, args);\n }\n }\n return val;\n };\n}\n\n// ── CSP-safe expression parser ──\n\n/**\n * Parse a simple expression into a closure that evaluates against the scope.\n * Handles common patterns without requiring `new Function()` or `eval`.\n * Returns null if the expression is too complex for the CSP-safe parser.\n */\nfunction parseExpression(expr: string, scope: Scope): (() => unknown) | null {\n // Check expression factory cache first\n const cachedFactory = expressionCache.get(expr);\n if (cachedFactory) return cachedFactory(scope);\n\n const result = parseExpressionUncached(expr, scope);\n\n // Cache factory functions for common simple patterns that can be re-bound to different scopes\n if (result !== null) {\n // Cache factories for simple patterns (identifier, dot access, etc.)\n // Complex patterns with sub-expressions are scope-dependent and harder to cache as factories,\n // but we can still cache the structural match result for them.\n // Keyword literals MUST be checked before RE_IDENTIFIER — \"true\", \"false\",\n // \"null\", \"undefined\" all match /^[a-zA-Z_$]\\w*$/ and would be incorrectly\n // cached as scope variable lookups (returning undefined).\n if (expr === 'true' || expr === 'false' || expr === 'null' || expr === 'undefined') {\n const val = expr === 'true' ? true : expr === 'false' ? false : expr === 'null' ? null : undefined;\n cacheExpression(expr, () => () => val);\n } else if (RE_IDENTIFIER.test(expr)) {\n cacheExpression(expr, (s) => () => s.getters[expr]?.());\n } else if (RE_STRING_SINGLE.test(expr) || RE_STRING_DOUBLE.test(expr)) {\n const val = expr.slice(1, -1);\n cacheExpression(expr, () => () => val);\n } else if (RE_NUMBER.test(expr)) {\n const val = Number(expr);\n cacheExpression(expr, () => () => val);\n } else {\n const dotMatch = expr.match(RE_DOT_ACCESS);\n if (dotMatch) {\n const p1 = dotMatch[1]!, p2 = dotMatch[2]!;\n cacheExpression(expr, (s) => () => {\n const obj = s.getters[p1]?.();\n return (obj as any)?.[p2];\n });\n }\n }\n }\n\n return result;\n}\n\n/**\n * Core expression parser — called on cache miss.\n * Uses pre-compiled module-level regexes for all pattern matching.\n */\nfunction parseExpressionUncached(expr: string, scope: Scope): (() => unknown) | null {\n expr = expr.trim();\n\n // Parenthesized group: \"(a + b)\", \"((count))\"\n const unwrapped = unwrapOuterParens(expr);\n if (unwrapped !== expr) {\n return parseExpression(unwrapped, scope);\n }\n\n // Literals first (before identifier check, since \\w matches digits)\n\n // String literals\n if (RE_STRING_SINGLE.test(expr) || RE_STRING_DOUBLE.test(expr)) {\n const val = expr.slice(1, -1);\n return () => val;\n }\n\n // Number literals\n if (RE_NUMBER.test(expr)) {\n const val = Number(expr);\n return () => val;\n }\n\n // Boolean / null / undefined literals\n if (expr === 'true') return () => true;\n if (expr === 'false') return () => false;\n if (expr === 'null') return () => null;\n if (expr === 'undefined') return () => undefined;\n\n // Simple identifier: \"count\", \"name\" (must start with letter/underscore/$)\n if (RE_IDENTIFIER.test(expr)) {\n return () => scope.getters[expr]?.();\n }\n\n // Chained access / method calls / optional chaining:\n // \"user.name\", \"user?.name\", \"str.trim().toUpperCase()\", \"obj?.method()\", \"items.filter(x).map(y)\"\n // Also handles simple dot access, deep dot access, and single method calls.\n {\n const chainResult = parseChainedAccess(expr, scope);\n if (chainResult) return chainResult;\n }\n\n // Grouped method call: \"(expr).method(args)\" — base is a parenthesized expression\n const groupedCallMatch = expr.match(RE_GROUP_METHOD_CALL);\n if (groupedCallMatch) {\n const baseRaw = groupedCallMatch[1]!.trim();\n const methodName = groupedCallMatch[2]!;\n const argsRaw = groupedCallMatch[3]!.trim();\n\n if (UNSAFE_METHOD_NAMES.has(methodName)) return () => undefined;\n\n const baseExpr = parseExpression(baseRaw, scope);\n if (!baseExpr) return null;\n\n const argFns: Array<() => unknown> = [];\n for (const arg of splitCallArgs(argsRaw)) {\n const parsed = parseExpression(arg, scope);\n if (!parsed) return null;\n argFns.push(parsed);\n }\n\n return () => {\n const base = baseExpr() as any;\n const method = base?.[methodName];\n if (typeof method !== 'function') return undefined;\n const args = argFns.map(fn => fn());\n return method.apply(base, args);\n };\n }\n\n // Negation: \"!active\", \"!user.loggedIn\"\n if (expr.startsWith('!')) {\n const inner = parseExpression(expr.slice(1).trim(), scope);\n if (inner) return () => !inner();\n }\n\n // Bracket access: \"items[0]\", \"obj['key']\"\n const bracketMatch = expr.match(RE_BRACKET);\n if (bracketMatch) {\n const objExpr = parseExpression(bracketMatch[1]!, scope);\n let key: string | number;\n const rawKey = bracketMatch[2]!;\n if (RE_DIGIT_ONLY.test(rawKey)) {\n key = Number(rawKey);\n } else {\n key = rawKey.slice(1, -1);\n }\n if (objExpr) {\n return () => (objExpr() as any)?.[key];\n }\n }\n\n // Array literal: \"[1, 2, 3]\", \"[item.name, item.id]\", \"['a', 'b']\"\n if (expr.startsWith('[')) {\n const balanced = readBalancedSegment(expr, 0, '[', ']');\n if (balanced && balanced.end === expr.length - 1) {\n const inner = balanced.inner.trim();\n if (inner === '') {\n // Empty array: []\n return () => [];\n }\n const elements = splitCallArgs(inner);\n const elementFns: Array<() => unknown> = [];\n let allParsed = true;\n for (const el of elements) {\n const parsed = parseExpression(el.trim(), scope);\n if (!parsed) { allParsed = false; break; }\n elementFns.push(parsed);\n }\n if (allParsed) {\n return () => elementFns.map(fn => fn());\n }\n }\n }\n\n // Ternary: \"expr ? a : b\"\n const ternaryMatch = expr.match(RE_TERNARY);\n if (ternaryMatch) {\n const cond = parseExpression(ternaryMatch[1]!.trim(), scope);\n const then = parseExpression(ternaryMatch[2]!.trim(), scope);\n const els = parseExpression(ternaryMatch[3]!.trim(), scope);\n if (cond && then && els) {\n return () => cond() ? then() : els();\n }\n }\n\n // Nullish coalescing: \"value ?? 'default'\"\n const nullishMatch = expr.match(RE_NULLISH);\n if (nullishMatch) {\n const left = parseExpression(nullishMatch[1]!.trim(), scope);\n const right = parseExpression(nullishMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() ?? right();\n }\n }\n\n // Logical OR: \"a || b\" (lower precedence than AND — checked first)\n const orMatch = expr.match(RE_OR);\n if (orMatch) {\n const left = parseExpression(orMatch[1]!.trim(), scope);\n const right = parseExpression(orMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() || right();\n }\n }\n\n // Logical AND: \"a && b\" (higher precedence than OR — checked after)\n const andMatch = expr.match(RE_AND);\n if (andMatch) {\n const left = parseExpression(andMatch[1]!.trim(), scope);\n const right = parseExpression(andMatch[2]!.trim(), scope);\n if (left && right) {\n return () => left() && right();\n }\n }\n\n // Comparison operators: ===, !==, ==, !=, >=, <=, >, < (longest-first)\n const compMatch = matchBinaryOp(expr, ['===', '!==', '==', '!=', '>=', '<=', '>', '<']);\n if (compMatch) {\n const left = parseExpression(compMatch.left, scope);\n const right = parseExpression(compMatch.right, scope);\n if (left && right) {\n const op = compMatch.op;\n return () => {\n const l = left(), r = right();\n switch (op) {\n case '===': return l === r;\n case '!==': return l !== r;\n case '==': return l == r;\n case '!=': return l != r;\n case '>': return (l as number) > (r as number);\n case '<': return (l as number) < (r as number);\n case '>=': return (l as number) >= (r as number);\n case '<=': return (l as number) <= (r as number);\n }\n };\n }\n }\n\n // Arithmetic: +, -, *, /, %\n // Addition/subtraction first (lower precedence — checked first), then * / %\n const addMatch = matchBinaryOp(expr, ['+', '-']);\n if (addMatch) {\n const left = parseExpression(addMatch.left, scope);\n const right = parseExpression(addMatch.right, scope);\n if (left && right) {\n const op = addMatch.op;\n return () => {\n const l = left(), r = right();\n if (op === '+') return (l as any) + (r as any);\n return (l as number) - (r as number);\n };\n }\n }\n\n // Multiplication / division / modulo (higher precedence — checked after addition)\n const mulMatch = matchBinaryOp(expr, ['*', '/', '%']);\n if (mulMatch) {\n const left = parseExpression(mulMatch.left, scope);\n const right = parseExpression(mulMatch.right, scope);\n if (left && right) {\n const op = mulMatch.op;\n return () => {\n const l = left() as number, r = right() as number;\n switch (op) {\n case '*': return l * r;\n case '/': return l / r;\n case '%': return l % r;\n }\n };\n }\n }\n\n // Template literals: `Hello ${name}`\n const tmplMatch = expr.match(RE_TEMPLATE_LIT);\n if (tmplMatch) {\n const raw = tmplMatch[1]!;\n // Pre-split template literal into static/dynamic segments\n const staticParts: string[] = [];\n const dynamicFns: (() => unknown)[] = [];\n let lastIndex = 0;\n // Create a fresh regex since RE_TEMPLATE_INTERP has the 'g' flag\n const re = new RegExp(RE_TEMPLATE_INTERP.source, 'g');\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n staticParts.push(raw.slice(lastIndex, m.index));\n const inner = parseExpression(m[1]!.trim(), scope);\n if (!inner) return null; // Can't parse inner expression\n dynamicFns.push(inner);\n lastIndex = re.lastIndex;\n }\n staticParts.push(raw.slice(lastIndex));\n\n // Optimized evaluation: concatenate instead of map+join\n return () => {\n let result = staticParts[0]!;\n for (let i = 0; i < dynamicFns.length; i++) {\n result += String(dynamicFns[i]!() ?? '');\n result += staticParts[i + 1] ?? '';\n }\n return result;\n };\n }\n\n // Can't parse — return null for fallback\n return null;\n}\n\n// ── Expression evaluator ──\n\nfunction getScopeCache<T>(cache: WeakMap<Scope, Map<string, T>>, scope: Scope): Map<string, T> {\n let scoped = cache.get(scope);\n if (!scoped) {\n scoped = new Map<string, T>();\n cache.set(scope, scoped);\n }\n return scoped;\n}\n\n/** Build an actionable hint for expressions/handlers that failed CSP-safe parsing. */\nfunction cspExpressionHint(expr: string): string {\n if (expr.includes('...')) {\n return `Unsupported expression in CSP-safe mode: spread syntax detected. Use .concat() instead, or enable unsafe-eval via setUnsafeEval(true).`;\n }\n // Note: optional chaining (?.) is now supported by the CSP-safe parser.\n if (expr.includes('=>')) {\n return `Unsupported expression in CSP-safe mode: arrow function detected. Extract logic to a data-computed attribute, or enable unsafe-eval via setUnsafeEval(true).`;\n }\n return `Unsupported expression in CSP-safe mode. Simplify the expression or enable unsafe-eval via setUnsafeEval(true).`;\n}\n\nfunction buildEvaluator(expr: string, scope: Scope): () => unknown {\n const cleaned = expr.replace(RE_STRIP_BRACES, '').trim();\n const cache = getScopeCache(scopeExpressionCache, scope);\n const cached = cache.get(cleaned);\n if (cached) return cached;\n\n // Try CSP-safe parsing first\n const cspFn = parseExpression(cleaned, scope);\n if (cspFn) {\n cache.set(cleaned, cspFn);\n return cspFn;\n }\n\n // Fallback to Function constructor (for complex expressions)\n // __EVAL_CAPABLE__ is a compile-time constant — in the hardened build,\n // esbuild constant-folds it to false and eliminates this entire block,\n // ensuring no `new Function` appears in the hardened dist.\n if (!__EVAL_CAPABLE__ || !_allowUnsafeEval) {\n dbg('buildEvaluator: blocked unsafe eval fallback for expression:', cleaned);\n reportDiagnostic('expression-unsupported', cleaned, cspExpressionHint(cleaned));\n const blocked = () => undefined;\n cache.set(cleaned, blocked);\n return blocked;\n }\n\n // Apply UNSAFE_METHOD_NAMES blocklist before new Function — prevents\n // prototype-pollution and eval injection via the unsafe eval path.\n const blockedMethod = findBlockedMethod(cleaned);\n if (blockedMethod) {\n const msg = `Blocked unsafe method \"${blockedMethod}\" in expression`;\n reportDiagnostic('expression-unsupported', cleaned, msg);\n throw new Error(`[FormaJS] ${msg}: ${cleaned}`);\n }\n\n try {\n const fn = new Function('__scope', `with(__scope) { return (${cleaned}); }`);\n // Cache proxy — scope.getters is a mutable object, so the proxy\n // always reflects current state without needing to be recreated.\n const proxy = new Proxy(Object.create(null) as Record<string, unknown>, {\n has(_, key: string) { return key in scope.getters; },\n get(_, key: string) {\n // Defense-in-depth: block dangerous property access even if\n // findBlockedMethod missed a bypass (e.g. computed bracket names)\n if (UNSAFE_METHOD_NAMES.has(key)) return undefined;\n const g = scope.getters[key];\n return g ? g() : undefined;\n },\n });\n const unsafe = () => fn(proxy);\n cache.set(cleaned, unsafe);\n return unsafe;\n } catch {\n reportDiagnostic('expression-unsupported', cleaned, 'Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.');\n const failed = () => undefined;\n cache.set(cleaned, failed);\n return failed;\n }\n}\n\n// ── CSP-safe handler parser ──\n\n/**\n * Parse common handler patterns without `new Function()`.\n * Returns null if the expression is too complex for the CSP-safe parser.\n */\nfunction parseHandler(expr: string, scope: Scope): ((e: Event) => void) | null {\n const normalized = expr.trim().replace(/;+$/g, '').trim();\n if (!normalized) return null;\n\n const ifHandler = parseIfHandler(normalized, scope);\n if (ifHandler) return ifHandler;\n\n const stmts = splitTopLevelStatements(normalized);\n if (stmts.length > 1) {\n const handlers = stmts.map(s => parseHandler(s, scope));\n if (handlers.every(h => h !== null)) {\n return (e: Event) => {\n batch(() => {\n for (const h of handlers) h!(e);\n });\n };\n }\n return null;\n }\n\n const single = stmts[0] ?? normalized;\n\n // count++ or count--\n const incrMatch = single.match(RE_POST_INCR);\n if (incrMatch) {\n const name = incrMatch[1]!;\n const op = incrMatch[2]!;\n return () => {\n batch(() => {\n const val = scope.getters[name]?.() as number ?? 0;\n scope.setters[name]?.(op === '++' ? val + 1 : val - 1);\n });\n };\n }\n\n // ++count or --count\n const preIncrMatch = single.match(RE_PRE_INCR);\n if (preIncrMatch) {\n const op = preIncrMatch[1]!;\n const name = preIncrMatch[2]!;\n return () => {\n batch(() => {\n const val = scope.getters[name]?.() as number ?? 0;\n scope.setters[name]?.(op === '++' ? val + 1 : val - 1);\n });\n };\n }\n\n // prop = !prop (toggle)\n const toggleMatch = single.match(RE_TOGGLE);\n if (toggleMatch && toggleMatch[1] === toggleMatch[2]) {\n const name = toggleMatch[1]!;\n return () => {\n batch(() => {\n scope.setters[name]?.(!scope.getters[name]?.());\n });\n };\n }\n\n // prop = expr (simple assignment)\n const assignMatch = single.match(RE_ASSIGN);\n if (assignMatch) {\n const name = assignMatch[1]!;\n const valExpr = parseExpression(assignMatch[2]!.trim(), scope);\n if (valExpr) {\n if (_debug) dbg(`parseHandler: assignment \"${name} = ...\" — setter exists:`, !!scope.setters[name], ', getter exists:', !!scope.getters[name]);\n return () => {\n batch(() => {\n const val = valExpr();\n if (_debug) dbg(`SETTER: ${name} = ${val} (was: ${scope.getters[name]?.()})`);\n scope.setters[name]?.(val);\n });\n };\n }\n }\n\n // prop += value, prop -= value, prop *= value, prop /= value\n const compoundMatch = single.match(RE_COMPOUND);\n if (compoundMatch) {\n const name = compoundMatch[1]!;\n const op = compoundMatch[2]!;\n const valExpr = parseExpression(compoundMatch[3]!.trim(), scope);\n if (valExpr) {\n return () => {\n batch(() => {\n const current = scope.getters[name]?.() as number ?? 0;\n const val = valExpr() as number;\n switch (op) {\n case '+=': scope.setters[name]?.(current + val); break;\n case '-=': scope.setters[name]?.(current - val); break;\n case '*=': scope.setters[name]?.(current * val); break;\n case '/=': scope.setters[name]?.(current / val); break;\n }\n });\n };\n }\n }\n\n // $refetch('id') — imperative data-fetch trigger (CSP-safe)\n const refetchMatch = single.match(RE_REFETCH_CALL);\n if (refetchMatch) {\n const fetchId = refetchMatch[1]!;\n return () => $refetch(fetchId);\n }\n\n return null;\n}\n\nfunction buildHandler(expr: string, scope: Scope): HandlerBuildResult {\n // Strip balanced outer braces (e.g., `{count++}` → `count++`) but NOT\n // unbalanced ones like `if (x) { a = b }` where the `}` is a code-block close.\n let cleaned = expr.trim();\n if (cleaned.startsWith('{')) {\n const seg = readBalancedSegment(cleaned, 0, '{', '}');\n if (seg && seg.end === cleaned.length - 1) {\n cleaned = seg.inner.trim();\n }\n }\n const cache = getScopeCache(scopeHandlerCache, scope);\n const cached = cache.get(cleaned);\n if (cached) return cached;\n\n // Try CSP-safe parsing first\n const cspFn = parseHandler(cleaned, scope);\n if (cspFn) {\n const result: HandlerBuildResult = { handler: cspFn, supported: true };\n cache.set(cleaned, result);\n return result;\n }\n\n // Fallback to Function constructor (for complex expressions)\n // __EVAL_CAPABLE__ gate ensures hardened build eliminates this entire block.\n if (!__EVAL_CAPABLE__ || !_allowUnsafeEval) {\n dbg('buildHandler: blocked unsafe eval fallback for expression:', cleaned);\n reportDiagnostic('handler-unsupported', cleaned, cspExpressionHint(cleaned));\n const result: HandlerBuildResult = {\n handler: () => {},\n supported: false,\n };\n cache.set(cleaned, result);\n return result;\n }\n\n // Apply UNSAFE_METHOD_NAMES blocklist before new Function — prevents\n // prototype-pollution and eval injection via the unsafe eval path.\n const blockedMethod = findBlockedMethod(cleaned);\n if (blockedMethod) {\n const msg = `Blocked unsafe method \"${blockedMethod}\" in handler`;\n reportDiagnostic('handler-unsupported', cleaned, msg);\n throw new Error(`[FormaJS] ${msg}: ${cleaned}`);\n }\n\n try {\n // Accept both `$event` and bare `event` — Claude sometimes generates either.\n const fn = new Function('__scope', '$event', 'event', `with(__scope) { ${cleaned} }`);\n // Cache proxy — scope.getters/setters are mutable objects, so the proxy\n // always reflects current state without needing to be recreated.\n const proxy = new Proxy(Object.create(null) as Record<string, unknown>, {\n has(_, key: string) {\n // Do NOT intercept '$event' or 'event' — let them fall through to\n // function parameters so $event.key, event.stopPropagation(), etc. work.\n if (key === '$event' || key === 'event') return false;\n return key in scope.getters || key in scope.setters;\n },\n get(_, key: string) {\n // Defense-in-depth: block dangerous property access\n if (UNSAFE_METHOD_NAMES.has(key)) return undefined;\n const g = scope.getters[key];\n return g ? g() : undefined;\n },\n set(_, key: string, value: unknown) {\n const s = scope.setters[key];\n if (s) s(value);\n return true;\n },\n });\n const unsafeHandler = (e: Event) => {\n batch(() => fn(proxy, e, e));\n };\n const result: HandlerBuildResult = {\n handler: unsafeHandler,\n supported: true,\n };\n cache.set(cleaned, result);\n return result;\n } catch {\n reportDiagnostic('handler-unsupported', cleaned, 'Expression too complex for CSP-safe mode. Enable unsafe-eval via FormaRuntime.unsafeEval = true, or use the standard (non-hardened) build.');\n const result: HandlerBuildResult = {\n handler: () => {},\n supported: false,\n };\n cache.set(cleaned, result);\n return result;\n }\n}\n\n// ── State initialization ──\n\nconst FORBIDDEN_STATE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction parseState(raw: string): Record<string, unknown> {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(raw);\n } catch {\n if (_debug) {\n dbg('parseState: Invalid JSON in data-forma-state — use valid JSON with quoted keys. Got:', raw.slice(0, 200));\n }\n return {};\n }\n // Strip prototype-pollution keys\n for (const key of FORBIDDEN_STATE_KEYS) {\n if (key in parsed) delete parsed[key];\n }\n return parsed;\n}\n\n// ── DOM scanner ──\n\nfunction initScope(stateEl: Element): Scope {\n const raw = stateEl.getAttribute('data-forma-state') ?? '{}';\n const state = parseState(raw);\n const keys = Object.keys(state);\n if (_debug) {\n dbg('initScope: parsed', keys.length, 'keys:', keys.join(', '));\n if (keys.length === 0) {\n dbg('initScope: WARNING — empty state! Raw attribute:', raw.slice(0, 200));\n }\n }\n const getters: Record<string, Getter> = {};\n const setters: Record<string, Setter> = {};\n\n for (const [key, initial] of Object.entries(state)) {\n const [get, set] = createSignal(initial);\n getters[key] = get;\n setters[key] = set as Setter;\n }\n\n // Inject $refetch as a callable getter so handlers can use $refetch('id')\n getters['$refetch'] = () => $refetch;\n\n return { getters, setters };\n}\n\n// ── Safe $el proxy ──\n// Allowlist of properties exposed on the $el magic. Everything else\n// (ownerDocument, parentNode, innerHTML, …) returns undefined so that\n// attacker-authored expressions cannot escape to window/document.\n\nconst SAFE_EL_PROPS = new Set([\n // Identity & attributes\n 'id', 'className', 'tagName', 'nodeName',\n 'getAttribute', 'setAttribute', 'removeAttribute', 'hasAttribute', 'toggleAttribute',\n 'dataset', 'classList',\n // Content\n 'textContent', 'innerText',\n // Form elements\n 'value', 'checked', 'disabled', 'selected', 'type', 'name', 'placeholder',\n 'readOnly', 'required', 'min', 'max', 'step', 'pattern',\n // Dimensions & position\n 'getBoundingClientRect', 'offsetWidth', 'offsetHeight',\n 'offsetTop', 'offsetLeft', 'clientWidth', 'clientHeight',\n 'scrollWidth', 'scrollHeight', 'scrollTop', 'scrollLeft',\n // Style\n 'style', 'hidden',\n // Focus & interaction\n 'focus', 'blur', 'click', 'scrollIntoView', 'scrollTo',\n // Traversal (safe — returns elements, not window/document)\n 'closest', 'matches', 'querySelector', 'querySelectorAll',\n 'children', 'childElementCount', 'firstElementChild', 'lastElementChild',\n 'nextElementSibling', 'previousElementSibling',\n]);\n\nfunction createSafeElProxy(el: Element): Element {\n return new Proxy(el, {\n get(target, prop) {\n if (typeof prop === 'symbol') return Reflect.get(target, prop);\n if (!SAFE_EL_PROPS.has(prop)) return undefined;\n const val = Reflect.get(target, prop);\n return typeof val === 'function' ? val.bind(target) : val;\n },\n set(target, prop, value) {\n if (typeof prop === 'symbol') return false;\n if (!SAFE_EL_PROPS.has(prop)) return false;\n return Reflect.set(target, prop, value);\n },\n });\n}\n\nfunction bindElement(el: Element, scope: Scope, disposers: (() => void)[]): void {\n // Inject per-element magics: $el and $dispatch\n // Each element gets its own child scope so $el resolves to the correct element.\n const elMagics: Record<string, unknown> = {\n $el: createSafeElProxy(el),\n $dispatch: (name: string, detail?: unknown) => {\n el.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true, // crosses Shadow DOM boundaries (important for <forma-stage>)\n detail,\n }));\n },\n };\n scope = createChildScope(scope, elMagics);\n\n // When the server provides a directive map, we know exactly which directives\n // this element has. Skip getAttribute calls for directives it doesn't have.\n // `known` is null when no map is available (fallback: check everything).\n const known = getDirectives(el);\n\n // data-computed=\"name = expr\" or \"a = expr1; b = expr2\"\n const computedAttr = (!known || known.has('data-computed')) ? el.getAttribute('data-computed') : null;\n if (computedAttr) {\n // Split multi-statement computed: \"a = expr1; b = expr2; c = expr3\"\n // Uses lookahead to split at \"; identifier =\" boundaries without\n // breaking arrow functions (=>) or comparisons (===, ==).\n const parts = computedAttr.split(/;\\s*(?=\\w+\\s*=[^=])/);\n for (const part of parts) {\n const trimmed = part.trim();\n if (!trimmed) continue;\n const match = trimmed.match(RE_COMPUTED);\n if (match) {\n const name = match[1]!;\n const expr = match[2]!;\n // Remove the computed name from getters before building evaluator\n // to prevent self-referential cycle (computed reading itself)\n const prevGetter = scope.getters[name];\n delete scope.getters[name];\n const evaluate = buildEvaluator(`{${expr}}`, scope);\n const getter = createComputed(evaluate);\n scope.getters[name] = getter;\n // Keep the original setter so manual overrides still work\n if (!prevGetter) {\n // If there was no initial state entry, remove the setter too\n delete scope.setters[name];\n }\n }\n }\n }\n\n // data-text=\"{expr}\"\n const textExpr = (!known || known.has('data-text')) ? el.getAttribute('data-text') : null;\n if (textExpr) {\n const evaluate = buildEvaluator(textExpr, scope);\n const dispose = internalEffect(() => {\n setElementTextFast(el, toTextValue(evaluate()));\n });\n disposers.push(dispose);\n }\n\n // data-show=\"{expr}\"\n const showExpr = (!known || known.has('data-show')) ? el.getAttribute('data-show') : null;\n if (showExpr) {\n const evaluate = buildEvaluator(showExpr, scope);\n const transition = parseTransitionSpec(el);\n if (_debug) {\n const tag = el.tagName.toLowerCase();\n const cls = el.className ? `.${String(el.className).split(' ')[0]}` : '';\n dbg(`bindElement: data-show=\"${showExpr}\" on <${tag}${cls}>`);\n }\n let initialized = false;\n const dispose = internalEffect(() => {\n const visible = !!evaluate();\n if (_debug) dbg(`data-show effect: \"${showExpr}\" → ${visible}`);\n applyShowVisibility(el as HTMLElement, visible, transition, !initialized);\n initialized = true;\n });\n disposers.push(dispose);\n if (transition) {\n disposers.push(() => clearTransitionState(el as HTMLElement));\n }\n }\n\n // data-if=\"{expr}\" — conditional DOM insertion/removal with optional transitions\n const ifExpr = (!known || known.has('data-if')) ? el.getAttribute('data-if') : null;\n if (ifExpr) {\n const evaluate = buildEvaluator(ifExpr, scope);\n const transition = parseTransitionSpec(el);\n const placeholder = document.createComment('forma-if');\n const parent = el.parentNode;\n let inserted = true;\n let initialized = false;\n\n const dispose = internalEffect(() => {\n const show = !!evaluate();\n\n if (show && !inserted) {\n // Cancel any in-flight leave\n clearTransitionState(el as HTMLElement);\n el.removeAttribute('data-forma-leaving');\n if (initialized && transition) {\n transitionInsert(el as HTMLElement, parent!, placeholder, transition);\n } else {\n parent?.insertBefore(el, placeholder);\n }\n inserted = true;\n } else if (!show && inserted) {\n if (initialized && transition) {\n transitionRemove(el as HTMLElement, transition, () => {\n if (el.parentNode) {\n parent?.insertBefore(placeholder, el);\n el.remove();\n }\n });\n } else {\n parent?.insertBefore(placeholder, el);\n el.remove();\n }\n inserted = false;\n }\n initialized = true;\n });\n\n disposers.push(dispose);\n if (transition) {\n disposers.push(() => clearTransitionState(el as HTMLElement));\n }\n }\n\n // data-model=\"{prop}\"\n const modelExpr = (!known || known.has('data-model')) ? el.getAttribute('data-model') : null;\n if (modelExpr) {\n const prop = modelExpr.replace(RE_STRIP_BRACES, '').trim();\n let getter = scope.getters[prop];\n let setter = scope.setters[prop];\n if ((!getter || !setter) && prop.includes('.')) {\n // Member path (e.g. {item.name} inside a data-list row): evaluate to read,\n // and set the last key on the resolved parent object to write. Reactive\n // when the parent is a store proxy; a plain object still round-trips the\n // input value.\n getter = buildEvaluator(prop, scope);\n const lastDot = prop.lastIndexOf('.');\n const basePath = prop.slice(0, lastDot);\n const key = prop.slice(lastDot + 1);\n const baseGet = buildEvaluator(basePath, scope);\n setter = (v: unknown) => {\n const base = baseGet();\n if (base != null && typeof base === 'object') (base as Record<string, unknown>)[key] = v;\n };\n }\n if (getter && setter) {\n const input = el as HTMLInputElement;\n const tag = input.tagName;\n const dispose = internalEffect(() => {\n const val = getter();\n const type = input.type;\n if (type === 'checkbox') {\n input.checked = !!val;\n // Optional indeterminate companion attribute (opt-in, non-breaking).\n const indetExpr = el.getAttribute('data-model-indeterminate');\n if (indetExpr) {\n const indetGetter = scope.getters[indetExpr.replace(RE_STRIP_BRACES, '').trim()];\n if (indetGetter) input.indeterminate = !!indetGetter();\n }\n } else if (type === 'radio') {\n input.checked = String(val) === input.value;\n } else if (tag === 'SELECT' && (input as unknown as HTMLSelectElement).multiple) {\n const sel = input as unknown as HTMLSelectElement;\n const arr = Array.isArray(val) ? val.map(String) : [];\n for (const opt of Array.from(sel.options)) opt.selected = arr.includes(opt.value);\n } else {\n input.value = String(val ?? '');\n }\n });\n disposers.push(dispose);\n const event = (input.type === 'checkbox' || input.type === 'radio' || tag === 'SELECT') ? 'change' : 'input';\n const onModelInput = () => {\n const type = input.type;\n if (type === 'checkbox') {\n setter(input.checked);\n } else if (type === 'radio') {\n if (input.checked) setter(input.value);\n } else if (tag === 'SELECT' && (input as unknown as HTMLSelectElement).multiple) {\n const sel = input as unknown as HTMLSelectElement;\n setter(Array.from(sel.selectedOptions).map((o) => o.value));\n } else if (type === 'number' || type === 'range') {\n const raw = input.value;\n if (raw === '') {\n setter(null); // empty numeric clears rather than writing NaN\n } else {\n const n = Number(raw);\n if (!Number.isNaN(n)) setter(n); // ignore partial input like '-' or '1.'\n }\n } else {\n setter(input.value);\n }\n };\n input.addEventListener(event, onModelInput);\n disposers.push(() => {\n input.removeEventListener(event, onModelInput);\n });\n }\n }\n\n // Single-pass over attributes for data-on:*, data-class:*, data-bind:*\n // When directive map is available, skip the loop entirely if none of these are present.\n const hasColonDirectives = !known || hasAnyPrefix(known, 'data-on:', 'data-class:', 'data-bind:');\n const attrs = el.attributes;\n if (hasColonDirectives) for (let i = 0; i < attrs.length; i++) {\n const attr = attrs[i]!;\n const name = attr.name;\n\n if (name.startsWith('data-on:')) {\n const event = name.slice(8); // 'data-on:'.length === 8\n const built = buildHandler(attr.value, scope);\n const handler = built.handler;\n if (_debug) {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : '';\n const cls = el.className ? `.${String(el.className).split(' ')[0]}` : '';\n dbg(`bindElement: data-on:${event}=\"${attr.value}\" on <${tag}${id}${cls}>`);\n }\n if (!built.supported) {\n el.setAttribute('data-forma-handler-error', 'unsupported');\n } else if (el.hasAttribute('data-forma-handler-error')) {\n el.removeAttribute('data-forma-handler-error');\n }\n if (_debug) {\n const attrVal = attr.value;\n const tracedHandler = (e: Event) => {\n dbg(`HANDLER FIRED: data-on:${event}=\"${attrVal}\"`, 'isTrusted:', e.isTrusted);\n handler(e);\n };\n el.addEventListener(event, tracedHandler);\n disposers.push(() => { el.removeEventListener(event, tracedHandler); });\n } else {\n el.addEventListener(event, handler);\n disposers.push(() => { el.removeEventListener(event, handler); });\n }\n } else if (name.startsWith('data-class:')) {\n const cls = name.slice(11); // 'data-class:'.length === 11\n const evaluate = buildEvaluator(attr.value, scope);\n const dispose = internalEffect(() => {\n el.classList.toggle(cls, !!evaluate());\n });\n disposers.push(dispose);\n } else if (name.startsWith('data-bind:')) {\n const attrName = name.slice(10); // 'data-bind:'.length === 10\n const evaluate = buildEvaluator(attr.value, scope);\n const dispose = internalEffect(() => {\n const val = evaluate();\n if (val == null || val === false) {\n el.removeAttribute(attrName);\n } else {\n const str = String(val);\n // Drop event-handler and dangerous-URL bindings — a bound value from\n // state/data-fetch must not be able to inject javascript: URLs or\n // inline handlers. Applies to standard and hardened builds alike.\n if (isUnsafeAttrBinding(attrName, str)) {\n el.removeAttribute(attrName);\n } else {\n el.setAttribute(attrName, str);\n }\n }\n });\n disposers.push(dispose);\n }\n }\n\n // data-persist=\"{prop}\"\n const persistExpr = (!known || known.has('data-persist')) ? el.getAttribute('data-persist') : null;\n if (persistExpr) {\n const prop = persistExpr.replace(RE_STRIP_BRACES, '').trim();\n const getter = scope.getters[prop];\n const setter = scope.setters[prop];\n if (getter && setter) {\n const key = 'forma:' + prop;\n try {\n const saved = localStorage.getItem(key);\n if (saved !== null) setter(JSON.parse(saved));\n } catch { /* ignore parse errors */ }\n const dispose = internalEffect(() => {\n try { localStorage.setItem(key, JSON.stringify(getter())); } catch { /* quota */ }\n });\n disposers.push(dispose);\n }\n }\n\n // data-list=\"{expr}\" — keyed reconciliation with LIS\n const listExpr = (!known || known.has('data-list')) ? el.getAttribute('data-list') : null;\n if (listExpr) {\n const evaluate = buildEvaluator(listExpr, scope);\n const templateEl = el.children[0] as Element | undefined;\n if (templateEl) {\n const template = templateEl.cloneNode(true) as Element;\n // Remove original template from DOM\n el.removeChild(templateEl);\n\n // Detect key attribute: data-key=\"{item.id}\" -> extracts \"id\"\n const keyAttr = template.getAttribute('data-key');\n const keyProp = keyAttr\n ? keyAttr.replace(RE_STRIP_ITEM_BRACES, '').trim()\n : null;\n\n // Parse transition spec from the list container element\n const listTransition = parseTransitionSpec(el);\n\n let oldItems: unknown[] = [];\n let oldNodes: Node[] = [];\n\n // For index-based keying (no data-key), we wrap items in objects\n // that carry their index so the keyFn can extract it without a\n // second argument. For property-based keying, items pass through raw.\n interface IndexWrapped { __idx: number; __item: unknown }\n\n /** Dispose all bindings stored on a clone element */\n function disposeCloneBindings(node: Node): void {\n const el = node as any;\n if (Array.isArray(el.__formaDisposers)) {\n for (const d of el.__formaDisposers) {\n try { d(); } catch { /* ensure all disposers run */ }\n }\n delete el.__formaDisposers;\n }\n }\n\n /** Clone template, bind directives via child scope */\n function createBoundClone(item: unknown, index: number): Element {\n const clone = cloneWithTemplateData(template, item);\n const childScope = createChildScope(scope, { item, index });\n const itemDisposers: (() => void)[] = [];\n bindElement(clone, childScope, itemDisposers);\n for (const desc of Array.from(clone.querySelectorAll('*'))) {\n bindElement(desc, childScope, itemDisposers);\n }\n (clone as any).__formaDisposers = itemDisposers;\n return clone;\n }\n\n /** Dispose old bindings and rebind with fresh data */\n function updateBoundClone(node: Node, item: unknown, index: number): void {\n disposeCloneBindings(node);\n updateTemplateData(node as Element, item);\n const childScope = createChildScope(scope, { item, index });\n const itemDisposers: (() => void)[] = [];\n bindElement(node as Element, childScope, itemDisposers);\n for (const desc of Array.from((node as Element).querySelectorAll('*'))) {\n bindElement(desc, childScope, itemDisposers);\n }\n (node as any).__formaDisposers = itemDisposers;\n }\n\n // Build transition hooks for reconcileList (only when transition attrs present)\n const listHooks: ListTransitionHooks | undefined = listTransition ? {\n onInsert: (node: Node) => {\n const htmlEl = node as HTMLElement;\n if (!htmlEl.setAttribute) return; // text node guard\n const state = getTransitionState(htmlEl);\n state.token += 1;\n const token = state.token;\n if (state.cancel) state.cancel();\n state.cancel = runTransitionPhase(\n htmlEl,\n {\n base: listTransition.enter,\n from: listTransition.enterFrom,\n to: listTransition.enterTo,\n durationMs: listTransition.enterDurationMs,\n },\n () => {\n const current = getTransitionState(htmlEl);\n if (current.token === token) current.cancel = null;\n },\n );\n },\n onBeforeRemove: (node: Node, done: () => void) => {\n const htmlEl = node as HTMLElement;\n if (!htmlEl.setAttribute) { done(); return; } // text node guard\n disposeCloneBindings(node);\n transitionRemove(htmlEl, listTransition, () => {\n done();\n });\n },\n } : undefined;\n\n const dispose = internalEffect(() => {\n const rawItems = evaluate();\n if (!Array.isArray(rawItems)) {\n // Remove all — dispose bindings first\n for (const n of oldNodes) {\n disposeCloneBindings(n);\n el.removeChild(n);\n }\n oldItems = [];\n oldNodes = [];\n return;\n }\n\n // Cancel any in-flight leave animations before reconciliation\n if (listTransition) {\n const leavingNodes = el.querySelectorAll('[data-forma-leaving]');\n for (const ln of Array.from(leavingNodes)) {\n clearTransitionState(ln as HTMLElement);\n ln.removeAttribute('data-forma-leaving');\n if (ln.parentNode) ln.parentNode.removeChild(ln);\n }\n }\n\n // Snapshot old nodes before reconciliation to detect removals\n const prevNodes = new Set(oldNodes);\n\n // Wrap items so each carries its TRUE loop index. This replaces\n // rawItems.indexOf(item) (which returned the first match for duplicate /\n // primitive items, giving wrong/duplicated {index}, and was O(n^2)).\n const wrapped: IndexWrapped[] = rawItems.map((item, i) => ({ __idx: i, __item: item }));\n const oldWrapped = oldItems as IndexWrapped[];\n const keyFn = keyProp\n ? (w: IndexWrapped) => String((w.__item as Record<string, unknown>)?.[keyProp] ?? '')\n : (w: IndexWrapped) => w.__idx;\n\n const result = reconcileList<IndexWrapped>(\n el,\n oldWrapped,\n wrapped,\n oldNodes,\n keyFn,\n (w: IndexWrapped) => createBoundClone(w.__item, w.__idx),\n (node: Node, w: IndexWrapped) => updateBoundClone(node, w.__item, w.__idx),\n undefined, // beforeNode\n listHooks,\n );\n // Dispose bindings on nodes that were removed by reconcileList\n const nextNodes = new Set(result.nodes);\n for (const n of prevNodes) {\n if (!nextNodes.has(n)) {\n // Skip nodes mid-leave — onBeforeRemove already disposed them\n if ((n as Element).hasAttribute?.('data-forma-leaving')) continue;\n disposeCloneBindings(n);\n }\n }\n oldItems = result.items;\n oldNodes = result.nodes;\n });\n disposers.push(dispose);\n }\n }\n\n // data-fetch=\"[METHOD] url → prop [|loading:prop] [|error:prop] [|poll:ms]\"\n const fetchExpr = (!known || known.has('data-fetch')) ? el.getAttribute('data-fetch') : null;\n if (fetchExpr) {\n const arrowMatch = fetchExpr.match(RE_FETCH);\n if (arrowMatch) {\n const urlPart = arrowMatch[1]!.trim();\n const target = arrowMatch[2]!.trim();\n const modifiers = arrowMatch[3]?.trim() ?? '';\n\n let method = 'GET';\n let url = urlPart;\n const methodMatch = urlPart.match(RE_FETCH_METHOD);\n if (methodMatch) {\n method = methodMatch[1]!.toUpperCase();\n url = methodMatch[2]!.trim();\n }\n\n let loadingTarget: string | undefined;\n let errorTarget: string | undefined;\n let interval: number | undefined;\n for (const mod of modifiers.split('|').filter(Boolean)) {\n const [k, v] = mod.split(':').map(s => s.trim());\n if (k === 'loading') loadingTarget = v;\n else if (k === 'error') errorTarget = v;\n else if (k === 'poll') interval = parseInt(v ?? '0', 10);\n }\n\n // Create signals for target, loading, and error\n const [getTarget, setTarget] = createSignal<unknown>(null);\n scope.getters[target] = getTarget;\n scope.setters[target] = setTarget as Setter;\n if (loadingTarget) {\n const [gl, sl] = createSignal(false);\n scope.getters[loadingTarget] = gl;\n scope.setters[loadingTarget] = sl as Setter;\n }\n if (errorTarget) {\n const [ge, se] = createSignal<unknown>(null);\n scope.getters[errorTarget] = ge;\n scope.setters[errorTarget] = se as Setter;\n }\n\n const doFetch = () => {\n if (loadingTarget) scope.setters[loadingTarget]!(true);\n fetch(url, { method })\n .then(r => r.json())\n .then(data => {\n setTarget(data);\n if (loadingTarget) scope.setters[loadingTarget]!(false);\n })\n .catch(err => {\n if (errorTarget) scope.setters[errorTarget]!(err.message);\n if (loadingTarget) scope.setters[loadingTarget]!(false);\n });\n };\n\n // Register in $refetch registry if data-fetch-id is present\n const fetchId = el.getAttribute('data-fetch-id');\n if (fetchId) {\n _refetchRegistry.set(fetchId, doFetch);\n disposers.push(() => _refetchRegistry.delete(fetchId));\n }\n\n doFetch();\n if (interval && interval > 0) {\n const id = setInterval(doFetch, interval);\n disposers.push(() => clearInterval(id));\n }\n }\n }\n}\n\n// ── Scope mounting / unmounting (single data-forma-state element) ──\n\n/**\n * Mount a single `data-forma-state` element — creates signals, binds\n * all descendants, stores disposers on the element for cleanup.\n * Idempotent: skips elements that are already mounted.\n */\n/** CSS selector matching elements with at least one Forma directive.\n * Avoids scanning every descendant — only visits directive-bearing elements. */\nconst DIRECTIVE_SELECTOR = [\n '[data-text]', '[data-show]', '[data-if]', '[data-model]',\n '[data-computed]', '[data-persist]', '[data-list]', '[data-fetch]',\n '[data-bind\\\\:*]', '[data-class\\\\:*]', '[data-on\\\\:*]',\n // Catch-all for colon-prefixed data attrs that the escaped selectors miss in some engines\n '[data-transition]',\n].join(',');\n\n/** Fast check: does this element have any Forma directive attribute? */\nfunction hasDirective(el: Element): boolean {\n const attrs = el.attributes;\n for (let i = 0; i < attrs.length; i++) {\n const name = attrs[i]!.name;\n if (name.startsWith('data-text') || name.startsWith('data-show') ||\n name.startsWith('data-if') || name.startsWith('data-model') ||\n name.startsWith('data-computed') || name.startsWith('data-persist') ||\n name.startsWith('data-list') || name.startsWith('data-fetch') ||\n name.startsWith('data-on:') || name.startsWith('data-class:') ||\n name.startsWith('data-bind:') || name.startsWith('data-transition')) {\n return true;\n }\n }\n return false;\n}\n\n// ── Pre-compiled Directive Map ──\n//\n// When the server sends a directive_map sidecar (data-forma-id → directive names),\n// the runtime uses it in two ways:\n//\n// 1. mountScope(): targeted CSS selector queries only directive-bearing elements\n// instead of querySelectorAll('*') + attribute scan on every descendant.\n//\n// 2. bindElement(): skips getAttribute calls for directives the element doesn't\n// have, avoiding unnecessary work for elements with only 1-2 directives.\n\n/** Full map: data-forma-id → Set of directive attribute names. */\nlet _directiveMap: Map<string, Set<string>> | null = null;\n\n/**\n * Load a pre-compiled directive map from the server.\n * Keys are data-forma-id values, values are arrays of directive attribute names.\n */\nfunction setDirectiveMap(map: Record<string, string[]> | null): void {\n if (!map || Object.keys(map).length === 0) {\n _directiveMap = null;\n return;\n }\n _directiveMap = new Map();\n for (const id in map) {\n _directiveMap.set(id, new Set(map[id]!));\n }\n}\n\n/**\n * Build a CSS selector that targets only elements with known directives.\n * Returns null when the map has too many entries (selector would be huge)\n * or when no map is available.\n */\nfunction buildDirectiveSelector(): string | null {\n if (!_directiveMap || _directiveMap.size === 0) return null;\n // Cap at 200 IDs to avoid pathologically long selectors.\n // Above that, querySelectorAll('*') + Set check is likely faster.\n if (_directiveMap.size > 200) return null;\n const parts: string[] = [];\n for (const id of _directiveMap.keys()) {\n parts.push(`[data-forma-id=\"${id}\"]`);\n }\n return parts.join(',');\n}\n\n/** Get the directive set for an element, or null if unknown. */\nfunction getDirectives(el: Element): Set<string> | null {\n if (!_directiveMap) return null;\n const id = el.getAttribute('data-forma-id');\n if (!id) return null;\n return _directiveMap.get(id) ?? null;\n}\n\n/** Check if any entry in a Set starts with one of the given prefixes. */\nfunction hasAnyPrefix(set: Set<string>, ...prefixes: string[]): boolean {\n for (const entry of set) {\n for (const prefix of prefixes) {\n if (entry.startsWith(prefix)) return true;\n }\n }\n return false;\n}\n\nfunction mountScope(root: Element): void {\n // Idempotency guard — never double-bind\n if ((root as any).__formaDisposers) {\n if (_debug) dbg('mountScope: SKIPPED (already mounted)');\n return;\n }\n\n const scope = initScope(root);\n const disposers: (() => void)[] = [];\n\n // Build $refs — a lazy proxy that resolves data-ref=\"name\" to elements.\n // Scanned once at mount time; the proxy resolves lazily on access.\n const refsMap = new Map<string, Element>();\n const refEls = root.querySelectorAll('[data-ref]');\n for (let i = 0; i < refEls.length; i++) {\n const el = refEls[i]!;\n const name = el.getAttribute('data-ref');\n if (name) refsMap.set(name, el);\n }\n // Also check the root itself\n const rootRefName = root.getAttribute('data-ref');\n if (rootRefName) refsMap.set(rootRefName, root);\n\n scope.getters['$refs'] = () => new Proxy({} as Record<string, Element>, {\n get(_, name: string) {\n return refsMap.get(name) ?? undefined;\n },\n has(_, name: string) {\n return refsMap.has(name);\n },\n });\n\n // Bind the root itself\n bindElement(root, scope, disposers);\n\n // Bind only directive-bearing descendants (skip inert elements).\n // When the server provides a directive map, we build a targeted CSS selector\n // that queries only elements with known directives — no querySelectorAll('*').\n let boundCount = 0;\n const selector = buildDirectiveSelector();\n if (selector) {\n // Fast path: query only elements the server told us have directives\n const targets = root.querySelectorAll(selector);\n for (let i = 0; i < targets.length; i++) {\n bindElement(targets[i]!, scope, disposers);\n boundCount++;\n }\n } else {\n // Fallback: scan all descendants and check attributes\n const descendants = root.querySelectorAll('*');\n for (let i = 0; i < descendants.length; i++) {\n const el = descendants[i]!;\n if (hasDirective(el)) {\n bindElement(el, scope, disposers);\n boundCount++;\n }\n }\n }\n\n // Store disposers on the root element for cleanup\n (root as any).__formaDisposers = disposers;\n // Expose scope for devtools (State Inspector panel)\n (root as any).__formaScope = scope;\n (root as any).__formaInitialState = root.getAttribute('data-forma-state') ?? '{}';\n if (_debug) dbg('mountScope: DONE —', boundCount, 'elements bound,', disposers.length, 'disposers', selector ? '(targeted)' : '(full scan)');\n}\n\n/**\n * Unmount a single `data-forma-state` element — disposes all effects,\n * intervals, and event listeners. Safe to call on already-unmounted elements.\n */\nfunction unmountScope(root: Element): void {\n const disposers = (root as any).__formaDisposers as (() => void)[] | undefined;\n if (disposers) {\n for (const d of disposers) {\n try { d(); } catch { /* ensure all disposers run */ }\n }\n delete (root as any).__formaDisposers;\n delete (root as any).__formaScope;\n delete (root as any).__formaInitialState;\n }\n}\n\n// ── MutationObserver — auto-discovery of new data-forma-state elements ──\n//\n// Cost: O(addedNodes) per mutation batch. Never re-scans the whole document.\n// The observer only fires for childList mutations (nodes added/removed) and\n// attribute mutations on the `data-forma-state` attribute specifically.\n\nlet _observer: MutationObserver | null = null;\nconst ELEMENT_NODE = 1;\nconst MUTATION_CHUNK_SIZE = 40;\nlet _pendingMutations: MutationRecord[] = [];\nlet _drainingMutations = false;\n\nfunction processMutation(mutation: MutationRecord): void {\n // ── Removed nodes: clean up disposers to prevent memory leaks ──\n for (let i = 0; i < mutation.removedNodes.length; i++) {\n const node = mutation.removedNodes[i]!;\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element;\n if (el.hasAttribute('data-forma-state')) {\n if (_debug) dbg('MutationObserver: REMOVED scope');\n unmountScope(el);\n }\n const removed = el.querySelectorAll('[data-forma-state]');\n for (let j = 0; j < removed.length; j++) {\n unmountScope(removed[j]!);\n }\n }\n\n // ── Added nodes: auto-mount new scopes ──\n for (let i = 0; i < mutation.addedNodes.length; i++) {\n const node = mutation.addedNodes[i]!;\n if (node.nodeType !== ELEMENT_NODE) continue;\n const el = node as Element;\n if (el.closest('[data-forma-leaving]')) continue;\n if (el.hasAttribute('data-forma-state')) {\n if (_debug) dbg('MutationObserver: ADDED scope via mutation');\n mountScope(el);\n }\n const added = el.querySelectorAll('[data-forma-state]');\n if (_debug && added.length > 0) {\n dbg('MutationObserver: found', added.length, 'nested scope(s) in added subtree');\n }\n for (let j = 0; j < added.length; j++) {\n const desc = added[j]!;\n if (desc.closest('[data-forma-leaving]')) continue;\n mountScope(desc);\n }\n }\n\n // ── Attribute change: data-forma-state added/removed/changed ──\n if (mutation.type === 'attributes' && mutation.attributeName === 'data-forma-state') {\n const target = mutation.target as Element;\n // Always unmount first (cleans up old bindings)\n unmountScope(target);\n // Re-mount if the attribute still exists (value may have changed)\n if (target.hasAttribute('data-forma-state')) {\n mountScope(target);\n }\n }\n}\n\nasync function drainMutationQueue(): Promise<void> {\n try {\n while (_pendingMutations.length > 0) {\n const batch = _pendingMutations.splice(0, MUTATION_CHUNK_SIZE);\n for (let i = 0; i < batch.length; i++) {\n processMutation(batch[i]!);\n }\n if (_pendingMutations.length > 0) {\n await yieldToMain();\n }\n }\n } finally {\n _drainingMutations = false;\n // Handle races where new mutations were queued after the while-check.\n if (_pendingMutations.length > 0 && !_drainingMutations) {\n _drainingMutations = true;\n void drainMutationQueue();\n }\n }\n}\n\nfunction handleMutations(mutations: MutationRecord[]): void {\n if (_debug) dbg('MutationObserver: queued', mutations.length, 'mutation(s)');\n _pendingMutations.push(...mutations);\n if (_drainingMutations) return;\n _drainingMutations = true;\n void drainMutationQueue();\n}\n\nfunction startObserver(): void {\n if (_observer) return;\n _observer = new MutationObserver(handleMutations);\n const target = document.body || document.documentElement;\n if (target) {\n _observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-forma-state'],\n });\n }\n}\n\nfunction stopObserver(): void {\n if (_observer) {\n _observer.disconnect();\n _observer = null;\n }\n}\n\n// ── Main init ──\n\nfunction initRuntime(): void {\n if (_autoContainment) {\n applyContainmentHints(document, { skipIfAlreadySet: true });\n }\n const stateRoots = document.querySelectorAll('[data-forma-state]');\n if (_debug) dbg('initRuntime: found', stateRoots.length, 'scope(s)');\n for (const root of Array.from(stateRoots)) {\n mountScope(root);\n }\n // Start auto-discovery after initial scan\n startObserver();\n if (_debug) dbg('initRuntime: MutationObserver started');\n}\n\n/** Dispose all FormaJS scopes — clears effects, intervals, event listeners, and stops the observer. */\nfunction destroyRuntime(): void {\n stopObserver();\n const stateRoots = document.querySelectorAll('[data-forma-state]');\n for (const root of Array.from(stateRoots)) {\n unmountScope(root);\n }\n}\n\n/**\n * Mount a specific element or subtree — scans for `data-forma-state`\n * elements and initializes their reactive bindings.\n *\n * Use this for manual control when injecting HTML dynamically.\n * With the MutationObserver active, this is usually not needed.\n *\n * @param el - The root element to scan (checks itself and all descendants).\n */\nfunction mount(el: Element): void {\n if (el.hasAttribute('data-forma-state')) {\n mountScope(el);\n }\n const descendants = el.querySelectorAll('[data-forma-state]');\n for (const desc of Array.from(descendants)) {\n mountScope(desc);\n }\n}\n\n/**\n * Unmount a specific element or subtree — disposes all reactive bindings\n * for `data-forma-state` elements within.\n *\n * @param el - The root element to clean up (checks itself and all descendants).\n */\nfunction unmount(el: Element): void {\n if (el.hasAttribute('data-forma-state')) {\n unmountScope(el);\n }\n const descendants = el.querySelectorAll('[data-forma-state]');\n for (const desc of Array.from(descendants)) {\n unmountScope(desc);\n }\n}\n\n// Auto-init in browser contexts on DOMContentLoaded (or immediately if already loaded).\nif (typeof document !== 'undefined') {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initRuntime);\n } else {\n initRuntime();\n }\n}\n\n/** Enable/disable debug logging. Also toggleable via window.__FORMA_DEBUG = true */\nfunction setDebug(on: boolean): void { _debug = on; }\n/** Set unsafe-eval mode. `locked-off` is hardened and non-toggleable via setUnsafeEval. */\nfunction setUnsafeEvalMode(mode: UnsafeEvalMode): void {\n if (_unsafeEvalMode === mode) return;\n _unsafeEvalMode = mode;\n if (mode === 'locked-off') _allowUnsafeEval = false;\n if (mode === 'locked-on') _allowUnsafeEval = true;\n if (mode === 'mutable') _allowUnsafeEval = true;\n // Rebuild caches whenever policy changes.\n scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n}\n/** Enable/disable unsafe `new Function` fallback for complex expressions. */\nfunction setUnsafeEval(on: boolean): void {\n if (_unsafeEvalMode !== 'mutable') {\n dbg(\n `setUnsafeEval ignored (mode=${_unsafeEvalMode}); unsafe fallback is locked`,\n );\n return;\n }\n if (_allowUnsafeEval === on) return;\n _allowUnsafeEval = on;\n // Rebuild handlers/evaluators after mode change so cached blocked results\n // don't persist when toggling trusted mode at runtime.\n scopeExpressionCache = new WeakMap<Scope, Map<string, () => unknown>>();\n scopeHandlerCache = new WeakMap<Scope, Map<string, HandlerBuildResult>>();\n}\n/** Get current unsafe-eval policy mode. */\nfunction getUnsafeEvalMode(): UnsafeEvalMode { return _unsafeEvalMode; }\n/** Enable/disable runtime diagnostics for unsupported expressions/handlers. */\nfunction setDiagnostics(on: boolean): void { _diagnosticsEnabled = on; }\n\n/** Runtime diagnostics captured while parsing/binding templates. */\nfunction getDiagnostics(): RuntimeDiagnostic[] {\n return Array.from(diagnostics.values()).map(d => ({ ...d }));\n}\n\n/** Clear runtime diagnostics collected so far. */\nfunction clearDiagnostics(): void {\n diagnostics.clear();\n}\n\n// ── DevTools API — State Inspector ──\n\ninterface ScopeDescriptor {\n element: Element;\n id: string;\n values: Record<string, { value: unknown; type: string }>;\n initialJSON: string;\n}\n\n/**\n * DevTools: enumerate all active scopes and their current signal values.\n * Only called when the State Inspector panel is open — zero overhead otherwise.\n */\nfunction getScopes(): ScopeDescriptor[] {\n const roots = document.querySelectorAll('[data-forma-state]');\n const result: ScopeDescriptor[] = [];\n\n for (const root of Array.from(roots)) {\n if (root.closest('[data-forma-leaving]')) continue;\n const scope = (root as any).__formaScope as Scope | undefined;\n const initialJSON = (root as any).__formaInitialState as string | undefined;\n if (!scope) continue;\n\n const values: Record<string, { value: unknown; type: string }> = {};\n for (const key of Object.keys(scope.getters)) {\n const val = scope.getters[key]!();\n values[key] = { value: val, type: typeof val };\n }\n\n result.push({\n element: root,\n id: root.getAttribute('data-forma-id') || root.id || root.tagName.toLowerCase(),\n values,\n initialJSON: initialJSON ?? '{}',\n });\n }\n return result;\n}\n\n/**\n * DevTools: set a state value on a specific scope element.\n * Triggers normal reactive effects (data-show, data-text, etc.).\n */\nfunction setScopeValue(element: Element, key: string, value: unknown): void {\n const scope = (element as any).__formaScope as Scope | undefined;\n if (!scope?.setters[key]) return;\n batch(() => { scope.setters[key]!(value); });\n}\n\n/**\n * DevTools: reset all values on a scope to their initial JSON state.\n */\nfunction resetScope(element: Element): void {\n const scope = (element as any).__formaScope as Scope | undefined;\n const initialJSON = (element as any).__formaInitialState as string | undefined;\n if (!scope || !initialJSON) return;\n\n const initial = parseState(initialJSON);\n batch(() => {\n for (const [key, val] of Object.entries(initial)) {\n scope.setters[key]?.(val);\n }\n });\n}\n\n// ── Reconciler ──\n\nlet _reconciler: ((container: Element, html: string) => void) | null = null;\n\nfunction getReconciler() {\n if (!_reconciler) {\n _reconciler = createReconciler({\n mountScope,\n unmountScope,\n disconnectObserver() {\n if (_observer) {\n _observer.disconnect();\n }\n },\n reconnectObserver() {\n if (_observer) {\n const target = document.body || document.documentElement;\n if (target) {\n _observer.observe(target, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-forma-state'],\n });\n }\n }\n },\n batch,\n });\n }\n return _reconciler;\n}\n\n/** Reconcile a container's DOM against a new HTML string. */\nfunction reconcile(container: Element, html: string): void {\n getReconciler()(container, html);\n}\n\nexport {\n initRuntime,\n destroyRuntime,\n mount,\n unmount,\n reconcile,\n setDebug,\n setUnsafeEvalMode,\n getUnsafeEvalMode,\n setUnsafeEval,\n yieldToMain,\n applyContainmentHints,\n setDirectiveMap,\n setDiagnostics,\n getDiagnostics,\n clearDiagnostics,\n getScopes,\n setScopeValue,\n resetScope,\n};\n"]}
|