what-core 0.7.0 → 0.8.1
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/index.js +9 -0
- package/dist/index.js.map +2 -2
- package/dist/index.min.js +6 -6
- package/dist/index.min.js.map +3 -3
- package/dist/render.js +7 -0
- package/dist/render.js.map +2 -2
- package/dist/render.min.js +1 -1
- package/dist/render.min.js.map +3 -3
- package/dist/testing.js.map +2 -2
- package/dist/testing.min.js.map +2 -2
- package/package.json +1 -1
- package/src/dom.js +0 -1
- package/src/guardrails.js +2 -0
- package/src/index.js +3 -0
- package/src/render.js +13 -1
package/dist/render.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/reactive.js", "../src/components.js", "../src/helpers.js", "../src/dom.js", "../src/render.js"],
|
|
4
|
-
"sourcesContent": ["// What Framework - Reactive Primitives\n// Signals + Effects: fine-grained reactivity without virtual DOM overhead\n//\n// Upgrades:\n// - Topological ordering: computed/effects sorted by _level to prevent diamond glitches\n// - Iterative computed evaluation: no recursion, handles 10K+ depth chains\n// - Ownership tree: createRoot children auto-dispose when parent disposes\n// - Performance: cached levels, lazy sort, fast-path notify, minimal allocation\n\n// Dev-mode flag \u2014 build tools can dead-code-eliminate when false\nexport const __DEV__ = typeof process !== 'undefined'\n ? process.env?.NODE_ENV !== 'production'\n : true;\n\n// DevTools hooks \u2014 set by what-devtools when installed.\n// These are no-ops in production (dead-code eliminated with __DEV__).\nexport let __devtools = null;\n\n/** @internal Install devtools hooks. Called by what-devtools. */\nexport function __setDevToolsHooks(hooks) {\n if (__DEV__) __devtools = hooks;\n}\n\nlet currentEffect = null;\nlet currentRoot = null;\nlet currentOwner = null; // Ownership tree: tracks current owner context\nlet insideComputed = false; // Track whether we're inside a computed() callback (dev-mode warning)\nlet batchDepth = 0;\nlet pendingEffects = [];\nlet pendingNeedSort = false; // Track whether pendingEffects actually needs sorting\n\n// Instead of a WeakMap from subscriber Set \u2192 owning computed's inner effect,\n// we store the owner directly on the Set as ._owner (20x faster than WeakMap.get).\n// Signal subscriber Sets have ._owner = undefined (signals are level 0).\n\n// --- Iterative Computed Evaluation State ---\n// Uses a throw/catch trampoline to convert recursive computed evaluation\n// to iterative. When a computed fn() reads another dirty computed, instead\n// of recursing, we throw a sentinel that gets caught by the outer loop.\nconst NEEDS_UPSTREAM = Symbol('needs_upstream');\nlet iterativeEvalStack = null; // array when inside evaluation loop, null otherwise\n\n// --- Signal ---\n// A reactive value. Reading inside an effect auto-tracks the dependency.\n// Writing triggers only the effects that depend on this signal.\n//\n// Performance: signal read is the hottest path in any signal-based framework.\n// Key optimizations:\n// - No rest args (...args) \u2014 uses arguments.length for zero-alloc read path\n// - Subscriber tracking uses lastTracked to skip redundant Set.add/Array.push\n// when the same signal is read multiple times in one effect (common pattern)\n// - Write path uses === first (fast for primitives), falls back to Object.is\n// only for NaN detection\n// - subs.size check avoids notify() call when no subscribers\n\nexport function signal(initial, debugName) {\n let value = initial;\n const subs = new Set();\n // Track the last effect that subscribed \u2014 skip redundant tracking when the\n // same effect reads this signal multiple times (common in template bindings).\n // lastTrackedEpoch tracks the effect's cleanup epoch to detect stale caches.\n let lastTracked = null;\n let lastTrackedEpoch = 0;\n\n // Shared write logic \u2014 inlined via _sigWrite closure to avoid per-call overhead\n // while keeping the sig() function body minimal for V8 optimization.\n function _sigWrite(next) {\n if (__DEV__ && insideComputed) {\n console.warn(\n '[what] Signal.set() called inside a computed function. ' +\n 'This may cause infinite loops. Use effect() instead.' +\n (debugName ? ` (signal: ${debugName})` : '')\n );\n }\n const nextVal = typeof next === 'function' ? next(value) : next;\n // Fast equality: === handles all primitives except NaN.\n // Only fall through for the NaN !== NaN case.\n if (value === nextVal || (value !== value && nextVal !== nextVal)) return;\n value = nextVal;\n // Invalidate lastTracked since value changed \u2014 any effect that reads\n // this signal during re-run needs to re-track.\n lastTracked = null;\n if (__DEV__ && __devtools) __devtools.onSignalUpdate(sig);\n if (subs.size > 0) notify(subs);\n }\n\n // Unified getter/setter: sig() reads, sig(newVal) writes\n // Using arguments.length instead of rest args avoids array allocation on read\n function sig(newVal) {\n if (arguments.length === 0) {\n // Read \u2014 hot path, keep minimal\n const ce = currentEffect;\n if (ce !== null) {\n // Only track if this signal isn't already in the effect's deps.\n // lastTracked is a fast cache for the common case (single effect reading\n // this signal). It's reset to null on write and on cleanup epoch change.\n if (ce !== lastTracked || ce._epoch !== lastTrackedEpoch) {\n lastTracked = ce;\n lastTrackedEpoch = ce._epoch;\n subs.add(ce);\n ce.deps.push(subs);\n }\n }\n return value;\n }\n // Write via sig(newVal)\n _sigWrite(newVal);\n }\n\n sig.set = _sigWrite;\n\n sig.peek = () => value;\n\n sig.subscribe = (fn) => {\n return effect(() => fn(sig()));\n };\n\n sig._signal = true;\n if (__DEV__) {\n sig._subs = subs;\n if (debugName) sig._debugName = debugName;\n }\n\n // Notify devtools of signal creation\n if (__DEV__ && __devtools) __devtools.onSignalCreate(sig);\n\n return sig;\n}\n\n// --- Computed ---\n// Derived signal. Lazy: only recomputes when a dependency changes AND it's read.\n// Topological level: max(dependency levels) + 1, computed from source signals (level 0).\n\nexport function computed(fn) {\n let value, dirty = true;\n const subs = new Set();\n let lastTracked = null;\n let lastTrackedEpoch = 0;\n\n const inner = _createEffect(() => {\n const prevInsideComputed = insideComputed;\n if (__DEV__) insideComputed = true;\n try {\n value = fn();\n dirty = false;\n } finally {\n if (__DEV__) insideComputed = prevInsideComputed;\n }\n }, true);\n\n // Computed nodes start at level 1. Updated when graph structure changes.\n inner._level = 1;\n inner._computed = true;\n inner._computedSubs = subs;\n\n // Register this subscriber set as owned by this computed\n subs._owner = inner;\n\n // Store markDirty/isDirty closures on the inner effect for iterative eval\n inner._markDirty = () => { dirty = true; };\n inner._isDirty = () => dirty;\n\n function read() {\n const ce = currentEffect;\n if (ce !== null) {\n if (ce !== lastTracked || ce._epoch !== lastTrackedEpoch) {\n lastTracked = ce;\n lastTrackedEpoch = ce._epoch;\n subs.add(ce);\n ce.deps.push(subs);\n }\n }\n if (dirty) _evaluateComputed(inner);\n return value;\n }\n\n // When a dependency changes, mark dirty AND propagate to our subscribers.\n inner._onNotify = () => {\n dirty = true;\n lastTracked = null; // Invalidate tracking cache on value change\n if (subs.size > 0) notify(subs);\n };\n\n read._signal = true;\n read.peek = () => {\n if (dirty) _evaluateComputed(inner);\n return value;\n };\n\n return read;\n}\n\n// --- Iterative Computed Evaluation ---\n//\n// Problem: A chain of N dirty computeds causes O(N) recursive calls:\n// C_N.read() \u2192 eval \u2192 fn() \u2192 C_{N-1}.read() \u2192 eval \u2192 fn() \u2192 ... \u2192 C_1.read() \u2192 eval \u2192 fn()\n// This overflows the stack at ~3500 depth.\n//\n// Solution: Throw/catch trampoline. The outermost _evaluateComputed manages a\n// stack (array). When a computed's fn() reads another dirty computed during\n// evaluation, _evaluateComputed throws NEEDS_UPSTREAM. The outer loop catches\n// this, adds the upstream to the stack, and processes from the bottom up.\n// This converts O(N) call depth to O(1) per computed (just the outermost loop).\n\nfunction _evaluateComputed(computedEffect) {\n if (iterativeEvalStack !== null) {\n // We're inside the outermost evaluation loop, and a computed's fn()\n // is reading another dirty computed. Push it onto the stack and throw\n // to abort the current fn() so the outer loop can process it first.\n iterativeEvalStack.push(computedEffect);\n throw NEEDS_UPSTREAM;\n }\n\n // Outermost call \u2014 enter the iterative evaluation loop.\n // The stack grows as we discover dirty upstream computeds.\n const stack = [computedEffect];\n iterativeEvalStack = stack;\n\n try {\n while (stack.length > 0) {\n const current = stack[stack.length - 1];\n\n if (!current._isDirty || !current._isDirty()) {\n // Already clean \u2014 pop and continue\n stack.pop();\n continue;\n }\n\n // Pre-scan known deps: if any are dirty computeds, push them onto\n // the stack first (bottom-up). This avoids the O(N^2) worst case\n // where throw/catch restarts from the top on each dirty upstream.\n let pushedUpstream = false;\n const deps = current.deps;\n for (let i = 0; i < deps.length; i++) {\n const depOwner = deps[i]._owner;\n if (depOwner && depOwner._computed && depOwner._isDirty && depOwner._isDirty()) {\n stack.push(depOwner);\n pushedUpstream = true;\n }\n }\n if (pushedUpstream) {\n // Process dirty upstreams first before re-evaluating current\n continue;\n }\n\n // All known deps are clean \u2014 evaluate. throw/catch is fallback\n // for newly-discovered deps only.\n try {\n const prevDepsLen = current.deps.length;\n _runEffect(current);\n // Only recompute level when graph structure changes\n if (current.deps.length !== prevDepsLen) {\n _updateLevel(current);\n }\n stack.pop(); // Successfully evaluated\n } catch (err) {\n if (err === NEEDS_UPSTREAM) {\n // A dirty upstream was discovered and pushed onto the stack.\n // Re-mark this computed dirty since its fn() was aborted mid-execution.\n current._markDirty();\n // The upstream is now at stack[stack.length-1]. Loop continues.\n } else {\n throw err; // Re-throw real errors\n }\n }\n }\n } finally {\n iterativeEvalStack = null;\n }\n}\n\n// Update the topological level of a computed/effect based on its current dependencies.\nfunction _updateLevel(e) {\n let maxDepLevel = 0;\n const deps = e.deps;\n for (let i = 0; i < deps.length; i++) {\n const owner = deps[i]._owner;\n if (owner) {\n const depLevel = owner._level;\n if (depLevel > maxDepLevel) maxDepLevel = depLevel;\n }\n }\n e._level = maxDepLevel + 1;\n}\n\n// --- Effect ---\n// Runs a function, auto-tracking signal reads. Re-runs when deps change.\n// Returns a dispose function.\n\nexport function effect(fn, opts) {\n const e = _createEffect(fn);\n e._level = 1;\n // First run: skip cleanup (deps is empty), just run and track\n const prev = currentEffect;\n currentEffect = e;\n try {\n const result = e.fn();\n if (typeof result === 'function') e._cleanup = result;\n } finally {\n currentEffect = prev;\n }\n // Compute level after first run based on actual dependencies (cached).\n _updateLevel(e);\n // Mark as stable after first run \u2014 subsequent re-runs skip cleanup/re-subscribe\n if (opts?.stable) e._stable = true;\n const dispose = () => _disposeEffect(e);\n // Register with current root for automatic cleanup\n if (currentRoot) {\n currentRoot.disposals.push(dispose);\n }\n return dispose;\n}\n\n// --- Batch ---\n// Group multiple signal writes; effects run once at the end.\n\nexport function batch(fn) {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) flush();\n }\n}\n\n// --- Internals ---\n\nfunction _createEffect(fn, lazy) {\n // Minimal object shape \u2014 computed() adds extra properties after creation.\n // IMPORTANT: V8 optimizes objects with a consistent \"hidden class\" (shape).\n // All properties must be declared upfront even if null \u2014 adding properties\n // later causes shape transitions which deoptimize property access globally.\n const e = {\n fn,\n deps: [], // array of subscriber sets (cheaper than Set for typical 1-3 deps)\n lazy: lazy || false,\n _onNotify: null,\n disposed: false,\n _pending: false,\n _stable: false, // stable effects skip cleanup/re-subscribe on re-run\n _level: 0, // topological depth: signals=0, computed/effects=max(deps)+1\n _computed: false, // true for computed inner effects\n _computedSubs: null, // reference to the computed's subscriber set\n _isDirty: null, // function to check if computed is dirty (set by computed())\n _markDirty: null, // function to mark computed dirty (set by computed())\n _cleanup: null, // cleanup function returned by effect fn (declared upfront for shape)\n _epoch: 0, // incremented on cleanup \u2014 used by signal lastTracked cache\n };\n if (__DEV__ && __devtools) __devtools.onEffectCreate(e);\n return e;\n}\n\nfunction _runEffect(e) {\n if (e.disposed) return;\n\n // Stable effect fast path: deps don't change, skip cleanup/re-subscribe.\n // This is critical for performance: effects like `() => el.className = sig() ? 'a' : ''`\n // always read the same signal(s). After auto-promotion, re-runs skip the O(deps)\n // cleanup + re-subscribe cycle entirely.\n if (e._stable) {\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__) console.warn('[what] Error in effect cleanup:', err);\n }\n e._cleanup = null;\n }\n const prev = currentEffect;\n currentEffect = null; // Don't re-track deps (already subscribed)\n try {\n const result = e.fn();\n if (typeof result === 'function') e._cleanup = result;\n } catch (err) {\n if (__devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n if (__DEV__) console.warn('[what] Error in stable effect:', err);\n } finally {\n currentEffect = prev;\n }\n if (__DEV__ && __devtools?.onEffectRun) __devtools.onEffectRun(e);\n return;\n }\n\n // Save the single dep for auto-stable detection (safe: 1-dep effects\n // have deterministic dep sets \u2014 no conditional reads possible).\n const singleDep = e.deps.length === 1 ? e.deps[0] : null;\n\n cleanup(e);\n // Run effect cleanup from previous run\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect-cleanup', effect: e });\n if (__DEV__) console.warn('[what] Error in effect cleanup:', err);\n }\n e._cleanup = null;\n }\n const prev = currentEffect;\n currentEffect = e;\n try {\n const result = e.fn();\n // Capture cleanup function if returned\n if (typeof result === 'function') {\n e._cleanup = result;\n }\n } catch (err) {\n if (err === NEEDS_UPSTREAM) throw err; // Iterative eval sentinel \u2014 not a real error\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n throw err;\n } finally {\n currentEffect = prev;\n }\n\n // Auto-promote to stable: effects with exactly 1 dep that remains the same\n // after re-run have a fixed dependency graph. Skip cleanup/re-subscribe\n // on future re-runs. This is safe because a single-dep effect can't have\n // conditional signal reads that change which signal is tracked.\n // Guard: don't promote self-triggering effects (those that write to the signal\n // they read, causing re-queuing). Check e._pending to detect this.\n if (singleDep !== null && e.deps.length === 1 && e.deps[0] === singleDep\n && !e._cleanup && !e._pending) {\n e._stable = true;\n }\n\n if (__DEV__ && __devtools?.onEffectRun) __devtools.onEffectRun(e);\n}\n\nfunction _disposeEffect(e) {\n e.disposed = true;\n if (__DEV__ && __devtools) __devtools.onEffectDispose(e);\n cleanup(e);\n // Run cleanup on dispose\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__) console.warn('[what] Error in effect cleanup on dispose:', err);\n }\n e._cleanup = null;\n }\n}\n\nfunction cleanup(e) {\n const deps = e.deps;\n for (let i = 0; i < deps.length; i++) deps[i].delete(e);\n deps.length = 0;\n // Increment epoch so signals' lastTracked cache is invalidated.\n // This ensures a signal will re-track this effect after cleanup.\n e._epoch++;\n}\n\n// --- Notification ---\n// Iterative notification to prevent stack overflow on deep computed chains.\n// Uses a reusable queue to avoid per-call array allocation.\n// When notify() encounters _onNotify callbacks (from computeds), those may\n// call notify() recursively. The queue drains iteratively in the outermost call.\n\nlet notifyDepth = 0; // Tracks recursive notify depth\nlet notifyQueue = null; // Reusable queue, allocated on first recursive call\nlet notifyQueueLen = 0; // Length of the queue\n\n// Process a single subscriber during notification.\n// Extracted to avoid code duplication between outer and queue drain paths.\nfunction _processSubscriber(e) {\n if (e.disposed) return;\n if (e._onNotify) {\n // Computed subscriber: mark dirty and propagate.\n // _onNotify may call notify() recursively \u2014 tracked by notifyDepth.\n e._onNotify();\n } else if (!e._pending) {\n if (batchDepth === 0 && e._stable) {\n // Inline execution for stable effects \u2014 no pending queue needed\n const prev = currentEffect;\n currentEffect = null;\n try {\n const result = e.fn();\n if (typeof result === 'function') {\n if (e._cleanup) try { e._cleanup(); } catch (err) { /* ignore */ }\n e._cleanup = result;\n }\n } catch (err) {\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n if (__DEV__) console.warn('[what] Error in stable effect:', err);\n } finally {\n currentEffect = prev;\n }\n } else {\n e._pending = true;\n const level = e._level;\n const len = pendingEffects.length;\n if (len > 0 && pendingEffects[len - 1]._level > level) {\n pendingNeedSort = true;\n }\n pendingEffects.push(e);\n }\n }\n}\n\nfunction notify(subs) {\n // Fast path: no recursive notifications in progress \u2014 iterate directly.\n // This avoids array allocation for the common case (signal \u2192 effects).\n if (notifyDepth === 0) {\n notifyDepth = 1;\n try {\n for (const e of subs) {\n _processSubscriber(e);\n }\n // Drain any queued subscriber sets from recursive notify calls\n if (notifyQueueLen > 0) {\n let qi = 0;\n while (qi < notifyQueueLen) {\n const queuedSubs = notifyQueue[qi];\n notifyQueue[qi] = null; // Allow GC\n qi++;\n for (const e of queuedSubs) {\n _processSubscriber(e);\n }\n }\n notifyQueueLen = 0;\n }\n } finally {\n notifyDepth = 0;\n }\n if (batchDepth === 0 && pendingEffects.length > 0) scheduleMicrotask();\n } else {\n // Recursive call \u2014 queue the subscriber set for the outermost call to drain.\n if (notifyQueue === null) notifyQueue = [];\n if (notifyQueueLen >= notifyQueue.length) {\n notifyQueue.push(subs);\n } else {\n notifyQueue[notifyQueueLen] = subs;\n }\n notifyQueueLen++;\n }\n}\n\nlet microtaskScheduled = false;\nfunction scheduleMicrotask() {\n if (!microtaskScheduled) {\n microtaskScheduled = true;\n queueMicrotask(() => {\n microtaskScheduled = false;\n flush();\n });\n }\n}\n\nlet isFlushing = false;\n\nfunction flush() {\n // Re-entrancy guard: if flush() is called during an active flush (e.g., via\n // flushSync() inside a component render or effect), skip to prevent infinite\n // recursion. Pending effects will be picked up by the outer flush's while-loop.\n if (isFlushing) return;\n isFlushing = true;\n\n try {\n let iterations = 0;\n while (pendingEffects.length > 0 && iterations < 25) {\n const batch = pendingEffects;\n pendingEffects = [];\n\n // Topological sort: execute effects in level order (lowest first).\n // Fast paths:\n // 1. Single effect \u2014 no sort needed (most common case for microtask flush)\n // 2. Already sorted \u2014 skip sort (common when effects added in level order)\n // 3. Multiple effects at different levels \u2014 sort required\n if (batch.length > 1 && pendingNeedSort) {\n batch.sort((a, b) => a._level - b._level);\n }\n pendingNeedSort = false;\n\n for (let i = 0; i < batch.length; i++) {\n const e = batch[i];\n e._pending = false;\n if (!e.disposed && !e._onNotify) {\n const prevDepsLen = e.deps.length;\n _runEffect(e);\n // Update level only if deps changed (graph structure change)\n if (!e._computed && e.deps.length !== prevDepsLen) {\n _updateLevel(e);\n }\n }\n }\n iterations++;\n }\n if (iterations >= 25) {\n if (__DEV__) {\n const remaining = pendingEffects.slice(0, 3);\n const effectNames = remaining.map(e => e.fn?.name || e.fn?.toString().slice(0, 60) || '(anonymous)');\n console.warn(\n `[what] Possible infinite effect loop detected (25 iterations). ` +\n `Likely cause: an effect writes to a signal it also reads, creating a cycle. ` +\n `Use untrack() to read signals without subscribing. ` +\n `Looping effects: ${effectNames.join(', ')}`\n );\n } else {\n console.warn('[what] Possible infinite effect loop detected');\n }\n // Clear pending effects AFTER capturing debug info\n for (let i = 0; i < pendingEffects.length; i++) pendingEffects[i]._pending = false;\n pendingEffects.length = 0;\n }\n } finally {\n isFlushing = false;\n }\n}\n\n// --- Memo ---\n// Eager computed that only propagates when the value actually changes.\n// Fix: Instead of calling notify(subs) inline (which bypasses topological sort\n// and causes diamond-dependency glitches), push memo subscribers into\n// pendingEffects and let them go through the sorted flush() path.\nexport function memo(fn) {\n let value;\n const subs = new Set();\n\n const e = _createEffect(() => {\n const next = fn();\n if (!Object.is(value, next)) {\n value = next;\n // Push subscribers into pendingEffects for topological flush\n // instead of inline notify() which can cause diamond glitches\n for (const sub of subs) {\n if (sub.disposed) continue;\n if (sub._onNotify) {\n // Computed subscriber: mark dirty and propagate\n sub._onNotify();\n } else if (!sub._pending) {\n sub._pending = true;\n const level = sub._level;\n const len = pendingEffects.length;\n if (len > 0 && pendingEffects[len - 1]._level > level) {\n pendingNeedSort = true;\n }\n pendingEffects.push(sub);\n }\n }\n }\n });\n\n e._level = 1;\n\n _runEffect(e);\n _updateLevel(e);\n\n // Register subscriber set owner for level tracking\n subs._owner = e;\n\n // Register with current root\n if (currentRoot) {\n currentRoot.disposals.push(() => _disposeEffect(e));\n }\n\n function read() {\n if (currentEffect) {\n subs.add(currentEffect);\n currentEffect.deps.push(subs);\n }\n return value;\n }\n\n read._signal = true;\n read.peek = () => value;\n return read;\n}\n\n// --- flushSync ---\n// Force all pending effects to run synchronously. Use sparingly.\n// Calling during render or effect execution is a no-op (prevents infinite loops).\nexport function flushSync() {\n if (isFlushing) {\n // Re-entrant call \u2014 silently skip (Solid approach).\n // This prevents infinite loops when flushSync() is called during component\n // render or effect execution. Pending effects will be picked up by the\n // outer flush's while-loop.\n if (__DEV__) {\n console.warn(\n '[what] flushSync() called during an active flush (e.g., inside a component render or effect). ' +\n 'This is a no-op to prevent infinite loops. Move flushSync() to an event handler or onMount callback.'\n );\n }\n return;\n }\n if (currentEffect) {\n // Called inside an effect/render \u2014 skip with warning\n if (__DEV__) {\n console.warn(\n '[what] flushSync() called during effect execution. ' +\n 'This is a no-op to prevent infinite loops. Move flushSync() to an event handler or onMount callback.'\n );\n }\n return;\n }\n microtaskScheduled = false;\n flush();\n}\n\n// --- Untrack ---\n// Read signals without subscribing\nexport function untrack(fn) {\n const prev = currentEffect;\n currentEffect = null;\n try {\n return fn();\n } finally {\n currentEffect = prev;\n }\n}\n\n// --- getOwner / runWithOwner ---\n// Expose ownership context for advanced use cases (e.g., async operations\n// that need to register disposals with the correct owner).\n\nexport function getOwner() {\n return currentOwner;\n}\n\nexport function runWithOwner(owner, fn) {\n const prev = currentOwner;\n const prevRoot = currentRoot;\n currentOwner = owner;\n currentRoot = owner;\n try {\n return fn();\n } finally {\n currentOwner = prev;\n currentRoot = prevRoot;\n }\n}\n\n// --- createRoot ---\n// Isolated reactive scope with ownership tree.\n// All effects created inside are tracked and disposed together.\n// Child createRoot scopes register with parent owner \u2014 disposing parent\n// automatically disposes all children (prevents orphaned subscriptions).\nexport function createRoot(fn) {\n const prevRoot = currentRoot;\n const prevOwner = currentOwner;\n const root = {\n disposals: [],\n owner: currentOwner, // parent owner for ownership tree\n children: [], // child roots (ownership tree)\n _disposed: false,\n };\n\n // Register this root as a child of the parent owner\n if (currentOwner) {\n currentOwner.children.push(root);\n }\n\n currentRoot = root;\n currentOwner = root;\n\n try {\n const dispose = () => {\n if (root._disposed) return;\n root._disposed = true;\n\n // Dispose children first (depth-first, reverse order)\n for (let i = root.children.length - 1; i >= 0; i--) {\n _disposeRoot(root.children[i]);\n }\n root.children.length = 0;\n\n // Dispose own effects (reverse order for LIFO cleanup)\n for (let i = root.disposals.length - 1; i >= 0; i--) {\n root.disposals[i]();\n }\n root.disposals.length = 0;\n\n // Remove from parent's children list\n if (root.owner) {\n const idx = root.owner.children.indexOf(root);\n if (idx >= 0) root.owner.children.splice(idx, 1);\n }\n };\n return fn(dispose);\n } finally {\n currentRoot = prevRoot;\n currentOwner = prevOwner;\n }\n}\n\n// Internal: dispose a root and all its children\nfunction _disposeRoot(root) {\n if (root._disposed) return;\n root._disposed = true;\n\n // Dispose children first\n for (let i = root.children.length - 1; i >= 0; i--) {\n _disposeRoot(root.children[i]);\n }\n root.children.length = 0;\n\n // Dispose own effects\n for (let i = root.disposals.length - 1; i >= 0; i--) {\n root.disposals[i]();\n }\n root.disposals.length = 0;\n}\n\n// --- _createItemScope ---\n// Lightweight reactive scope for list items. Unlike createRoot, this does NOT\n// register with the parent ownership tree (saves ~40% allocation overhead).\n// Used by mapArray where disposal is managed explicitly by the list reconciler.\nexport function _createItemScope(fn) {\n const prevRoot = currentRoot;\n const prevOwner = currentOwner;\n const scope = {\n disposals: [],\n owner: null, // No parent registration\n children: [], // Kept for compat with effects that create sub-roots\n _disposed: false,\n };\n\n currentRoot = scope;\n currentOwner = scope;\n\n try {\n const dispose = () => {\n if (scope._disposed) return;\n scope._disposed = true;\n // Dispose children\n for (let i = scope.children.length - 1; i >= 0; i--) {\n _disposeRoot(scope.children[i]);\n }\n scope.children.length = 0;\n // Dispose own effects\n for (let i = scope.disposals.length - 1; i >= 0; i--) {\n scope.disposals[i]();\n }\n scope.disposals.length = 0;\n };\n return fn(dispose);\n } finally {\n currentRoot = prevRoot;\n currentOwner = prevOwner;\n }\n}\n\n// --- onCleanup ---\n// Register a cleanup function with the current owner/root.\n// Runs when the owner is disposed.\nexport function onCleanup(fn) {\n if (currentRoot) {\n currentRoot.disposals.push(fn);\n }\n}\n", "// What Framework - Component Utilities\n// memo, lazy, Suspense, ErrorBoundary\n\nimport { h } from './h.js';\nimport { signal, effect, untrack, __DEV__ } from './reactive.js';\n\n// Legacy errorBoundaryStack removed \u2014 tree-based resolution via _parentCtx._errorBoundary\n// is now the only mechanism. See reportError() below.\n\n// --- memo ---\n// In the run-once model, components execute exactly once and never re-render.\n// Signals update the DOM directly via fine-grained effects. Therefore, memo()\n// is a no-op identity wrapper \u2014 there is no re-render to skip.\n// Kept for API compatibility with React-style code.\n\nexport function memo(Component, _areEqual) {\n // No-op in run-once model \u2014 just return the component as-is\n const MemoWrapper = function MemoWrapper(props) {\n return Component(props);\n };\n MemoWrapper.displayName = `Memo(${Component.name || 'Anonymous'})`;\n return MemoWrapper;\n}\n\n// Injected by dom.js\nlet _getCurrentComponent = null;\nexport function _injectGetCurrentComponent(fn) { _getCurrentComponent = fn; }\n\nexport function shallowEqual(a, b) {\n if (a === b) return true;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.is(a[key], b[key])) return false;\n }\n return true;\n}\n\n// --- lazy ---\n// Code-split a component. Returns a wrapper that loads on first render.\n\nexport function lazy(loader) {\n let Component = null;\n let loadPromise = null;\n let loadError = null;\n const listeners = new Set();\n\n function LazyWrapper(props) {\n if (loadError) throw loadError;\n if (Component) return h(Component, props);\n\n if (!loadPromise) {\n loadPromise = loader()\n .then(mod => {\n Component = mod.default || mod;\n // Notify all waiting instances\n listeners.forEach(fn => fn());\n listeners.clear();\n })\n .catch(err => { loadError = err; });\n }\n\n // Throw promise for Suspense to catch\n throw loadPromise;\n }\n\n LazyWrapper.displayName = 'Lazy';\n LazyWrapper._lazy = true;\n LazyWrapper._onLoad = (fn) => {\n if (Component) fn();\n else listeners.add(fn);\n };\n return LazyWrapper;\n}\n\n// --- Suspense ---\n// Show fallback while children are loading (lazy components).\n// Works with lazy() and async components.\n\nexport function Suspense({ fallback, children }) {\n const loading = signal(false);\n const pendingPromises = new Set();\n\n // Suspense boundary marker\n const boundary = {\n _suspense: true,\n onSuspend(promise) {\n loading.set(true);\n pendingPromises.add(promise);\n promise.finally(() => {\n pendingPromises.delete(promise);\n if (pendingPromises.size === 0) {\n loading.set(false);\n }\n });\n },\n };\n\n return {\n tag: '__suspense',\n props: { boundary, fallback, loading },\n children: Array.isArray(children) ? children : [children],\n _vnode: true,\n };\n}\n\n// --- ErrorBoundary ---\n// Catch errors in children and show fallback.\n// Uses a signal to track error state so it works with reactive rendering.\n\nexport function ErrorBoundary({ fallback, children, onError }) {\n const errorState = signal(null);\n\n // Error handler that will be registered with the component tree\n const handleError = (error) => {\n errorState.set(error);\n if (onError) {\n try {\n onError(error);\n } catch (e) {\n console.error('Error in onError handler:', e);\n }\n }\n };\n\n // Reset function to recover from error\n const reset = () => errorState.set(null);\n\n return {\n tag: '__errorBoundary',\n props: { errorState, handleError, fallback, reset },\n children: Array.isArray(children) ? children : [children],\n _vnode: true,\n };\n}\n\n// Helper to report error to nearest boundary\n// Walks the component context tree (not a runtime stack) so async errors are caught\nexport function reportError(error, startCtx) {\n // Walk up the _parentCtx chain to find the nearest _errorBoundary\n let ctx = startCtx || _getCurrentComponent?.();\n while (ctx) {\n if (ctx._errorBoundary) {\n ctx._errorBoundary(error);\n return true;\n }\n ctx = ctx._parentCtx;\n }\n return false;\n}\n\n// _getCurrentComponent is already declared above and injected via _injectGetCurrentComponent\n\n// --- Show ---\n// Conditional rendering component. Cleaner than ternaries.\n\nexport function Show({ when, fallback = null, children }) {\n // when can be a signal or a value\n const condition = typeof when === 'function' ? when() : when;\n return condition ? children : fallback;\n}\n\n// --- For ---\n// Efficient list rendering with keyed reconciliation.\n\nexport function For({ each, fallback = null, children }) {\n const list = typeof each === 'function' ? each() : each;\n if (!list || list.length === 0) return fallback;\n\n // children should be a function (item, index) => vnode\n const renderFn = Array.isArray(children) ? children[0] : children;\n if (typeof renderFn !== 'function') {\n console.warn('[what] For: children must be a render function, e.g. <For each={items}>{(item) => ...}</For>');\n return fallback;\n }\n\n return list.map((item, index) => {\n const vnode = renderFn(item, index);\n // Auto-detect keys for efficient keyed reconciliation\n if (vnode && typeof vnode === 'object' && vnode.key == null) {\n if (item != null && typeof item === 'object') {\n // Use item.id or item.key if available\n if (item.id != null) vnode.key = item.id;\n else if (item.key != null) vnode.key = item.key;\n } else if (typeof item === 'string' || typeof item === 'number') {\n // Primitive items can be their own key\n vnode.key = item;\n }\n }\n return vnode;\n });\n}\n\n// --- Switch / Match ---\n// Multi-condition rendering (like switch statement).\n\nexport function Switch({ fallback = null, children }) {\n const kids = Array.isArray(children) ? children : [children];\n\n for (const child of kids) {\n if (child && child.tag === Match) {\n const condition = typeof child.props.when === 'function'\n ? child.props.when()\n : child.props.when;\n if (condition) {\n return child.children;\n }\n }\n }\n\n return fallback;\n}\n\nexport function Match({ when, children }) {\n // Match is just a marker component, Switch handles the logic\n return { tag: Match, props: { when }, children, _vnode: true };\n}\n\n// --- Island ---\n// Deferred hydration component for islands architecture.\n// Usage: h(Island, { component: Counter, mode: 'idle' })\n// The babel plugin compiles <Counter client:idle /> into this.\n\nexport function Island({ component: Component, mode, mediaQuery, ...props }) {\n const placeholder = h('div', { 'data-island': Component.name || 'Island', 'data-hydrate': mode });\n\n // We need to return a vnode that the reconciler can handle.\n // The actual hydration scheduling happens after mount via an effect.\n const wrapper = signal(null);\n const hydrated = signal(false);\n\n function doHydrate() {\n if (hydrated()) return;\n hydrated.set(true);\n // Render the actual component\n wrapper.set(h(Component, props));\n }\n\n // Schedule hydration based on mode\n function scheduleHydration(el) {\n switch (mode) {\n case 'load':\n queueMicrotask(doHydrate);\n break;\n\n case 'idle':\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(doHydrate);\n } else {\n setTimeout(doHydrate, 200);\n }\n break;\n\n case 'visible': {\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n observer.disconnect();\n doHydrate();\n }\n });\n observer.observe(el);\n break;\n }\n\n case 'interaction': {\n const hydrate = () => {\n el.removeEventListener('click', hydrate);\n el.removeEventListener('focus', hydrate);\n el.removeEventListener('mouseenter', hydrate);\n doHydrate();\n };\n el.addEventListener('click', hydrate, { once: true });\n el.addEventListener('focus', hydrate, { once: true });\n el.addEventListener('mouseenter', hydrate, { once: true });\n break;\n }\n\n case 'media': {\n if (!mediaQuery) { doHydrate(); break; }\n const mq = window.matchMedia(mediaQuery);\n if (mq.matches) {\n queueMicrotask(doHydrate);\n } else {\n const checkMedia = () => {\n if (mq.matches) {\n mq.removeEventListener('change', checkMedia);\n doHydrate();\n }\n };\n mq.addEventListener('change', checkMedia);\n }\n break;\n }\n\n default:\n // Unknown mode, hydrate immediately\n queueMicrotask(doHydrate);\n }\n }\n\n // Use ref callback to get the DOM element and schedule hydration\n const refCallback = (el) => {\n if (el) scheduleHydration(el);\n };\n\n // Return: show placeholder until hydrated, then show the real component\n return h('div', { 'data-island': Component.name || 'Island', 'data-hydrate': mode, ref: refCallback },\n hydrated() ? wrapper() : null\n );\n}\n", "// What Framework - Helpers & Utilities\n// Commonly needed patterns, zero overhead.\n\nimport { signal, effect, __DEV__ } from './reactive.js';\n\n// --- each(list, fn) --- [DEPRECATED: use <For> component or .map() instead]\n// Keyed list rendering. Optimized for reconciliation.\nlet _eachWarned = false;\nexport function each(list, fn, keyFn) {\n if (!_eachWarned) {\n _eachWarned = true;\n console.warn('[what] each() is deprecated. Use the <For> component or Array.map() instead.');\n }\n if (!list || list.length === 0) return [];\n return list.map((item, index) => {\n const vnode = fn(item, index);\n if (keyFn && vnode && typeof vnode === 'object') {\n vnode.key = keyFn(item, index);\n }\n return vnode;\n });\n}\n\n// --- cls(...args) ---\n// Conditional class names. Like clsx but tiny.\n// cls('base', condition && 'active', { hidden: isHidden, bold: isBold })\nexport function cls(...args) {\n const classes = [];\n for (const arg of args) {\n if (!arg) continue;\n if (typeof arg === 'string') {\n classes.push(arg);\n } else if (typeof arg === 'object') {\n for (const [key, val] of Object.entries(arg)) {\n if (val) classes.push(key);\n }\n }\n }\n return classes.join(' ');\n}\n\n// --- style(obj) ---\n// Convert a style object to a CSS string for SSR.\nexport function style(obj) {\n if (typeof obj === 'string') return obj;\n return Object.entries(obj)\n .filter(([, v]) => v != null && v !== '')\n .map(([k, v]) => `${camelToKebab(k)}:${v}`)\n .join(';');\n}\n\nfunction camelToKebab(str) {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n// --- debounce ---\n// Debounced signal updates.\nexport function debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\n// --- throttle ---\nexport function throttle(fn, ms) {\n let last = 0;\n return (...args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n}\n\n// Component context ref \u2014 injected by dom.js to avoid circular imports\nlet _getCurrentComponentRef = null;\nexport function _setComponentRef(fn) { _getCurrentComponentRef = fn; }\n\n// --- useMediaQuery ---\n// Reactive media query. Returns a signal. Cleans up listener on component unmount.\nexport function useMediaQuery(query) {\n if (typeof window === 'undefined') return signal(false);\n const mq = window.matchMedia(query);\n const s = signal(mq.matches);\n const handler = (e) => s.set(e.matches);\n mq.addEventListener('change', handler);\n\n // Register cleanup if inside a component context\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => mq.removeEventListener('change', handler));\n }\n\n return s;\n}\n\n// --- useLocalStorage ---\n// Signal synced with localStorage. Cleans up listeners on component unmount.\nexport function useLocalStorage(key, initial) {\n let stored;\n try {\n const raw = localStorage.getItem(key);\n stored = raw !== null ? JSON.parse(raw) : initial;\n } catch {\n stored = initial;\n }\n\n const s = signal(stored);\n\n // Sync to localStorage on changes\n const dispose = effect(() => {\n try {\n localStorage.setItem(key, JSON.stringify(s()));\n } catch (e) {\n if (__DEV__) console.warn('[what] localStorage write failed (quota exceeded?):', e);\n }\n });\n\n // Listen for changes from other tabs\n let storageHandler = null;\n if (typeof window !== 'undefined') {\n storageHandler = (e) => {\n if (e.key === key && e.newValue !== null) {\n try { s.set(JSON.parse(e.newValue)); } catch (err) {\n if (__DEV__) console.warn('[what] localStorage parse failed:', err);\n }\n }\n };\n window.addEventListener('storage', storageHandler);\n }\n\n // Register cleanup if inside a component context\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => {\n dispose();\n if (storageHandler) window.removeEventListener('storage', storageHandler);\n });\n }\n\n return s;\n}\n\n// --- portal ---\n// Render children into a different DOM container.\nexport function Portal({ target, children }) {\n // In SSR, just return null (portals are client-only)\n if (typeof document === 'undefined') return null;\n const container = typeof target === 'string'\n ? document.querySelector(target)\n : target;\n if (!container) return null;\n // The DOM reconciler will mount children here\n return { tag: '__portal', props: { container }, children: Array.isArray(children) ? children : [children], _vnode: true };\n}\n\n// --- useClickOutside ---\n// Detect clicks outside a ref'd element. Essential for dropdowns, modals, popovers.\nexport function useClickOutside(ref, handler) {\n if (typeof document === 'undefined') return;\n\n const listener = (e) => {\n const el = ref.current || ref;\n if (!el || el.contains(e.target)) return;\n handler(e);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n });\n }\n}\n\n// --- Transition helper ---\n// Animate elements in/out. Returns props to spread on the element.\nexport function transition(name, active) {\n return {\n class: active ? `${name}-enter ${name}-enter-active` : `${name}-leave ${name}-leave-active`,\n };\n}\n", "// What Framework - Fine-Grained DOM Runtime\n// Components run ONCE. Signals create individual DOM effects.\n// No VDOM reconciler, no diffing \u2014 direct DOM manipulation driven by signals.\n\nimport { effect, batch, untrack, signal, __DEV__, __devtools } from './reactive.js';\nimport { reportError, _injectGetCurrentComponent, shallowEqual } from './components.js';\nimport { _setComponentRef } from './helpers.js';\n\n// SVG elements that need namespace\nconst SVG_ELEMENTS = new Set([\n 'svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'ellipse',\n 'g', 'defs', 'use', 'symbol', 'clipPath', 'mask', 'pattern', 'image',\n 'text', 'tspan', 'textPath', 'foreignObject', 'linearGradient', 'radialGradient', 'stop',\n 'marker', 'animate', 'animateTransform', 'animateMotion', 'set', 'filter',\n 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix',\n 'feDiffuseLighting', 'feDisplacementMap', 'feFlood', 'feGaussianBlur', 'feImage',\n 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'feSpecularLighting',\n 'feTile', 'feTurbulence',\n]);\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// Track all mounted component contexts for disposal\nconst mountedComponents = new Set();\n\n// WeakMap: comment node \u2192 component context (for comment-node boundaries)\nconst _commentCtxMap = new WeakMap();\n\nfunction isDomNode(value) {\n if (!value || typeof value !== 'object') return false;\n if (typeof Node !== 'undefined' && value instanceof Node) return true;\n return typeof value.nodeType === 'number' && typeof value.nodeName === 'string';\n}\n\nfunction isVNode(value) {\n return !!value && typeof value === 'object' && (value._vnode === true || 'tag' in value);\n}\n\n// Dispose a component: run effect cleanups, hook cleanups, onCleanup callbacks\nfunction disposeComponent(ctx) {\n if (ctx.disposed) return;\n ctx.disposed = true;\n\n // Run cleanup callbacks\n if (ctx.cleanups) {\n for (const cleanup of ctx.cleanups) {\n try { cleanup(); } catch (e) { console.error('[what] cleanup error:', e); }\n }\n }\n\n // Run effect disposals\n if (ctx.effects) {\n for (const dispose of ctx.effects) {\n try { dispose(); } catch (e) { /* already disposed */ }\n }\n }\n\n // Run hook cleanups (useEffect return values)\n if (ctx.hooks) {\n for (const hook of ctx.hooks) {\n if (hook && typeof hook.cleanup === 'function') {\n try { hook.cleanup(); } catch (e) { console.error('[what] hook cleanup error:', e); }\n }\n }\n }\n\n // Run onCleanup callbacks\n if (ctx._cleanupCallbacks) {\n for (const fn of ctx._cleanupCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onCleanup error:', e); }\n }\n }\n\n if (__DEV__ && __devtools?.onComponentUnmount) __devtools.onComponentUnmount(ctx);\n mountedComponents.delete(ctx);\n}\n\n// Dispose all components and reactive effects attached to a DOM subtree.\n// Performance: checks _componentCtx / _dispose / _propEffects before walking\n// children, and only checks _commentCtxMap for comment nodes (nodeType 8).\nexport function disposeTree(node) {\n if (!node) return;\n if (node._componentCtx) {\n disposeComponent(node._componentCtx);\n }\n // Check comment node WeakMap for component context \u2014 only for comment nodes\n if (node.nodeType === 8) {\n const commentCtx = _commentCtxMap.get(node);\n if (commentCtx) {\n disposeComponent(commentCtx);\n }\n }\n // Dispose reactive function child effects ({() => ...} wrappers)\n if (node._dispose) {\n try { node._dispose(); } catch (e) { /* already disposed */ }\n }\n // Dispose reactive prop effects (value: () => ..., class: () => ..., etc.)\n if (node._propEffects) {\n for (const key in node._propEffects) {\n try { node._propEffects[key](); } catch (e) { /* already disposed */ }\n }\n }\n // Recursively dispose children\n const children = node.childNodes;\n if (children && children.length > 0) {\n for (let i = 0; i < children.length; i++) {\n disposeTree(children[i]);\n }\n }\n}\n\n// Mount a component tree into a DOM container\nexport function mount(vnode, container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n disposeTree(container); // Clean up any previous mount\n container.textContent = '';\n const node = createDOM(vnode, container);\n if (node) container.appendChild(node);\n return () => {\n disposeTree(container);\n container.textContent = '';\n };\n}\n\n// --- Create DOM from VNode ---\n\nexport function createDOM(vnode, parent, isSvg) {\n // Null/false/true \u2192 placeholder comment (preserves child indices for reconciliation)\n if (vnode == null || vnode === false || vnode === true) {\n return document.createComment('');\n }\n\n // Text\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n return document.createTextNode(String(vnode));\n }\n\n // DOM node passthrough (fine-grained components return real nodes)\n if (isDomNode(vnode)) {\n return vnode;\n }\n\n // Reactive function child \u2014 use comment markers (no wrapper element)\n // to avoid polluting the DOM and breaking CSS selectors like :first-child.\n if (typeof vnode === 'function') {\n const startMarker = document.createComment('fn');\n const endMarker = document.createComment('/fn');\n let currentNodes = [];\n // We need a parent to insert between markers. The caller (createElementFromVNode\n // or createComponent) will appendChild both markers and the content. We return\n // a document fragment containing start marker, then the effect will manage nodes\n // between start and end markers once they're in the real DOM.\n const frag = document.createDocumentFragment();\n frag.appendChild(startMarker);\n frag.appendChild(endMarker);\n\n const dispose = effect(() => {\n const val = vnode();\n const vnodes = (val == null || val === false || val === true)\n ? []\n : Array.isArray(val) ? val : [val];\n\n const realParent = endMarker.parentNode;\n if (!realParent) return; // not mounted yet \u2014 first run handled below\n\n // Remove old nodes between markers\n for (const old of currentNodes) {\n disposeTree(old);\n if (old.parentNode === realParent) realParent.removeChild(old);\n }\n currentNodes = [];\n\n // Add new nodes before endMarker\n for (const v of vnodes) {\n const node = createDOM(v, realParent, parent?._isSvg);\n if (node) {\n // If createDOM returned a DocumentFragment, track individual children\n // since fragment nodes get absorbed into the DOM on insertion.\n if (node.nodeType === 11 /* DOCUMENT_FRAGMENT_NODE */) {\n const children = Array.from(node.childNodes);\n realParent.insertBefore(node, endMarker);\n for (const child of children) currentNodes.push(child);\n } else {\n realParent.insertBefore(node, endMarker);\n currentNodes.push(node);\n }\n }\n }\n });\n\n startMarker._dispose = dispose;\n // Also store dispose on endMarker so disposeTree can find it from either marker\n endMarker._dispose = dispose;\n return frag;\n }\n\n // Array of vnodes\n if (Array.isArray(vnode)) {\n const frag = document.createDocumentFragment();\n for (const child of vnode) {\n const node = createDOM(child, parent, isSvg);\n if (node) frag.appendChild(node);\n }\n return frag;\n }\n\n // VNode with component tag \u2014 component runs ONCE\n if (isVNode(vnode) && typeof vnode.tag === 'function') {\n return createComponent(vnode, parent, isSvg);\n }\n\n // VNode with string tag \u2014 create element\n if (isVNode(vnode)) {\n return createElementFromVNode(vnode, parent, isSvg);\n }\n\n // Unknown \u2014 convert to text\n return document.createTextNode(String(vnode));\n}\n\n// --- Component Rendering ---\n// Components run ONCE. Props are passed as a signal for reactive access.\n\n// Shared Proxy handler for reactive props \u2014 defined once, reused by all components.\n// The Proxy target must be a plain object (not a function) so that ownKeys\n// invariants are satisfied. The propsSignal is stored as target._sig.\nconst _propsProxyHandler = {\n get(target, key) {\n if (key === '_sig') return undefined; // hide internal property\n return target._sig()[key];\n },\n has(target, key) {\n if (key === '_sig') return false;\n return key in target._sig();\n },\n ownKeys(target) {\n return Reflect.ownKeys(target._sig());\n },\n getOwnPropertyDescriptor(target, key) {\n if (key === '_sig') return undefined;\n const current = target._sig();\n if (key in current) {\n return { value: current[key], writable: false, enumerable: true, configurable: true };\n }\n return undefined;\n },\n};\n\nconst componentStack = [];\n\nexport function getCurrentComponent() {\n return componentStack[componentStack.length - 1];\n}\n\n// Inject into components.js and helpers.js to avoid circular imports\n_injectGetCurrentComponent(getCurrentComponent);\n_setComponentRef(getCurrentComponent);\n\nexport function getComponentStack() {\n return componentStack;\n}\n\nfunction createComponent(vnode, parent, isSvg) {\n let { tag: Component, props, children } = vnode;\n\n // Class component detection\n if (typeof Component === 'function' &&\n (Component.prototype?.isReactComponent || Component.prototype?.render)) {\n const ClassComp = Component;\n Component = function ClassComponentBridge(props) {\n const instance = new ClassComp(props);\n return instance.render();\n };\n Component.displayName = ClassComp.displayName || ClassComp.name || 'ClassComponent';\n }\n\n // Handle special boundary components\n if (Component === '__errorBoundary' || vnode.tag === '__errorBoundary') {\n return createErrorBoundary(vnode, parent);\n }\n if (Component === '__suspense' || vnode.tag === '__suspense') {\n return createSuspenseBoundary(vnode, parent);\n }\n if (Component === '__portal' || vnode.tag === '__portal') {\n return createPortalDOM(vnode, parent);\n }\n\n // Component context for hooks\n // Error boundary lookup: walk the parent chain once, cache the result.\n const parentCtx = componentStack[componentStack.length - 1] || null;\n let errorBoundary = null;\n if (parentCtx) {\n // Fast path: if parent has an error boundary, use it directly\n errorBoundary = parentCtx._errorBoundary || null;\n if (!errorBoundary) {\n let p = parentCtx._parentCtx;\n while (p) {\n if (p._errorBoundary) { errorBoundary = p._errorBoundary; break; }\n p = p._parentCtx;\n }\n }\n }\n const ctx = {\n hooks: [],\n hookIndex: 0,\n effects: [],\n cleanups: [],\n mounted: false,\n disposed: false,\n Component,\n _parentCtx: parentCtx,\n _errorBoundary: errorBoundary,\n };\n\n // Component boundaries: use comment nodes instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('c:start');\n const endComment = document.createComment('c:end');\n _commentCtxMap.set(startComment, ctx);\n ctx._startComment = startComment;\n ctx._endComment = endComment;\n\n // Fragment to hold comment boundaries + component output\n const container = document.createDocumentFragment();\n container._componentCtx = ctx;\n ctx._wrapper = startComment; // Reference for context lookup\n\n // Track for disposal\n mountedComponents.add(ctx);\n if (__DEV__ && __devtools?.onComponentMount) __devtools.onComponentMount(ctx);\n\n // Props signal for reactive updates from parent\n const propsChildren = children.length === 0 ? undefined : children.length === 1 ? children[0] : children;\n // Merge children into props without spreading when possible\n let mergedProps;\n if (propsChildren !== undefined) {\n mergedProps = props ? Object.assign({}, props, { children: propsChildren }) : { children: propsChildren };\n } else {\n mergedProps = props ? Object.assign({}, props) : {};\n }\n const propsSignal = signal(mergedProps);\n ctx._propsSignal = propsSignal;\n\n // Create a reactive props proxy: reading any prop inside an effect\n // will auto-track the dependency on the propsSignal. This makes prop\n // access reactive across re-renders without requiring the component\n // to be re-executed.\n // Reuse shared trap handlers to minimize per-component allocation.\n // Store propsSignal on a plain object target (Proxy invariant: ownKeys must\n // match non-configurable own properties of target; functions have 'prototype').\n const reactiveProps = new Proxy({ _sig: propsSignal }, _propsProxyHandler);\n\n // Component runs ONCE \u2014 not inside an effect\n componentStack.push(ctx);\n\n let result;\n try {\n result = Component(reactiveProps);\n } catch (error) {\n componentStack.pop();\n if (!reportError(error, ctx)) {\n console.error('[what] Uncaught error in component:', Component.name || 'Anonymous', error);\n throw error;\n }\n // Return fragment with just comment boundaries on error\n container.appendChild(startComment);\n container.appendChild(endComment);\n return container;\n }\n\n componentStack.pop();\n ctx.mounted = true;\n\n // Run onMount callbacks after DOM is ready\n if (ctx._mountCallbacks) {\n queueMicrotask(() => {\n if (ctx.disposed) return;\n for (const fn of ctx._mountCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onMount error:', e); }\n }\n });\n }\n\n // Build fragment: <!-- c:start --> [component output] <!-- c:end -->\n container.appendChild(startComment);\n const vnodes = Array.isArray(result) ? result : [result];\n for (const v of vnodes) {\n const node = createDOM(v, container, isSvg);\n if (node) container.appendChild(node);\n }\n container.appendChild(endComment);\n\n return container;\n}\n\n// Error boundary component handler\nfunction createErrorBoundary(vnode, parent) {\n const { errorState, handleError, fallback, reset } = vnode.props;\n const children = vnode.children;\n\n // Use comment node boundaries instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('eb:start');\n const endComment = document.createComment('eb:end');\n\n const boundaryCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _errorBoundary: handleError,\n _startComment: startComment,\n _endComment: endComment,\n };\n _commentCtxMap.set(startComment, boundaryCtx);\n\n const container = document.createDocumentFragment();\n container._componentCtx = boundaryCtx;\n container.appendChild(startComment);\n container.appendChild(endComment);\n\n const dispose = effect(() => {\n const error = errorState();\n\n componentStack.push(boundaryCtx);\n\n // Remove old content between comment boundaries\n if (startComment.parentNode) {\n while (startComment.nextSibling && startComment.nextSibling !== endComment) {\n const old = startComment.nextSibling;\n disposeTree(old);\n old.parentNode.removeChild(old);\n }\n }\n\n let vnodes;\n if (error) {\n vnodes = typeof fallback === 'function' ? [fallback({ error, reset })] : [fallback];\n } else {\n vnodes = children;\n }\n\n vnodes = Array.isArray(vnodes) ? vnodes : [vnodes];\n\n for (const v of vnodes) {\n const node = createDOM(v, parent);\n if (node) {\n // Insert before endComment\n if (endComment.parentNode) {\n endComment.parentNode.insertBefore(node, endComment);\n } else {\n // Still in fragment before first mount\n container.insertBefore(node, endComment);\n }\n }\n }\n\n componentStack.pop();\n });\n\n boundaryCtx.effects.push(dispose);\n return container;\n}\n\n// Suspense boundary component handler\nfunction createSuspenseBoundary(vnode, parent) {\n const { boundary, fallback, loading } = vnode.props;\n const children = vnode.children;\n\n // Use comment node boundaries instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('sb:start');\n const endComment = document.createComment('sb:end');\n\n const boundaryCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _startComment: startComment,\n _endComment: endComment,\n };\n _commentCtxMap.set(startComment, boundaryCtx);\n\n const container = document.createDocumentFragment();\n container._componentCtx = boundaryCtx;\n container.appendChild(startComment);\n container.appendChild(endComment);\n\n const dispose = effect(() => {\n const isLoading = loading();\n const vnodes = isLoading ? [fallback] : children;\n const normalized = Array.isArray(vnodes) ? vnodes : [vnodes];\n\n componentStack.push(boundaryCtx);\n\n // Remove old content between comment boundaries\n if (startComment.parentNode) {\n while (startComment.nextSibling && startComment.nextSibling !== endComment) {\n const old = startComment.nextSibling;\n disposeTree(old);\n old.parentNode.removeChild(old);\n }\n }\n\n for (const v of normalized) {\n const node = createDOM(v, parent);\n if (node) {\n // Insert before endComment\n if (endComment.parentNode) {\n endComment.parentNode.insertBefore(node, endComment);\n } else {\n // Still in fragment before first mount\n container.insertBefore(node, endComment);\n }\n }\n }\n\n componentStack.pop();\n });\n\n boundaryCtx.effects.push(dispose);\n return container;\n}\n\n// Portal component handler\nfunction createPortalDOM(vnode, parent) {\n const { container } = vnode.props;\n const children = vnode.children;\n\n if (!container) {\n console.warn('[what] Portal: target container not found');\n return document.createComment('portal:empty');\n }\n\n const portalCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n };\n\n const placeholder = document.createComment('portal');\n placeholder._componentCtx = portalCtx;\n\n const portalNodes = [];\n for (const child of children) {\n const node = createDOM(child, container);\n if (node) {\n container.appendChild(node);\n portalNodes.push(node);\n }\n }\n\n portalCtx._cleanupCallbacks = [() => {\n for (const node of portalNodes) {\n disposeTree(node);\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n }];\n\n return placeholder;\n}\n\n// --- Create Element from VNode ---\n// For h()-based VNodes with string tags\n\nfunction createElementFromVNode(vnode, parent, isSvg) {\n const { tag, props, children } = vnode;\n\n const svgContext = isSvg || SVG_ELEMENTS.has(tag);\n const el = svgContext\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n\n // Apply props\n if (props) {\n applyProps(el, props, {}, svgContext);\n }\n\n // Append children\n const isSvgChildren = svgContext && tag !== 'foreignObject';\n for (let i = 0; i < children.length; i++) {\n const node = createDOM(children[i], el, isSvgChildren);\n if (node) el.appendChild(node);\n }\n\n el._vnode = vnode;\n return el;\n}\n\n// --- Prop Application ---\n// Only applied once for fine-grained (no diffing). Reactive props use effects.\n\nfunction applyProps(el, newProps, oldProps, isSvg) {\n if (!newProps) return;\n\n for (const key in newProps) {\n if (key === 'key' || key === 'children') continue;\n\n // Handle ref\n if (key === 'ref') {\n const ref = newProps.ref;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n continue;\n }\n\n setProp(el, key, newProps[key], isSvg);\n }\n}\n\nfunction setProp(el, key, value, isSvg) {\n // Reactive function props \u2014 wrap in effect for fine-grained updates\n if (typeof value === 'function' && !(key.startsWith('on') && key.length > 2) && key !== 'ref') {\n if (!el._propEffects) el._propEffects = {};\n if (el._propEffects[key]) {\n try { el._propEffects[key](); } catch (e) { /* already disposed */ }\n }\n el._propEffects[key] = effect(() => {\n const resolved = value();\n setProp(el, key, resolved, isSvg);\n });\n return;\n }\n\n // Event handlers\n if (key.startsWith('on') && key.length > 2) {\n let eventName = key.slice(2);\n let useCapture = false;\n if (eventName.endsWith('Capture')) {\n eventName = eventName.slice(0, -7);\n useCapture = true;\n }\n const event = eventName.toLowerCase();\n const storageKey = useCapture ? event + '_capture' : event;\n const old = el._events?.[storageKey];\n if (old && old._original === value) return;\n if (old) el.removeEventListener(event, old, useCapture);\n if (value == null) return;\n if (!el._events) el._events = {};\n // Single closure per event listener. Uses untrack to prevent accidental\n // signal subscriptions inside event handlers.\n const wrappedHandler = (e) => {\n if (!e.nativeEvent) e.nativeEvent = e;\n return untrack(() => wrappedHandler._handler(e));\n };\n wrappedHandler._handler = value;\n wrappedHandler._original = value;\n el._events[storageKey] = wrappedHandler;\n const eventOpts = value._eventOpts;\n el.addEventListener(event, wrappedHandler, eventOpts || useCapture || undefined);\n return;\n }\n\n // className / class\n if (key === 'className' || key === 'class') {\n if (isSvg) {\n el.setAttribute('class', value || '');\n } else {\n el.className = value || '';\n }\n return;\n }\n\n // Style\n if (key === 'style') {\n if (typeof value === 'string') {\n el.style.cssText = value;\n el._prevStyle = null;\n } else if (typeof value === 'object') {\n const oldStyle = el._prevStyle || {};\n for (const prop in oldStyle) {\n if (!(prop in value)) el.style[prop] = '';\n }\n for (const prop in value) {\n el.style[prop] = value[prop] ?? '';\n }\n el._prevStyle = { ...value };\n }\n return;\n }\n\n // dangerouslySetInnerHTML\n if (key === 'dangerouslySetInnerHTML') {\n el.innerHTML = value?.__html ?? '';\n return;\n }\n\n // innerHTML \u2014 require { __html: ... } wrapper to prevent XSS\n if (key === 'innerHTML') {\n if (value == null) return; // null/undefined \u2014 do nothing\n if (value && typeof value === 'object' && '__html' in value) {\n el.innerHTML = value.__html ?? '';\n } else {\n if (__DEV__) {\n console.warn(\n '[what] innerHTML received a raw string. This is a security risk (XSS). ' +\n 'Use innerHTML={{ __html: trustedString }} or dangerouslySetInnerHTML={{ __html: trustedString }} instead.'\n );\n }\n // Refuse to set raw string innerHTML \u2014 prevent XSS\n return;\n }\n return;\n }\n\n // Boolean attributes\n if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n return;\n }\n\n // data-* and aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n el.setAttribute(key, value);\n return;\n }\n\n // SVG\n if (isSvg) {\n if (value === false || value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n return;\n }\n\n // Default: property if exists, otherwise attribute\n if (key in el) {\n el[key] = value;\n } else {\n el.setAttribute(key, value);\n }\n}\n", "// What Framework - Fine-Grained Rendering Primitives\n// Solid-style rendering: components run once, signals create individual DOM effects.\n// No VDOM diffing \u2014 direct DOM manipulation with surgical signal-driven updates.\n\nimport { effect, untrack, createRoot, _createItemScope, signal, __DEV__ } from './reactive.js';\nimport { createDOM, disposeTree, getCurrentComponent, getComponentStack } from './dom.js';\n\nexport { effect, untrack };\n\n// --- _$createComponent(Component, props, children) ---\n// Internal compiler target for component instantiation. The compiler emits calls\n// to this function instead of h() \u2014 keeping h() out of compiled output entirely.\n// Merges children into props and delegates to createDOM which calls createComponent.\n\nexport function _$createComponent(Component, props, children) {\n if (children && children.length > 0) {\n const mergedChildren = children.length === 1 ? children[0] : children;\n // Mutate props in place when possible to avoid object spread allocation.\n // Compiled output creates a fresh props object per call, so mutation is safe.\n if (props) {\n props.children = mergedChildren;\n } else {\n props = { children: mergedChildren };\n }\n }\n // Build a VNode-like object and pass to createDOM which handles component execution\n return createDOM({ tag: Component, props: props || {}, children: children || [], key: null, _vnode: true });\n}\n\n// --- URL Sanitization for DOM attributes ---\n// Rejects javascript:, data:, vbscript: protocols (case-insensitive, trimmed).\n\nconst URL_ATTRS = new Set(['href', 'src', 'action', 'formaction', 'formAction']);\n\nfunction isSafeUrl(url) {\n if (typeof url !== 'string') return true; // non-string values are not URL-injection risks\n const normalized = url.trim().replace(/[\\s\\x00-\\x1f]/g, '').toLowerCase();\n if (normalized.startsWith('javascript:')) return false;\n if (normalized.startsWith('data:')) return false;\n if (normalized.startsWith('vbscript:')) return false;\n return true;\n}\n\n// --- template(html) ---\n// Pre-parse HTML string into a <template> element. Returns a factory function\n// that clones the DOM tree via cloneNode(true) \u2014 2-5x faster than createElement chains.\n// INTERNAL: Used by the compiler. Not intended for direct use by application code.\n// Exported as both `template` (for compiler output) and `_template` (to signal internal use).\n\n// Table child elements that need special parent wrapping for innerHTML parsing.\n// Browsers auto-correct bare <tr>, <td>, etc. when orphaned \u2014 wrapping prevents silent drops.\nconst TABLE_WRAPPERS = {\n tr: { depth: 2, wrap: '<table><tbody>', unwrap: '</tbody></table>' },\n td: { depth: 3, wrap: '<table><tbody><tr>', unwrap: '</tr></tbody></table>' },\n th: { depth: 3, wrap: '<table><tbody><tr>', unwrap: '</tr></tbody></table>' },\n thead: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n tbody: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n tfoot: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n colgroup: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n col: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n caption: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n};\n\n// SVG element tags that must be created in an SVG namespace context.\nconst SVG_ELEMENTS = new Set([\n 'svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'ellipse',\n 'g', 'defs', 'use', 'text', 'tspan', 'foreignObject', 'clipPath', 'mask',\n 'pattern', 'linearGradient', 'radialGradient', 'stop', 'marker', 'symbol',\n 'image', 'animate', 'animateTransform', 'animateMotion', 'set',\n 'filter', 'feGaussianBlur', 'feOffset', 'feMerge', 'feMergeNode',\n 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',\n 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feFlood', 'feImage', 'feMorphology', 'feSpecularLighting',\n 'feTile', 'feTurbulence', 'feDistantLight', 'fePointLight', 'feSpotLight',\n]);\n\nfunction getLeadingTag(html) {\n const m = html.match(/^<([a-zA-Z][a-zA-Z0-9]*)/);\n return m ? m[1] : '';\n}\n\n// Internal implementation \u2014 no warnings. Used by compiler via _$template.\nfunction _$templateImpl(html) {\n const trimmed = html.trim();\n const tag = getLeadingTag(trimmed);\n\n // SVG namespace: parse inside an SVG container then extract\n if (SVG_ELEMENTS.has(tag)) {\n return svgTemplate(trimmed);\n }\n\n // Table element wrapping: parse inside proper table parent then extract\n const tableInfo = TABLE_WRAPPERS[tag];\n if (tableInfo) {\n const t = document.createElement('template');\n t.innerHTML = tableInfo.wrap + trimmed + tableInfo.unwrap;\n // Pre-navigate to the target element once \u2014 avoids per-clone traversal.\n let target = t.content.firstChild;\n for (let i = 0; i < tableInfo.depth; i++) target = target.firstChild;\n return () => target.cloneNode(true);\n }\n\n const t = document.createElement('template');\n t.innerHTML = trimmed;\n return () => t.content.firstChild.cloneNode(true);\n}\n\n// Public export \u2014 warns in dev mode that this is a compiler internal.\n// Application code should use JSX, which the compiler transforms into _$template calls.\nlet _templateWarned = false;\nexport function template(html) {\n if (__DEV__ && !_templateWarned) {\n _templateWarned = true;\n console.warn(\n '[what] template() is a compiler internal. Use JSX instead. ' +\n 'Direct calls with user input can lead to XSS vulnerabilities.'\n );\n }\n return _$templateImpl(html);\n}\n\n// Compiler-internal alias \u2014 preferred name for compiled output (no warning)\nexport { _$templateImpl as _$template };\n\n// Legacy alias kept for backwards compat\nexport { template as _template };\n\n// --- svgTemplate(html) ---\n// Parse SVG content inside an SVG namespace container. Without this, innerHTML on a\n// <template> element creates HTML-namespace nodes, making SVG elements invisible.\n// If the HTML is a complete <svg> tag, it is parsed inside a temporary <div> so the\n// browser uses the correct SVG namespace. For inner SVG elements (path, circle, etc.),\n// they are wrapped in an <svg> container for parsing and then extracted.\n\nexport function svgTemplate(html) {\n const trimmed = html.trim();\n const tag = getLeadingTag(trimmed);\n\n if (tag === 'svg') {\n // Complete <svg> element \u2014 parse in a div (browsers handle the namespace)\n const t = document.createElement('template');\n t.innerHTML = trimmed;\n return () => t.content.firstChild.cloneNode(true);\n }\n\n // Inner SVG element (path, circle, g, etc.) \u2014 wrap in <svg> for namespace context\n const t = document.createElement('template');\n t.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\">${trimmed}</svg>`;\n return () => t.content.firstChild.firstChild.cloneNode(true);\n}\n\n// --- insert(parent, child, marker?) ---\n// Reactive child insertion. Handles all child types:\n// - string/number \u2192 text node\n// - function \u2192 effect that updates text node reactively\n// - DOM node \u2192 append directly\n// - array \u2192 insert each element\n\nexport function insert(parent, child, marker) {\n if (typeof child === 'function') {\n // Fast path: if the first evaluation returns a string/number, optimistically\n // create a text node for direct updates. If the value type changes later\n // (e.g., text -> vnode), fall back to full reconcileInsert.\n const first = child();\n const t = typeof first;\n if (t === 'string' || t === 'number') {\n const textNode = document.createTextNode(String(first));\n const m = marker || null;\n if (m) parent.insertBefore(textNode, m);\n else parent.appendChild(textNode);\n let current = textNode;\n let isTextFastPath = true;\n effect(() => {\n const val = child();\n const vt = typeof val;\n if (isTextFastPath && (vt === 'string' || vt === 'number')) {\n // Fast path: still text \u2014 update data directly (no allocations)\n const str = String(val);\n if (textNode.data !== str) textNode.data = str;\n } else {\n // Type changed \u2014 fall back to full reconcile\n isTextFastPath = false;\n current = reconcileInsert(parent, val, current, m);\n }\n });\n return textNode;\n }\n // General path for non-text reactive children (first value was null/vnode/array)\n let current = first != null ? reconcileInsert(parent, first, null, marker || null) : null;\n effect(() => {\n current = reconcileInsert(parent, child(), current, marker || null);\n });\n return current;\n }\n\n // Static text: create text node directly, skip reconcileInsert overhead\n if (typeof child === 'string' || typeof child === 'number') {\n const textNode = document.createTextNode(String(child));\n if (marker) parent.insertBefore(textNode, marker);\n else parent.appendChild(textNode);\n return textNode;\n }\n\n // Static DOM node: insert directly, skip reconcileInsert overhead\n if (child != null && typeof child === 'object' && child.nodeType > 0) {\n if (marker) parent.insertBefore(child, marker);\n else parent.appendChild(child);\n return child;\n }\n\n return reconcileInsert(parent, child, null, marker || null);\n}\n\nfunction isDomNode(value) {\n if (!value || typeof value !== 'object') return false;\n if (typeof Node !== 'undefined' && value instanceof Node) return true;\n return typeof value.nodeType === 'number' && typeof value.nodeName === 'string';\n}\n\nfunction isVNode(value) {\n return !!value && typeof value === 'object' && (value._vnode === true || 'tag' in value);\n}\n\n// Check if parent is an SVG element. Cached typeof check avoids repeated lookups.\nconst _hasSVGElement = typeof SVGElement !== 'undefined';\nfunction isSvgParent(parent) {\n return _hasSVGElement\n && parent instanceof SVGElement\n && parent.tagName !== 'foreignObject';\n}\n\nfunction asNodeArray(value) {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction valuesToNodes(value, parent, out) {\n if (value == null || typeof value === 'boolean') return out;\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n valuesToNodes(value[i], parent, out);\n }\n return out;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n out.push(document.createTextNode(String(value)));\n return out;\n }\n\n if (isDomNode(value)) {\n out.push(value);\n return out;\n }\n\n if (isVNode(value)) {\n out.push(createDOM(value, parent, isSvgParent(parent)));\n return out;\n }\n\n out.push(document.createTextNode(String(value)));\n return out;\n}\n\nfunction sameNodeArray(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction reconcileInsert(parent, value, current, marker) {\n // Guard: parent must be a node that supports child operations.\n // This catches cases where a stale DOM reference (e.g., a comment node from\n // shifted childNodes indices) is mistakenly passed as the parent.\n if (!parent || typeof parent.insertBefore !== 'function') {\n if (__DEV__) {\n console.warn('[what] reconcileInsert called with invalid parent:', parent);\n }\n return current;\n }\n\n const targetMarker = marker || null;\n\n if (value == null || typeof value === 'boolean') {\n const oldNodes = asNodeArray(current);\n for (let i = 0; i < oldNodes.length; i++) {\n const oldNode = oldNodes[i];\n if (oldNode.parentNode === parent) {\n disposeTree(oldNode);\n parent.removeChild(oldNode);\n }\n }\n return null;\n }\n\n if ((typeof value === 'string' || typeof value === 'number')\n && current && !Array.isArray(current) && current.nodeType === 3) {\n const text = String(value);\n if (current.data !== text) current.data = text;\n return current;\n }\n\n // Fast path: single DOM node value with single current node \u2014 skip array allocations\n if (typeof value === 'object' && value !== null && value.nodeType > 0 && !Array.isArray(value)) {\n if (value === current) return current;\n if (current && !Array.isArray(current) && current.nodeType > 0) {\n // Replace single node with single node\n if (current.parentNode === parent) {\n disposeTree(current);\n parent.replaceChild(value, current);\n } else {\n if (targetMarker) parent.insertBefore(value, targetMarker);\n else parent.appendChild(value);\n }\n return value;\n }\n }\n\n const newNodes = valuesToNodes(value, parent, []);\n const oldNodes = asNodeArray(current);\n\n if (sameNodeArray(oldNodes, newNodes)) {\n return current;\n }\n\n // Remove old nodes not in the new set. For small arrays (typical case),\n // linear scan is faster than Set allocation + hashing.\n const newLen = newNodes.length;\n for (let i = 0; i < oldNodes.length; i++) {\n const oldNode = oldNodes[i];\n if (oldNode.parentNode !== parent) continue;\n let found = false;\n for (let j = 0; j < newLen; j++) {\n if (newNodes[j] === oldNode) { found = true; break; }\n }\n if (!found) {\n disposeTree(oldNode);\n parent.removeChild(oldNode);\n }\n }\n\n let ref = targetMarker;\n for (let i = newNodes.length - 1; i >= 0; i--) {\n const node = newNodes[i];\n if (node.parentNode !== parent || node.nextSibling !== ref) {\n // Guard against stale ref from nested reconciliation\n if (ref && ref.parentNode !== parent) ref = null;\n if (ref) parent.insertBefore(node, ref);\n else parent.appendChild(node);\n }\n ref = node;\n }\n\n if (newNodes.length === 0) return null;\n return newNodes.length === 1 ? newNodes[0] : newNodes;\n}\n\n// --- mapArray(source, mapFn, options?) ---\n// Reactive list rendering with per-item scopes.\n// Unkeyed: tracks items by reference. Keyed: tracks by key function.\n// With key + raw: mapFn receives (item, index) \u2014 raw item value. Items identified by key for\n// efficient DOM reuse/moves. Use when items have per-field signals (no wrapper needed).\n// With key (no raw): mapFn receives (itemAccessor, index) \u2014 accessor is a signal getter.\n// When item reference changes but key persists, the signal updates in place.\n// Without key: mapFn receives (item, index) \u2014 raw item value. New reference = new row.\n\nexport function mapArray(source, mapFn, options) {\n const keyFn = options?.key;\n const raw = options?.raw || false;\n\n return (parent, marker) => {\n let items = [];\n let mappedNodes = [];\n let disposeFns = [];\n // Keyed mode state: key \u2192 { itemSignal }. Null for raw/unkeyed modes.\n let keyedState = keyFn && !raw ? new Map() : null;\n\n const endMarker = document.createComment('/list');\n parent.insertBefore(endMarker, marker || null);\n\n effect(() => {\n const newItems = source() || [];\n if (keyFn) {\n reconcileKeyed(parent, endMarker, items, newItems, mappedNodes, disposeFns, mapFn, keyFn, keyedState);\n } else {\n reconcileList(parent, endMarker, items, newItems, mappedNodes, disposeFns, mapFn);\n }\n // Save a snapshot of items for next diff. Use slice() to defend against\n // in-place mutation, but skip for empty arrays (common clear case).\n items = newItems.length > 0 ? newItems.slice() : newItems;\n });\n\n return endMarker;\n };\n}\n\nfunction reconcileList(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns, mapFn) {\n const newLen = newItems.length;\n const oldLen = oldItems.length;\n\n if (newLen === 0) {\n // Fast path: clear all \u2014 dispose reactive scopes first (handles effects/cleanups),\n // then remove DOM nodes. createRoot disposal handles all tracked effects; we only\n // need disposeTree for nodes with additional reactive bindings outside createRoot.\n if (oldLen > 0) {\n for (let i = 0; i < oldLen; i++) {\n if (disposeFns[i]) disposeFns[i]();\n }\n for (let i = oldLen - 1; i >= 0; i--) {\n const node = mappedNodes[i];\n if (node) {\n // Only walk subtree if the node has reactive state not tracked by createRoot\n if (node._componentCtx || node._dispose || node._propEffects) {\n disposeTree(node);\n }\n if (node.parentNode === parent) parent.removeChild(node);\n }\n }\n mappedNodes.length = 0;\n disposeFns.length = 0;\n }\n return;\n }\n\n if (oldLen === 0) {\n // Fast path: all new\n const frag = document.createDocumentFragment();\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const node = _createItemScope(dispose => {\n disposeFns[i] = dispose;\n return mapFn(item, i);\n });\n mappedNodes[i] = node;\n frag.appendChild(node);\n }\n parent.insertBefore(frag, endMarker);\n return;\n }\n\n // --- Common prefix/suffix skip ---\n let start = 0;\n const minLen = Math.min(oldLen, newLen);\n while (start < minLen && oldItems[start] === newItems[start]) start++;\n\n // If everything matches and same length, nothing changed\n if (start === oldLen && start === newLen) return;\n\n let oldEnd = oldLen - 1;\n let newEnd = newLen - 1;\n while (oldEnd >= start && newEnd >= start && oldItems[oldEnd] === newItems[newEnd]) {\n oldEnd--;\n newEnd--;\n }\n\n // Copy prefix/suffix into output arrays\n const newMapped = new Array(newLen);\n const newDispose = new Array(newLen);\n for (let i = 0; i < start; i++) {\n newMapped[i] = mappedNodes[i];\n newDispose[i] = disposeFns[i];\n }\n for (let i = newEnd + 1; i < newLen; i++) {\n // Suffix items: same item, possibly different index offset\n const oldI = oldEnd + 1 + (i - newEnd - 1);\n newMapped[i] = mappedNodes[oldI];\n newDispose[i] = disposeFns[oldI];\n }\n\n // Only reconcile the middle section: start..newEnd (new) vs start..oldEnd (old)\n const midNewLen = newEnd - start + 1;\n const midOldLen = oldEnd - start + 1;\n\n if (midNewLen === 0) {\n // Only removals in the middle\n for (let i = start; i <= oldEnd; i++) {\n disposeFns[i]?.();\n if (mappedNodes[i]?.parentNode) mappedNodes[i].parentNode.removeChild(mappedNodes[i]);\n }\n } else if (midOldLen === 0) {\n // Only insertions in the middle\n const marker = start < newLen && newMapped[newEnd + 1] ? newMapped[newEnd + 1] : endMarker;\n const frag = document.createDocumentFragment();\n for (let i = start; i <= newEnd; i++) {\n const item = newItems[i];\n const idx = i;\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(item, idx);\n });\n frag.appendChild(newMapped[i]);\n }\n parent.insertBefore(frag, marker);\n } else {\n // General case: reconcile middle section with LIS\n _reconcileMiddle(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns,\n mapFn, start, oldEnd, newEnd, newMapped, newDispose);\n }\n\n // Update arrays in place\n mappedNodes.length = newLen;\n disposeFns.length = newLen;\n for (let i = 0; i < newLen; i++) {\n mappedNodes[i] = newMapped[i];\n disposeFns[i] = newDispose[i];\n }\n}\n\nfunction _reconcileMiddle(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns,\n mapFn, start, oldEnd, newEnd, newMapped, newDispose) {\n // Build index map only for the middle section\n const oldIdxMap = new Map();\n for (let i = start; i <= oldEnd; i++) {\n oldIdxMap.set(oldItems[i], i);\n }\n\n // Match old items to new positions, collect old indices for LIS\n const midLen = newEnd - start + 1;\n const oldIndices = new Int32Array(midLen); // -1 = new item\n oldIndices.fill(-1);\n\n for (let i = start; i <= newEnd; i++) {\n const oldIdx = oldIdxMap.get(newItems[i]);\n if (oldIdx !== undefined) {\n oldIdxMap.delete(newItems[i]);\n newMapped[i] = mappedNodes[oldIdx];\n newDispose[i] = disposeFns[oldIdx];\n oldIndices[i - start] = oldIdx;\n }\n }\n\n // Dispose removed items\n for (const [, oldIdx] of oldIdxMap) {\n disposeFns[oldIdx]?.();\n if (mappedNodes[oldIdx]?.parentNode) mappedNodes[oldIdx].parentNode.removeChild(mappedNodes[oldIdx]);\n }\n\n // Compute LIS on old indices of reused items\n // Build the sequence of old indices for reused items only\n const reusedCount = midLen - _countNeg1(oldIndices, midLen);\n\n // Use a bitfield (via Uint8Array) to mark LIS positions \u2014 avoids Set overhead\n const inLIS = new Uint8Array(midLen);\n\n if (reusedCount > 1) {\n const seq = new Int32Array(reusedCount);\n const seqToMid = new Int32Array(reusedCount); // maps seq index \u2192 mid index\n let k = 0;\n for (let i = 0; i < midLen; i++) {\n if (oldIndices[i] !== -1) {\n seq[k] = oldIndices[i];\n seqToMid[k] = i;\n k++;\n }\n }\n const lisResult = _lis(seq, reusedCount);\n for (let i = 0; i < lisResult.length; i++) {\n inLIS[seqToMid[lisResult[i]]] = 1;\n }\n } else if (reusedCount === 1) {\n // Single reused item is trivially in LIS\n for (let i = 0; i < midLen; i++) {\n if (oldIndices[i] !== -1) { inLIS[i] = 1; break; }\n }\n }\n\n // Create new items\n for (let i = start; i <= newEnd; i++) {\n if (!newMapped[i]) {\n const item = newItems[i];\n const idx = i;\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(item, idx);\n });\n }\n }\n\n // Position: work backwards from the item after newEnd (suffix start or endMarker)\n let nextSibling = newEnd + 1 < newMapped.length && newMapped[newEnd + 1]\n ? newMapped[newEnd + 1] : endMarker;\n\n for (let i = newEnd; i >= start; i--) {\n const mi = i - start;\n if (oldIndices[mi] === -1 || !inLIS[mi]) {\n // New item or moved item \u2014 insert\n // Guard against stale nextSibling from nested reconciliation\n if (nextSibling && nextSibling.parentNode !== parent) nextSibling = endMarker;\n parent.insertBefore(newMapped[i], nextSibling);\n }\n nextSibling = newMapped[i];\n }\n}\n\nfunction _countNeg1(arr, len) {\n let c = 0;\n for (let i = 0; i < len; i++) if (arr[i] === -1) c++;\n return c;\n}\n\n// Longest Increasing Subsequence \u2014 returns indices into the input array.\n// O(n log n) using patience sorting. Uses typed arrays for performance.\nfunction _lis(arr, len) {\n if (len === 0) return [];\n if (len === 1) return [0];\n\n const tails = new Int32Array(len); // indices into arr\n const predecessors = new Int32Array(len);\n let tailLen = 1;\n tails[0] = 0;\n predecessors[0] = -1;\n\n for (let i = 1; i < len; i++) {\n if (arr[i] > arr[tails[tailLen - 1]]) {\n predecessors[i] = tails[tailLen - 1];\n tails[tailLen++] = i;\n } else {\n let lo = 0, hi = tailLen - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (arr[tails[mid]] < arr[i]) lo = mid + 1;\n else hi = mid;\n }\n tails[lo] = i;\n predecessors[i] = lo > 0 ? tails[lo - 1] : -1;\n }\n }\n\n const result = new Array(tailLen);\n let k = tails[tailLen - 1];\n for (let i = tailLen - 1; i >= 0; i--) {\n result[i] = k;\n k = predecessors[k];\n }\n return result;\n}\n\n// --- reconcileKeyed ---\n// Keyed reconciliation: tracks items by key function, not by reference.\n// When a key persists but its item reference changes, the item signal updates\n// in place \u2014 no DOM node destruction/creation. Only effects reading the\n// item accessor re-run (e.g., textContent update for changed label).\n\nfunction reconcileKeyed(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns, mapFn, keyFn, keyedState) {\n const newLen = newItems.length;\n const oldLen = oldItems.length;\n\n // --- Fast path: clear all ---\n if (newLen === 0) {\n if (oldLen > 0) {\n // Dispose reactive scopes first, then remove DOM nodes.\n for (let i = 0; i < oldLen; i++) {\n if (disposeFns[i]) disposeFns[i]();\n }\n for (let i = oldLen - 1; i >= 0; i--) {\n const node = mappedNodes[i];\n if (node) {\n if (node._componentCtx || node._dispose || node._propEffects) {\n disposeTree(node);\n }\n if (node.parentNode === parent) parent.removeChild(node);\n }\n }\n mappedNodes.length = 0;\n disposeFns.length = 0;\n if (keyedState) keyedState.clear();\n }\n return;\n }\n\n // --- Fast path: all new ---\n if (oldLen === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item; // raw mode: pass item directly\n }\n const node = _createItemScope(dispose => {\n disposeFns[idx] = dispose;\n return mapFn(accessor, idx);\n });\n mappedNodes[i] = node;\n frag.appendChild(node);\n }\n parent.insertBefore(frag, endMarker);\n return;\n }\n\n // --- Common prefix: skip matching keys at the start ---\n let start = 0;\n const minLen = Math.min(oldLen, newLen);\n while (start < minLen) {\n // Fast path: same reference \u2192 same key, no update needed\n if (oldItems[start] === newItems[start]) { start++; continue; }\n const oldKey = keyFn(oldItems[start]);\n const newKey = keyFn(newItems[start]);\n if (oldKey !== newKey) break;\n // Key matches but reference changed \u2014 update signal (non-raw mode only)\n if (keyedState) keyedState.get(oldKey).itemSig.set(newItems[start]);\n start++;\n }\n\n // --- Common suffix: skip matching keys at the end ---\n let oldEnd = oldLen - 1;\n let newEnd = newLen - 1;\n while (oldEnd >= start && newEnd >= start) {\n if (oldItems[oldEnd] === newItems[newEnd]) { oldEnd--; newEnd--; continue; }\n const oldKey = keyFn(oldItems[oldEnd]);\n const newKey = keyFn(newItems[newEnd]);\n if (oldKey !== newKey) break;\n if (keyedState) keyedState.get(oldKey).itemSig.set(newItems[newEnd]);\n oldEnd--;\n newEnd--;\n }\n\n // If everything matched, nothing to do\n if (start > oldEnd && start > newEnd) {\n // Just copy existing mappings to output\n return;\n }\n\n // Copy prefix/suffix into output arrays\n const newMapped = new Array(newLen);\n const newDispose = new Array(newLen);\n for (let i = 0; i < start; i++) {\n newMapped[i] = mappedNodes[i];\n newDispose[i] = disposeFns[i];\n }\n for (let i = newEnd + 1; i < newLen; i++) {\n const oldI = oldEnd + 1 + (i - newEnd - 1);\n newMapped[i] = mappedNodes[oldI];\n newDispose[i] = disposeFns[oldI];\n }\n\n const midNewLen = newEnd - start + 1;\n const midOldLen = oldEnd - start + 1;\n\n // --- Only additions in middle ---\n if (midOldLen === 0) {\n const marker = newEnd + 1 < newLen && newMapped[newEnd + 1] ? newMapped[newEnd + 1] : endMarker;\n const frag = document.createDocumentFragment();\n for (let i = start; i <= newEnd; i++) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item;\n }\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(accessor, idx);\n });\n frag.appendChild(newMapped[i]);\n }\n parent.insertBefore(frag, marker);\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n return;\n }\n\n // --- Only removals in middle ---\n if (midNewLen === 0) {\n for (let i = start; i <= oldEnd; i++) {\n disposeFns[i]?.();\n if (mappedNodes[i]?.parentNode) parent.removeChild(mappedNodes[i]);\n if (keyedState) keyedState.delete(keyFn(oldItems[i]));\n }\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n return;\n }\n\n // --- General case: reconcile middle section ---\n // Build old key \u2192 old index map for middle section only\n const oldKeyMap = new Map();\n for (let i = start; i <= oldEnd; i++) {\n oldKeyMap.set(keyFn(oldItems[i]), i);\n }\n\n const oldIndices = new Int32Array(midNewLen);\n oldIndices.fill(-1);\n\n // Match by key\n for (let i = start; i <= newEnd; i++) {\n const key = keyFn(newItems[i]);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldKeyMap.delete(key);\n newMapped[i] = mappedNodes[oldIdx];\n newDispose[i] = disposeFns[oldIdx];\n oldIndices[i - start] = oldIdx;\n // Update item signal if reference changed (non-raw mode only)\n if (keyedState && newItems[i] !== oldItems[oldIdx]) {\n keyedState.get(key).itemSig.set(newItems[i]);\n }\n }\n }\n\n // Dispose removed items\n for (const [key, oldIdx] of oldKeyMap) {\n disposeFns[oldIdx]?.();\n if (mappedNodes[oldIdx]?.parentNode) parent.removeChild(mappedNodes[oldIdx]);\n if (keyedState) keyedState.delete(key);\n }\n\n // Create new items\n for (let i = start; i <= newEnd; i++) {\n if (!newMapped[i]) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item;\n }\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(accessor, idx);\n });\n }\n }\n\n // Position using LIS\n // First check: are reused items already in order? (common for update-in-place)\n let reusedCount = 0;\n let alreadySorted = true;\n let lastOldIdx = -1;\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedCount++;\n if (oldIndices[i] <= lastOldIdx) alreadySorted = false;\n lastOldIdx = oldIndices[i];\n }\n }\n\n const inLIS = new Uint8Array(midNewLen);\n\n if (alreadySorted) {\n // All reused items are in order \u2014 mark all as in LIS (no moves needed)\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) inLIS[i] = 1;\n }\n } else if (reusedCount > 1) {\n const seq = new Int32Array(reusedCount);\n const seqToMid = new Int32Array(reusedCount);\n let k = 0;\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) {\n seq[k] = oldIndices[i];\n seqToMid[k] = i;\n k++;\n }\n }\n const lisResult = _lis(seq, reusedCount);\n for (let i = 0; i < lisResult.length; i++) {\n inLIS[seqToMid[lisResult[i]]] = 1;\n }\n } else if (reusedCount === 1) {\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) { inLIS[i] = 1; break; }\n }\n }\n\n // Position: work backwards, insert items not in LIS\n let nextSibling = newEnd + 1 < newMapped.length && newMapped[newEnd + 1]\n ? newMapped[newEnd + 1] : endMarker;\n\n for (let i = newEnd; i >= start; i--) {\n const mi = i - start;\n if (oldIndices[mi] === -1 || !inLIS[mi]) {\n // Guard against stale nextSibling from nested reconciliation\n if (nextSibling && nextSibling.parentNode !== parent) nextSibling = endMarker;\n parent.insertBefore(newMapped[i], nextSibling);\n }\n nextSibling = newMapped[i];\n }\n\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n}\n\nfunction _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen) {\n mappedNodes.length = newLen;\n disposeFns.length = newLen;\n for (let i = 0; i < newLen; i++) {\n mappedNodes[i] = newMapped[i];\n disposeFns[i] = newDispose[i];\n }\n}\n\n// --- spread(el, props) ---\n// Fine-grained prop effects. Function props create individual effects.\n// Event props use direct assignment.\n\nexport function spread(el, props) {\n for (const key in props) {\n const value = props[key];\n\n if (key.startsWith('on') && key.length > 2) {\n // Event handler \u2014 direct assignment. Use $$name for delegated events.\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value);\n continue;\n }\n\n if (typeof value === 'function' && !key.startsWith('on')) {\n // Reactive prop \u2014 create micro-effect\n if (key === 'class' || key === 'className') {\n effect(() => { el.className = value() || ''; });\n } else if (key === 'style' && typeof value() === 'object') {\n effect(() => {\n const styles = value();\n for (const prop in styles) {\n el.style[prop] = styles[prop] ?? '';\n }\n });\n } else {\n effect(() => { setProp(el, key, value()); });\n }\n } else {\n // Static prop\n setProp(el, key, value);\n }\n }\n}\n\nexport function setProp(el, key, value) {\n // Ref handling \u2014 assign element to ref object/callback (defense in depth)\n if (key === 'ref') {\n if (typeof value === 'function') value(el);\n else if (value && typeof value === 'object') value.current = el;\n return;\n }\n\n // Key prop \u2014 no-op, WhatFW has no virtual DOM (defense in depth, issue #6)\n if (key === 'key') return;\n\n // Sanitize URL attributes \u2014 reject dangerous protocols\n if (URL_ATTRS.has(key) || URL_ATTRS.has(key.toLowerCase())) {\n if (!isSafeUrl(value)) {\n if (typeof console !== 'undefined') {\n console.warn(`[what] Blocked unsafe URL in \"${key}\" attribute: ${value}`);\n }\n return;\n }\n }\n\n if (key === 'class' || key === 'className') {\n el.className = value || '';\n } else if (key === 'dangerouslySetInnerHTML') {\n el.innerHTML = value?.__html ?? '';\n } else if (key === 'innerHTML') {\n if (value && typeof value === 'object' && '__html' in value) {\n el.innerHTML = value.__html ?? '';\n } else {\n // Plain string innerHTML is rejected for security \u2014 use { __html: string } form\n if (typeof console !== 'undefined' && value != null && value !== '') {\n console.warn(\n '[what] Plain string innerHTML is not allowed. Use { __html: \"...\" } or dangerouslySetInnerHTML={{ __html: \"...\" }} instead.'\n );\n }\n // Ignored \u2014 do not set innerHTML from plain string\n }\n } else if (key === 'style') {\n if (typeof value === 'string') {\n el.style.cssText = value;\n } else if (typeof value === 'object') {\n for (const prop in value) {\n el.style[prop] = value[prop] ?? '';\n }\n }\n } else if (key.startsWith('data-') || key.startsWith('aria-')) {\n el.setAttribute(key, value);\n } else if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n } else if (key in el) {\n el[key] = value;\n } else {\n el.setAttribute(key, value);\n }\n}\n\n// --- delegateEvents(eventNames) ---\n// Event delegation: common events handled at document level.\n// Handlers stored as el.$$click, el.$$input, etc.\n// Single listener per event type on document \u2014 reduces listener count from N to 1.\n\nconst delegatedEvents = new Set();\n\nexport function delegateEvents(eventNames) {\n for (const name of eventNames) {\n if (delegatedEvents.has(name)) continue;\n delegatedEvents.add(name);\n\n document.addEventListener(name, (e) => {\n let node = e.target;\n const key = '$$' + name;\n\n // Walk up the DOM tree looking for handlers\n while (node) {\n const handler = node[key];\n if (handler) {\n handler(e);\n if (e.cancelBubble) return;\n }\n node = node.parentNode;\n }\n });\n }\n}\n\n// --- addEventListener helper for non-delegated events ---\nexport function on(el, event, handler) {\n el.addEventListener(event, handler);\n return () => el.removeEventListener(event, handler);\n}\n\n// --- className helper for conditional classes ---\nexport function classList(el, classes) {\n effect(() => {\n for (const name in classes) {\n const value = typeof classes[name] === 'function' ? classes[name]() : classes[name];\n el.classList.toggle(name, !!value);\n }\n });\n}\n\n// =========================================================================\n// DOM Hydration\n// =========================================================================\n// Reuses server-rendered DOM instead of creating new nodes.\n// After hydration is complete, switches to normal rendering for updates.\n\nlet _isHydrating = false;\nlet _hydrationCursor = null;\n\nexport function isHydrating() {\n return _isHydrating;\n}\n\n/**\n * hydrate(vnode, container)\n * Walk existing DOM nodes in `container`, match them against the vnode tree,\n * attach reactive bindings, and skip cloneNode. Once done, switch to normal rendering.\n */\nexport function hydrate(vnode, container) {\n _isHydrating = true;\n _hydrationCursor = { parent: container, index: 0 };\n\n try {\n const result = hydrateNode(vnode, container);\n return result;\n } finally {\n _isHydrating = false;\n _hydrationCursor = null;\n }\n}\n\n/**\n * Claim the next DOM node from the hydration cursor.\n * Returns the existing DOM node or null if none available.\n */\nfunction claimNode(parent) {\n const children = parent.childNodes;\n while (_hydrationCursor.index < children.length) {\n const node = children[_hydrationCursor.index];\n // Skip hydration comment markers\n if (node.nodeType === 8) { // Comment node\n const text = node.textContent;\n if (text === '$' || text === '/$' || text === '[]' || text === '/[]') {\n _hydrationCursor.index++;\n continue;\n }\n }\n _hydrationCursor.index++;\n return node;\n }\n return null;\n}\n\nfunction isDevMode() {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction hydrateNode(vnode, parent) {\n if (vnode == null || typeof vnode === 'boolean') {\n return null;\n }\n\n // Text node\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n const existing = claimNode(parent);\n const text = String(vnode);\n\n if (existing && existing.nodeType === 3) {\n // Reuse text node \u2014 check for mismatch in dev\n if (isDevMode() && existing.textContent !== text) {\n console.warn(\n `[what] Hydration mismatch: expected text \"${text}\", got \"${existing.textContent}\"`\n );\n existing.textContent = text;\n }\n return existing;\n }\n\n // Mismatch: expected text node, got element or nothing\n if (isDevMode()) {\n console.warn(\n `[what] Hydration mismatch: expected text node \"${text}\", got ${existing ? existing.nodeName : 'nothing'}. Falling back to client render.`\n );\n }\n const textNode = document.createTextNode(text);\n if (existing) {\n parent.replaceChild(textNode, existing);\n } else {\n parent.appendChild(textNode);\n }\n return textNode;\n }\n\n // Reactive function child \u2014 attach effect to existing node\n if (typeof vnode === 'function') {\n // Unwrap to get the initial value for hydration\n const initialValue = vnode();\n let current = hydrateNode(initialValue, parent);\n\n // Set up reactive effect for future updates (normal rendering path)\n effect(() => {\n const value = vnode();\n // After hydration, this runs as normal insert\n if (!_isHydrating) {\n current = reconcileInsert(parent, value, current, null);\n }\n });\n return current;\n }\n\n // Array \u2014 hydrate each child\n if (Array.isArray(vnode)) {\n const nodes = [];\n for (const child of vnode) {\n const node = hydrateNode(child, parent);\n if (node) nodes.push(node);\n }\n return nodes.length === 1 ? nodes[0] : nodes;\n }\n\n // VNode \u2014 component or element\n if (typeof vnode === 'object' && vnode._vnode) {\n // Component \u2014 route through component context so hooks work during hydration\n if (typeof vnode.tag === 'function') {\n const componentStack = getComponentStack();\n const Component = vnode.tag;\n const props = vnode.props || {};\n const children = vnode.children || [];\n\n // Set up component context (mirrors createComponent in dom.js)\n const ctx = {\n hooks: [],\n hookIndex: 0,\n effects: [],\n cleanups: [],\n mounted: false,\n disposed: false,\n Component,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _errorBoundary: null,\n };\n\n // Push context so hooks can access it\n componentStack.push(ctx);\n\n let result;\n try {\n const propsChildren = children.length === 0 ? undefined\n : children.length === 1 ? children[0] : children;\n result = Component({ ...props, children: propsChildren });\n } catch (error) {\n componentStack.pop();\n console.error('[what] Error in component during hydration:', Component.name || 'Anonymous', error);\n return null;\n }\n\n componentStack.pop();\n ctx.mounted = true;\n\n // Run onMount callbacks after hydration\n if (ctx._mountCallbacks) {\n queueMicrotask(() => {\n if (ctx.disposed) return;\n for (const fn of ctx._mountCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onMount error:', e); }\n }\n });\n }\n\n return hydrateNode(result, parent);\n }\n\n // Element \u2014 claim existing DOM element\n const existing = claimNode(parent);\n const expectedTag = vnode.tag.toUpperCase();\n\n if (existing && existing.nodeType === 1 && existing.nodeName === expectedTag) {\n // Match! Reuse this element. Apply props/bindings.\n hydrateElementProps(existing, vnode.props || {});\n\n // Hydrate children\n const savedCursor = _hydrationCursor;\n _hydrationCursor = { parent: existing, index: 0 };\n\n const rawInner = vnode.props?.dangerouslySetInnerHTML?.__html;\n if (rawInner == null) {\n for (const child of vnode.children) {\n hydrateNode(child, existing);\n }\n }\n\n _hydrationCursor = savedCursor;\n return existing;\n }\n\n // Mismatch \u2014 fall back to client render for this subtree\n if (isDevMode()) {\n console.warn(\n `[what] Hydration mismatch: expected <${vnode.tag}>, got ${existing ? existing.nodeName : 'nothing'}. Falling back to client render.`\n );\n }\n\n // Create the element from scratch\n const newEl = document.createElement(vnode.tag);\n for (const key in vnode.props || {}) {\n if (key === 'children' || key === 'key') continue;\n setProp(newEl, key, vnode.props[key]);\n }\n for (const child of vnode.children) {\n reconcileInsert(newEl, child, null, null);\n }\n if (existing) {\n parent.replaceChild(newEl, existing);\n } else {\n parent.appendChild(newEl);\n }\n return newEl;\n }\n\n // DOM node \u2014 use directly\n if (isDomNode(vnode)) {\n return vnode;\n }\n\n // Fallback \u2014 create text node\n const textNode = document.createTextNode(String(vnode));\n parent.appendChild(textNode);\n return textNode;\n}\n\n/**\n * Apply props to an existing hydrated element.\n * Attaches event handlers and reactive bindings without re-creating the element.\n */\nfunction hydrateElementProps(el, props) {\n for (const key in props) {\n if (key === 'children' || key === 'key' || key === 'ref') continue;\n if (key === 'dangerouslySetInnerHTML' || key === 'innerHTML') continue;\n\n const value = props[key];\n\n // Event handlers \u2014 always attach (they don't exist in SSR HTML)\n if (key.startsWith('on') && key.length > 2) {\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value);\n continue;\n }\n\n // Delegated events ($$click etc.)\n if (key.startsWith('$$')) {\n el[key] = value;\n continue;\n }\n\n // Reactive props \u2014 set up effects\n if (typeof value === 'function' && !key.startsWith('on')) {\n if (key === 'class' || key === 'className') {\n effect(() => { el.className = value() || ''; });\n } else if (key === 'style' && typeof value() === 'object') {\n effect(() => {\n const styles = value();\n for (const prop in styles) {\n el.style[prop] = styles[prop] ?? '';\n }\n });\n } else {\n effect(() => { setProp(el, key, value()); });\n }\n continue;\n }\n\n // Static props \u2014 skip attributes already set from SSR\n // Only attach non-serializable props or ones that may differ\n if (key === 'data-hk') continue;\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// What Framework - Reactive Primitives\n// Signals + Effects: fine-grained reactivity without virtual DOM overhead\n//\n// Upgrades:\n// - Topological ordering: computed/effects sorted by _level to prevent diamond glitches\n// - Iterative computed evaluation: no recursion, handles 10K+ depth chains\n// - Ownership tree: createRoot children auto-dispose when parent disposes\n// - Performance: cached levels, lazy sort, fast-path notify, minimal allocation\n\n// Dev-mode flag \u2014 build tools can dead-code-eliminate when false\nexport const __DEV__ = typeof process !== 'undefined'\n ? process.env?.NODE_ENV !== 'production'\n : true;\n\n// DevTools hooks \u2014 set by what-devtools when installed.\n// These are no-ops in production (dead-code eliminated with __DEV__).\nexport let __devtools = null;\n\n/** @internal Install devtools hooks. Called by what-devtools. */\nexport function __setDevToolsHooks(hooks) {\n if (__DEV__) __devtools = hooks;\n}\n\nlet currentEffect = null;\nlet currentRoot = null;\nlet currentOwner = null; // Ownership tree: tracks current owner context\nlet insideComputed = false; // Track whether we're inside a computed() callback (dev-mode warning)\nlet batchDepth = 0;\nlet pendingEffects = [];\nlet pendingNeedSort = false; // Track whether pendingEffects actually needs sorting\n\n// Instead of a WeakMap from subscriber Set \u2192 owning computed's inner effect,\n// we store the owner directly on the Set as ._owner (20x faster than WeakMap.get).\n// Signal subscriber Sets have ._owner = undefined (signals are level 0).\n\n// --- Iterative Computed Evaluation State ---\n// Uses a throw/catch trampoline to convert recursive computed evaluation\n// to iterative. When a computed fn() reads another dirty computed, instead\n// of recursing, we throw a sentinel that gets caught by the outer loop.\nconst NEEDS_UPSTREAM = Symbol('needs_upstream');\nlet iterativeEvalStack = null; // array when inside evaluation loop, null otherwise\n\n// --- Signal ---\n// A reactive value. Reading inside an effect auto-tracks the dependency.\n// Writing triggers only the effects that depend on this signal.\n//\n// Performance: signal read is the hottest path in any signal-based framework.\n// Key optimizations:\n// - No rest args (...args) \u2014 uses arguments.length for zero-alloc read path\n// - Subscriber tracking uses lastTracked to skip redundant Set.add/Array.push\n// when the same signal is read multiple times in one effect (common pattern)\n// - Write path uses === first (fast for primitives), falls back to Object.is\n// only for NaN detection\n// - subs.size check avoids notify() call when no subscribers\n\nexport function signal(initial, debugName) {\n let value = initial;\n const subs = new Set();\n // Track the last effect that subscribed \u2014 skip redundant tracking when the\n // same effect reads this signal multiple times (common in template bindings).\n // lastTrackedEpoch tracks the effect's cleanup epoch to detect stale caches.\n let lastTracked = null;\n let lastTrackedEpoch = 0;\n\n // Shared write logic \u2014 inlined via _sigWrite closure to avoid per-call overhead\n // while keeping the sig() function body minimal for V8 optimization.\n function _sigWrite(next) {\n if (__DEV__ && insideComputed) {\n console.warn(\n '[what] Signal.set() called inside a computed function. ' +\n 'This may cause infinite loops. Use effect() instead.' +\n (debugName ? ` (signal: ${debugName})` : '')\n );\n }\n const nextVal = typeof next === 'function' ? next(value) : next;\n // Fast equality: === handles all primitives except NaN.\n // Only fall through for the NaN !== NaN case.\n if (value === nextVal || (value !== value && nextVal !== nextVal)) return;\n value = nextVal;\n // Invalidate lastTracked since value changed \u2014 any effect that reads\n // this signal during re-run needs to re-track.\n lastTracked = null;\n if (__DEV__ && __devtools) __devtools.onSignalUpdate(sig);\n if (subs.size > 0) notify(subs);\n }\n\n // Unified getter/setter: sig() reads, sig(newVal) writes\n // Using arguments.length instead of rest args avoids array allocation on read\n function sig(newVal) {\n if (arguments.length === 0) {\n // Read \u2014 hot path, keep minimal\n const ce = currentEffect;\n if (ce !== null) {\n // Only track if this signal isn't already in the effect's deps.\n // lastTracked is a fast cache for the common case (single effect reading\n // this signal). It's reset to null on write and on cleanup epoch change.\n if (ce !== lastTracked || ce._epoch !== lastTrackedEpoch) {\n lastTracked = ce;\n lastTrackedEpoch = ce._epoch;\n subs.add(ce);\n ce.deps.push(subs);\n }\n }\n return value;\n }\n // Write via sig(newVal)\n _sigWrite(newVal);\n }\n\n sig.set = _sigWrite;\n\n sig.peek = () => value;\n\n sig.subscribe = (fn) => {\n return effect(() => fn(sig()));\n };\n\n sig._signal = true;\n if (__DEV__) {\n sig._subs = subs;\n if (debugName) sig._debugName = debugName;\n }\n\n // Notify devtools of signal creation\n if (__DEV__ && __devtools) __devtools.onSignalCreate(sig);\n\n return sig;\n}\n\n// --- Computed ---\n// Derived signal. Lazy: only recomputes when a dependency changes AND it's read.\n// Topological level: max(dependency levels) + 1, computed from source signals (level 0).\n\nexport function computed(fn) {\n let value, dirty = true;\n const subs = new Set();\n let lastTracked = null;\n let lastTrackedEpoch = 0;\n\n const inner = _createEffect(() => {\n const prevInsideComputed = insideComputed;\n if (__DEV__) insideComputed = true;\n try {\n value = fn();\n dirty = false;\n } finally {\n if (__DEV__) insideComputed = prevInsideComputed;\n }\n }, true);\n\n // Computed nodes start at level 1. Updated when graph structure changes.\n inner._level = 1;\n inner._computed = true;\n inner._computedSubs = subs;\n\n // Register this subscriber set as owned by this computed\n subs._owner = inner;\n\n // Store markDirty/isDirty closures on the inner effect for iterative eval\n inner._markDirty = () => { dirty = true; };\n inner._isDirty = () => dirty;\n\n function read() {\n const ce = currentEffect;\n if (ce !== null) {\n if (ce !== lastTracked || ce._epoch !== lastTrackedEpoch) {\n lastTracked = ce;\n lastTrackedEpoch = ce._epoch;\n subs.add(ce);\n ce.deps.push(subs);\n }\n }\n if (dirty) _evaluateComputed(inner);\n return value;\n }\n\n // When a dependency changes, mark dirty AND propagate to our subscribers.\n inner._onNotify = () => {\n dirty = true;\n lastTracked = null; // Invalidate tracking cache on value change\n if (subs.size > 0) notify(subs);\n };\n\n read._signal = true;\n read.peek = () => {\n if (dirty) _evaluateComputed(inner);\n return value;\n };\n\n return read;\n}\n\n// --- Iterative Computed Evaluation ---\n//\n// Problem: A chain of N dirty computeds causes O(N) recursive calls:\n// C_N.read() \u2192 eval \u2192 fn() \u2192 C_{N-1}.read() \u2192 eval \u2192 fn() \u2192 ... \u2192 C_1.read() \u2192 eval \u2192 fn()\n// This overflows the stack at ~3500 depth.\n//\n// Solution: Throw/catch trampoline. The outermost _evaluateComputed manages a\n// stack (array). When a computed's fn() reads another dirty computed during\n// evaluation, _evaluateComputed throws NEEDS_UPSTREAM. The outer loop catches\n// this, adds the upstream to the stack, and processes from the bottom up.\n// This converts O(N) call depth to O(1) per computed (just the outermost loop).\n\nfunction _evaluateComputed(computedEffect) {\n if (iterativeEvalStack !== null) {\n // We're inside the outermost evaluation loop, and a computed's fn()\n // is reading another dirty computed. Push it onto the stack and throw\n // to abort the current fn() so the outer loop can process it first.\n iterativeEvalStack.push(computedEffect);\n throw NEEDS_UPSTREAM;\n }\n\n // Outermost call \u2014 enter the iterative evaluation loop.\n // The stack grows as we discover dirty upstream computeds.\n const stack = [computedEffect];\n iterativeEvalStack = stack;\n\n try {\n while (stack.length > 0) {\n const current = stack[stack.length - 1];\n\n if (!current._isDirty || !current._isDirty()) {\n // Already clean \u2014 pop and continue\n stack.pop();\n continue;\n }\n\n // Pre-scan known deps: if any are dirty computeds, push them onto\n // the stack first (bottom-up). This avoids the O(N^2) worst case\n // where throw/catch restarts from the top on each dirty upstream.\n let pushedUpstream = false;\n const deps = current.deps;\n for (let i = 0; i < deps.length; i++) {\n const depOwner = deps[i]._owner;\n if (depOwner && depOwner._computed && depOwner._isDirty && depOwner._isDirty()) {\n stack.push(depOwner);\n pushedUpstream = true;\n }\n }\n if (pushedUpstream) {\n // Process dirty upstreams first before re-evaluating current\n continue;\n }\n\n // All known deps are clean \u2014 evaluate. throw/catch is fallback\n // for newly-discovered deps only.\n try {\n const prevDepsLen = current.deps.length;\n _runEffect(current);\n // Only recompute level when graph structure changes\n if (current.deps.length !== prevDepsLen) {\n _updateLevel(current);\n }\n stack.pop(); // Successfully evaluated\n } catch (err) {\n if (err === NEEDS_UPSTREAM) {\n // A dirty upstream was discovered and pushed onto the stack.\n // Re-mark this computed dirty since its fn() was aborted mid-execution.\n current._markDirty();\n // The upstream is now at stack[stack.length-1]. Loop continues.\n } else {\n throw err; // Re-throw real errors\n }\n }\n }\n } finally {\n iterativeEvalStack = null;\n }\n}\n\n// Update the topological level of a computed/effect based on its current dependencies.\nfunction _updateLevel(e) {\n let maxDepLevel = 0;\n const deps = e.deps;\n for (let i = 0; i < deps.length; i++) {\n const owner = deps[i]._owner;\n if (owner) {\n const depLevel = owner._level;\n if (depLevel > maxDepLevel) maxDepLevel = depLevel;\n }\n }\n e._level = maxDepLevel + 1;\n}\n\n// --- Effect ---\n// Runs a function, auto-tracking signal reads. Re-runs when deps change.\n// Returns a dispose function.\n\nexport function effect(fn, opts) {\n const e = _createEffect(fn);\n e._level = 1;\n // First run: skip cleanup (deps is empty), just run and track\n const prev = currentEffect;\n currentEffect = e;\n try {\n const result = e.fn();\n if (typeof result === 'function') e._cleanup = result;\n } finally {\n currentEffect = prev;\n }\n // Compute level after first run based on actual dependencies (cached).\n _updateLevel(e);\n // Mark as stable after first run \u2014 subsequent re-runs skip cleanup/re-subscribe\n if (opts?.stable) e._stable = true;\n const dispose = () => _disposeEffect(e);\n // Register with current root for automatic cleanup\n if (currentRoot) {\n currentRoot.disposals.push(dispose);\n }\n return dispose;\n}\n\n// --- Batch ---\n// Group multiple signal writes; effects run once at the end.\n\nexport function batch(fn) {\n batchDepth++;\n try {\n fn();\n } finally {\n batchDepth--;\n if (batchDepth === 0) flush();\n }\n}\n\n// --- Internals ---\n\nfunction _createEffect(fn, lazy) {\n // Minimal object shape \u2014 computed() adds extra properties after creation.\n // IMPORTANT: V8 optimizes objects with a consistent \"hidden class\" (shape).\n // All properties must be declared upfront even if null \u2014 adding properties\n // later causes shape transitions which deoptimize property access globally.\n const e = {\n fn,\n deps: [], // array of subscriber sets (cheaper than Set for typical 1-3 deps)\n lazy: lazy || false,\n _onNotify: null,\n disposed: false,\n _pending: false,\n _stable: false, // stable effects skip cleanup/re-subscribe on re-run\n _level: 0, // topological depth: signals=0, computed/effects=max(deps)+1\n _computed: false, // true for computed inner effects\n _computedSubs: null, // reference to the computed's subscriber set\n _isDirty: null, // function to check if computed is dirty (set by computed())\n _markDirty: null, // function to mark computed dirty (set by computed())\n _cleanup: null, // cleanup function returned by effect fn (declared upfront for shape)\n _epoch: 0, // incremented on cleanup \u2014 used by signal lastTracked cache\n };\n if (__DEV__ && __devtools) __devtools.onEffectCreate(e);\n return e;\n}\n\nfunction _runEffect(e) {\n if (e.disposed) return;\n\n // Stable effect fast path: deps don't change, skip cleanup/re-subscribe.\n // This is critical for performance: effects like `() => el.className = sig() ? 'a' : ''`\n // always read the same signal(s). After auto-promotion, re-runs skip the O(deps)\n // cleanup + re-subscribe cycle entirely.\n if (e._stable) {\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__) console.warn('[what] Error in effect cleanup:', err);\n }\n e._cleanup = null;\n }\n const prev = currentEffect;\n currentEffect = null; // Don't re-track deps (already subscribed)\n try {\n const result = e.fn();\n if (typeof result === 'function') e._cleanup = result;\n } catch (err) {\n if (__devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n if (__DEV__) console.warn('[what] Error in stable effect:', err);\n } finally {\n currentEffect = prev;\n }\n if (__DEV__ && __devtools?.onEffectRun) __devtools.onEffectRun(e);\n return;\n }\n\n // Save the single dep for auto-stable detection (safe: 1-dep effects\n // have deterministic dep sets \u2014 no conditional reads possible).\n const singleDep = e.deps.length === 1 ? e.deps[0] : null;\n\n cleanup(e);\n // Run effect cleanup from previous run\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect-cleanup', effect: e });\n if (__DEV__) console.warn('[what] Error in effect cleanup:', err);\n }\n e._cleanup = null;\n }\n const prev = currentEffect;\n currentEffect = e;\n try {\n const result = e.fn();\n // Capture cleanup function if returned\n if (typeof result === 'function') {\n e._cleanup = result;\n }\n } catch (err) {\n if (err === NEEDS_UPSTREAM) throw err; // Iterative eval sentinel \u2014 not a real error\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n throw err;\n } finally {\n currentEffect = prev;\n }\n\n // Auto-promote to stable: effects with exactly 1 dep that remains the same\n // after re-run have a fixed dependency graph. Skip cleanup/re-subscribe\n // on future re-runs. This is safe because a single-dep effect can't have\n // conditional signal reads that change which signal is tracked.\n // Guard: don't promote self-triggering effects (those that write to the signal\n // they read, causing re-queuing). Check e._pending to detect this.\n if (singleDep !== null && e.deps.length === 1 && e.deps[0] === singleDep\n && !e._cleanup && !e._pending) {\n e._stable = true;\n }\n\n if (__DEV__ && __devtools?.onEffectRun) __devtools.onEffectRun(e);\n}\n\nfunction _disposeEffect(e) {\n e.disposed = true;\n if (__DEV__ && __devtools) __devtools.onEffectDispose(e);\n cleanup(e);\n // Run cleanup on dispose\n if (e._cleanup) {\n try { e._cleanup(); } catch (err) {\n if (__DEV__) console.warn('[what] Error in effect cleanup on dispose:', err);\n }\n e._cleanup = null;\n }\n}\n\nfunction cleanup(e) {\n const deps = e.deps;\n for (let i = 0; i < deps.length; i++) deps[i].delete(e);\n deps.length = 0;\n // Increment epoch so signals' lastTracked cache is invalidated.\n // This ensures a signal will re-track this effect after cleanup.\n e._epoch++;\n}\n\n// --- Notification ---\n// Iterative notification to prevent stack overflow on deep computed chains.\n// Uses a reusable queue to avoid per-call array allocation.\n// When notify() encounters _onNotify callbacks (from computeds), those may\n// call notify() recursively. The queue drains iteratively in the outermost call.\n\nlet notifyDepth = 0; // Tracks recursive notify depth\nlet notifyQueue = null; // Reusable queue, allocated on first recursive call\nlet notifyQueueLen = 0; // Length of the queue\n\n// Process a single subscriber during notification.\n// Extracted to avoid code duplication between outer and queue drain paths.\nfunction _processSubscriber(e) {\n if (e.disposed) return;\n if (e._onNotify) {\n // Computed subscriber: mark dirty and propagate.\n // _onNotify may call notify() recursively \u2014 tracked by notifyDepth.\n e._onNotify();\n } else if (!e._pending) {\n if (batchDepth === 0 && e._stable) {\n // Inline execution for stable effects \u2014 no pending queue needed\n const prev = currentEffect;\n currentEffect = null;\n try {\n const result = e.fn();\n if (typeof result === 'function') {\n if (e._cleanup) try { e._cleanup(); } catch (err) { /* ignore */ }\n e._cleanup = result;\n }\n } catch (err) {\n if (__DEV__ && __devtools?.onError) __devtools.onError(err, { type: 'effect', effect: e });\n if (__DEV__) console.warn('[what] Error in stable effect:', err);\n } finally {\n currentEffect = prev;\n }\n } else {\n e._pending = true;\n const level = e._level;\n const len = pendingEffects.length;\n if (len > 0 && pendingEffects[len - 1]._level > level) {\n pendingNeedSort = true;\n }\n pendingEffects.push(e);\n }\n }\n}\n\nfunction notify(subs) {\n // Fast path: no recursive notifications in progress \u2014 iterate directly.\n // This avoids array allocation for the common case (signal \u2192 effects).\n if (notifyDepth === 0) {\n notifyDepth = 1;\n try {\n for (const e of subs) {\n _processSubscriber(e);\n }\n // Drain any queued subscriber sets from recursive notify calls\n if (notifyQueueLen > 0) {\n let qi = 0;\n while (qi < notifyQueueLen) {\n const queuedSubs = notifyQueue[qi];\n notifyQueue[qi] = null; // Allow GC\n qi++;\n for (const e of queuedSubs) {\n _processSubscriber(e);\n }\n }\n notifyQueueLen = 0;\n }\n } finally {\n notifyDepth = 0;\n }\n if (batchDepth === 0 && pendingEffects.length > 0) scheduleMicrotask();\n } else {\n // Recursive call \u2014 queue the subscriber set for the outermost call to drain.\n if (notifyQueue === null) notifyQueue = [];\n if (notifyQueueLen >= notifyQueue.length) {\n notifyQueue.push(subs);\n } else {\n notifyQueue[notifyQueueLen] = subs;\n }\n notifyQueueLen++;\n }\n}\n\nlet microtaskScheduled = false;\nfunction scheduleMicrotask() {\n if (!microtaskScheduled) {\n microtaskScheduled = true;\n queueMicrotask(() => {\n microtaskScheduled = false;\n flush();\n });\n }\n}\n\nlet isFlushing = false;\n\nfunction flush() {\n // Re-entrancy guard: if flush() is called during an active flush (e.g., via\n // flushSync() inside a component render or effect), skip to prevent infinite\n // recursion. Pending effects will be picked up by the outer flush's while-loop.\n if (isFlushing) return;\n isFlushing = true;\n\n try {\n let iterations = 0;\n while (pendingEffects.length > 0 && iterations < 25) {\n const batch = pendingEffects;\n pendingEffects = [];\n\n // Topological sort: execute effects in level order (lowest first).\n // Fast paths:\n // 1. Single effect \u2014 no sort needed (most common case for microtask flush)\n // 2. Already sorted \u2014 skip sort (common when effects added in level order)\n // 3. Multiple effects at different levels \u2014 sort required\n if (batch.length > 1 && pendingNeedSort) {\n batch.sort((a, b) => a._level - b._level);\n }\n pendingNeedSort = false;\n\n for (let i = 0; i < batch.length; i++) {\n const e = batch[i];\n e._pending = false;\n if (!e.disposed && !e._onNotify) {\n const prevDepsLen = e.deps.length;\n _runEffect(e);\n // Update level only if deps changed (graph structure change)\n if (!e._computed && e.deps.length !== prevDepsLen) {\n _updateLevel(e);\n }\n }\n }\n iterations++;\n }\n if (iterations >= 25) {\n if (__DEV__) {\n const remaining = pendingEffects.slice(0, 3);\n const effectNames = remaining.map(e => e.fn?.name || e.fn?.toString().slice(0, 60) || '(anonymous)');\n console.warn(\n `[what] Possible infinite effect loop detected (25 iterations). ` +\n `Likely cause: an effect writes to a signal it also reads, creating a cycle. ` +\n `Use untrack() to read signals without subscribing. ` +\n `Looping effects: ${effectNames.join(', ')}`\n );\n } else {\n console.warn('[what] Possible infinite effect loop detected');\n }\n // Clear pending effects AFTER capturing debug info\n for (let i = 0; i < pendingEffects.length; i++) pendingEffects[i]._pending = false;\n pendingEffects.length = 0;\n }\n } finally {\n isFlushing = false;\n }\n}\n\n// --- Memo ---\n// Eager computed that only propagates when the value actually changes.\n// Fix: Instead of calling notify(subs) inline (which bypasses topological sort\n// and causes diamond-dependency glitches), push memo subscribers into\n// pendingEffects and let them go through the sorted flush() path.\nexport function memo(fn) {\n let value;\n const subs = new Set();\n\n const e = _createEffect(() => {\n const next = fn();\n if (!Object.is(value, next)) {\n value = next;\n // Push subscribers into pendingEffects for topological flush\n // instead of inline notify() which can cause diamond glitches\n for (const sub of subs) {\n if (sub.disposed) continue;\n if (sub._onNotify) {\n // Computed subscriber: mark dirty and propagate\n sub._onNotify();\n } else if (!sub._pending) {\n sub._pending = true;\n const level = sub._level;\n const len = pendingEffects.length;\n if (len > 0 && pendingEffects[len - 1]._level > level) {\n pendingNeedSort = true;\n }\n pendingEffects.push(sub);\n }\n }\n }\n });\n\n e._level = 1;\n\n _runEffect(e);\n _updateLevel(e);\n\n // Register subscriber set owner for level tracking\n subs._owner = e;\n\n // Register with current root\n if (currentRoot) {\n currentRoot.disposals.push(() => _disposeEffect(e));\n }\n\n function read() {\n if (currentEffect) {\n subs.add(currentEffect);\n currentEffect.deps.push(subs);\n }\n return value;\n }\n\n read._signal = true;\n read.peek = () => value;\n return read;\n}\n\n// --- flushSync ---\n// Force all pending effects to run synchronously. Use sparingly.\n// Calling during render or effect execution is a no-op (prevents infinite loops).\nexport function flushSync() {\n if (isFlushing) {\n // Re-entrant call \u2014 silently skip (Solid approach).\n // This prevents infinite loops when flushSync() is called during component\n // render or effect execution. Pending effects will be picked up by the\n // outer flush's while-loop.\n if (__DEV__) {\n console.warn(\n '[what] flushSync() called during an active flush (e.g., inside a component render or effect). ' +\n 'This is a no-op to prevent infinite loops. Move flushSync() to an event handler or onMount callback.'\n );\n }\n return;\n }\n if (currentEffect) {\n // Called inside an effect/render \u2014 skip with warning\n if (__DEV__) {\n console.warn(\n '[what] flushSync() called during effect execution. ' +\n 'This is a no-op to prevent infinite loops. Move flushSync() to an event handler or onMount callback.'\n );\n }\n return;\n }\n microtaskScheduled = false;\n flush();\n}\n\n// --- Untrack ---\n// Read signals without subscribing\nexport function untrack(fn) {\n const prev = currentEffect;\n currentEffect = null;\n try {\n return fn();\n } finally {\n currentEffect = prev;\n }\n}\n\n// --- getOwner / runWithOwner ---\n// Expose ownership context for advanced use cases (e.g., async operations\n// that need to register disposals with the correct owner).\n\nexport function getOwner() {\n return currentOwner;\n}\n\nexport function runWithOwner(owner, fn) {\n const prev = currentOwner;\n const prevRoot = currentRoot;\n currentOwner = owner;\n currentRoot = owner;\n try {\n return fn();\n } finally {\n currentOwner = prev;\n currentRoot = prevRoot;\n }\n}\n\n// --- createRoot ---\n// Isolated reactive scope with ownership tree.\n// All effects created inside are tracked and disposed together.\n// Child createRoot scopes register with parent owner \u2014 disposing parent\n// automatically disposes all children (prevents orphaned subscriptions).\nexport function createRoot(fn) {\n const prevRoot = currentRoot;\n const prevOwner = currentOwner;\n const root = {\n disposals: [],\n owner: currentOwner, // parent owner for ownership tree\n children: [], // child roots (ownership tree)\n _disposed: false,\n };\n\n // Register this root as a child of the parent owner\n if (currentOwner) {\n currentOwner.children.push(root);\n }\n\n currentRoot = root;\n currentOwner = root;\n\n try {\n const dispose = () => {\n if (root._disposed) return;\n root._disposed = true;\n\n // Dispose children first (depth-first, reverse order)\n for (let i = root.children.length - 1; i >= 0; i--) {\n _disposeRoot(root.children[i]);\n }\n root.children.length = 0;\n\n // Dispose own effects (reverse order for LIFO cleanup)\n for (let i = root.disposals.length - 1; i >= 0; i--) {\n root.disposals[i]();\n }\n root.disposals.length = 0;\n\n // Remove from parent's children list\n if (root.owner) {\n const idx = root.owner.children.indexOf(root);\n if (idx >= 0) root.owner.children.splice(idx, 1);\n }\n };\n return fn(dispose);\n } finally {\n currentRoot = prevRoot;\n currentOwner = prevOwner;\n }\n}\n\n// Internal: dispose a root and all its children\nfunction _disposeRoot(root) {\n if (root._disposed) return;\n root._disposed = true;\n\n // Dispose children first\n for (let i = root.children.length - 1; i >= 0; i--) {\n _disposeRoot(root.children[i]);\n }\n root.children.length = 0;\n\n // Dispose own effects\n for (let i = root.disposals.length - 1; i >= 0; i--) {\n root.disposals[i]();\n }\n root.disposals.length = 0;\n}\n\n// --- _createItemScope ---\n// Lightweight reactive scope for list items. Unlike createRoot, this does NOT\n// register with the parent ownership tree (saves ~40% allocation overhead).\n// Used by mapArray where disposal is managed explicitly by the list reconciler.\nexport function _createItemScope(fn) {\n const prevRoot = currentRoot;\n const prevOwner = currentOwner;\n const scope = {\n disposals: [],\n owner: null, // No parent registration\n children: [], // Kept for compat with effects that create sub-roots\n _disposed: false,\n };\n\n currentRoot = scope;\n currentOwner = scope;\n\n try {\n const dispose = () => {\n if (scope._disposed) return;\n scope._disposed = true;\n // Dispose children\n for (let i = scope.children.length - 1; i >= 0; i--) {\n _disposeRoot(scope.children[i]);\n }\n scope.children.length = 0;\n // Dispose own effects\n for (let i = scope.disposals.length - 1; i >= 0; i--) {\n scope.disposals[i]();\n }\n scope.disposals.length = 0;\n };\n return fn(dispose);\n } finally {\n currentRoot = prevRoot;\n currentOwner = prevOwner;\n }\n}\n\n// --- onCleanup ---\n// Register a cleanup function with the current owner/root.\n// Runs when the owner is disposed.\nexport function onCleanup(fn) {\n if (currentRoot) {\n currentRoot.disposals.push(fn);\n }\n}\n", "// What Framework - Component Utilities\n// memo, lazy, Suspense, ErrorBoundary\n\nimport { h } from './h.js';\nimport { signal, effect, untrack, __DEV__ } from './reactive.js';\n\n// Legacy errorBoundaryStack removed \u2014 tree-based resolution via _parentCtx._errorBoundary\n// is now the only mechanism. See reportError() below.\n\n// --- memo ---\n// In the run-once model, components execute exactly once and never re-render.\n// Signals update the DOM directly via fine-grained effects. Therefore, memo()\n// is a no-op identity wrapper \u2014 there is no re-render to skip.\n// Kept for API compatibility with React-style code.\n\nexport function memo(Component, _areEqual) {\n // No-op in run-once model \u2014 just return the component as-is\n const MemoWrapper = function MemoWrapper(props) {\n return Component(props);\n };\n MemoWrapper.displayName = `Memo(${Component.name || 'Anonymous'})`;\n return MemoWrapper;\n}\n\n// Injected by dom.js\nlet _getCurrentComponent = null;\nexport function _injectGetCurrentComponent(fn) { _getCurrentComponent = fn; }\n\nexport function shallowEqual(a, b) {\n if (a === b) return true;\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.is(a[key], b[key])) return false;\n }\n return true;\n}\n\n// --- lazy ---\n// Code-split a component. Returns a wrapper that loads on first render.\n\nexport function lazy(loader) {\n let Component = null;\n let loadPromise = null;\n let loadError = null;\n const listeners = new Set();\n\n function LazyWrapper(props) {\n if (loadError) throw loadError;\n if (Component) return h(Component, props);\n\n if (!loadPromise) {\n loadPromise = loader()\n .then(mod => {\n Component = mod.default || mod;\n // Notify all waiting instances\n listeners.forEach(fn => fn());\n listeners.clear();\n })\n .catch(err => { loadError = err; });\n }\n\n // Throw promise for Suspense to catch\n throw loadPromise;\n }\n\n LazyWrapper.displayName = 'Lazy';\n LazyWrapper._lazy = true;\n LazyWrapper._onLoad = (fn) => {\n if (Component) fn();\n else listeners.add(fn);\n };\n return LazyWrapper;\n}\n\n// --- Suspense ---\n// Show fallback while children are loading (lazy components).\n// Works with lazy() and async components.\n\nexport function Suspense({ fallback, children }) {\n const loading = signal(false);\n const pendingPromises = new Set();\n\n // Suspense boundary marker\n const boundary = {\n _suspense: true,\n onSuspend(promise) {\n loading.set(true);\n pendingPromises.add(promise);\n promise.finally(() => {\n pendingPromises.delete(promise);\n if (pendingPromises.size === 0) {\n loading.set(false);\n }\n });\n },\n };\n\n return {\n tag: '__suspense',\n props: { boundary, fallback, loading },\n children: Array.isArray(children) ? children : [children],\n _vnode: true,\n };\n}\n\n// --- ErrorBoundary ---\n// Catch errors in children and show fallback.\n// Uses a signal to track error state so it works with reactive rendering.\n\nexport function ErrorBoundary({ fallback, children, onError }) {\n const errorState = signal(null);\n\n // Error handler that will be registered with the component tree\n const handleError = (error) => {\n errorState.set(error);\n if (onError) {\n try {\n onError(error);\n } catch (e) {\n console.error('Error in onError handler:', e);\n }\n }\n };\n\n // Reset function to recover from error\n const reset = () => errorState.set(null);\n\n return {\n tag: '__errorBoundary',\n props: { errorState, handleError, fallback, reset },\n children: Array.isArray(children) ? children : [children],\n _vnode: true,\n };\n}\n\n// Helper to report error to nearest boundary\n// Walks the component context tree (not a runtime stack) so async errors are caught\nexport function reportError(error, startCtx) {\n // Walk up the _parentCtx chain to find the nearest _errorBoundary\n let ctx = startCtx || _getCurrentComponent?.();\n while (ctx) {\n if (ctx._errorBoundary) {\n ctx._errorBoundary(error);\n return true;\n }\n ctx = ctx._parentCtx;\n }\n return false;\n}\n\n// _getCurrentComponent is already declared above and injected via _injectGetCurrentComponent\n\n// --- Show ---\n// Conditional rendering component. Cleaner than ternaries.\n\nexport function Show({ when, fallback = null, children }) {\n // when can be a signal or a value\n const condition = typeof when === 'function' ? when() : when;\n return condition ? children : fallback;\n}\n\n// --- For ---\n// Efficient list rendering with keyed reconciliation.\n\nexport function For({ each, fallback = null, children }) {\n const list = typeof each === 'function' ? each() : each;\n if (!list || list.length === 0) return fallback;\n\n // children should be a function (item, index) => vnode\n const renderFn = Array.isArray(children) ? children[0] : children;\n if (typeof renderFn !== 'function') {\n console.warn('[what] For: children must be a render function, e.g. <For each={items}>{(item) => ...}</For>');\n return fallback;\n }\n\n return list.map((item, index) => {\n const vnode = renderFn(item, index);\n // Auto-detect keys for efficient keyed reconciliation\n if (vnode && typeof vnode === 'object' && vnode.key == null) {\n if (item != null && typeof item === 'object') {\n // Use item.id or item.key if available\n if (item.id != null) vnode.key = item.id;\n else if (item.key != null) vnode.key = item.key;\n } else if (typeof item === 'string' || typeof item === 'number') {\n // Primitive items can be their own key\n vnode.key = item;\n }\n }\n return vnode;\n });\n}\n\n// --- Switch / Match ---\n// Multi-condition rendering (like switch statement).\n\nexport function Switch({ fallback = null, children }) {\n const kids = Array.isArray(children) ? children : [children];\n\n for (const child of kids) {\n if (child && child.tag === Match) {\n const condition = typeof child.props.when === 'function'\n ? child.props.when()\n : child.props.when;\n if (condition) {\n return child.children;\n }\n }\n }\n\n return fallback;\n}\n\nexport function Match({ when, children }) {\n // Match is just a marker component, Switch handles the logic\n return { tag: Match, props: { when }, children, _vnode: true };\n}\n\n// --- Island ---\n// Deferred hydration component for islands architecture.\n// Usage: h(Island, { component: Counter, mode: 'idle' })\n// The babel plugin compiles <Counter client:idle /> into this.\n\nexport function Island({ component: Component, mode, mediaQuery, ...props }) {\n const placeholder = h('div', { 'data-island': Component.name || 'Island', 'data-hydrate': mode });\n\n // We need to return a vnode that the reconciler can handle.\n // The actual hydration scheduling happens after mount via an effect.\n const wrapper = signal(null);\n const hydrated = signal(false);\n\n function doHydrate() {\n if (hydrated()) return;\n hydrated.set(true);\n // Render the actual component\n wrapper.set(h(Component, props));\n }\n\n // Schedule hydration based on mode\n function scheduleHydration(el) {\n switch (mode) {\n case 'load':\n queueMicrotask(doHydrate);\n break;\n\n case 'idle':\n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(doHydrate);\n } else {\n setTimeout(doHydrate, 200);\n }\n break;\n\n case 'visible': {\n const observer = new IntersectionObserver((entries) => {\n if (entries[0].isIntersecting) {\n observer.disconnect();\n doHydrate();\n }\n });\n observer.observe(el);\n break;\n }\n\n case 'interaction': {\n const hydrate = () => {\n el.removeEventListener('click', hydrate);\n el.removeEventListener('focus', hydrate);\n el.removeEventListener('mouseenter', hydrate);\n doHydrate();\n };\n el.addEventListener('click', hydrate, { once: true });\n el.addEventListener('focus', hydrate, { once: true });\n el.addEventListener('mouseenter', hydrate, { once: true });\n break;\n }\n\n case 'media': {\n if (!mediaQuery) { doHydrate(); break; }\n const mq = window.matchMedia(mediaQuery);\n if (mq.matches) {\n queueMicrotask(doHydrate);\n } else {\n const checkMedia = () => {\n if (mq.matches) {\n mq.removeEventListener('change', checkMedia);\n doHydrate();\n }\n };\n mq.addEventListener('change', checkMedia);\n }\n break;\n }\n\n default:\n // Unknown mode, hydrate immediately\n queueMicrotask(doHydrate);\n }\n }\n\n // Use ref callback to get the DOM element and schedule hydration\n const refCallback = (el) => {\n if (el) scheduleHydration(el);\n };\n\n // Return: show placeholder until hydrated, then show the real component\n return h('div', { 'data-island': Component.name || 'Island', 'data-hydrate': mode, ref: refCallback },\n hydrated() ? wrapper() : null\n );\n}\n", "// What Framework - Helpers & Utilities\n// Commonly needed patterns, zero overhead.\n\nimport { signal, effect, __DEV__ } from './reactive.js';\n\n// --- each(list, fn) --- [DEPRECATED: use <For> component or .map() instead]\n// Keyed list rendering. Optimized for reconciliation.\nlet _eachWarned = false;\nexport function each(list, fn, keyFn) {\n if (!_eachWarned) {\n _eachWarned = true;\n console.warn('[what] each() is deprecated. Use the <For> component or Array.map() instead.');\n }\n if (!list || list.length === 0) return [];\n return list.map((item, index) => {\n const vnode = fn(item, index);\n if (keyFn && vnode && typeof vnode === 'object') {\n vnode.key = keyFn(item, index);\n }\n return vnode;\n });\n}\n\n// --- cls(...args) ---\n// Conditional class names. Like clsx but tiny.\n// cls('base', condition && 'active', { hidden: isHidden, bold: isBold })\nexport function cls(...args) {\n const classes = [];\n for (const arg of args) {\n if (!arg) continue;\n if (typeof arg === 'string') {\n classes.push(arg);\n } else if (typeof arg === 'object') {\n for (const [key, val] of Object.entries(arg)) {\n if (val) classes.push(key);\n }\n }\n }\n return classes.join(' ');\n}\n\n// --- style(obj) ---\n// Convert a style object to a CSS string for SSR.\nexport function style(obj) {\n if (typeof obj === 'string') return obj;\n return Object.entries(obj)\n .filter(([, v]) => v != null && v !== '')\n .map(([k, v]) => `${camelToKebab(k)}:${v}`)\n .join(';');\n}\n\nfunction camelToKebab(str) {\n return str.replace(/([A-Z])/g, '-$1').toLowerCase();\n}\n\n// --- debounce ---\n// Debounced signal updates.\nexport function debounce(fn, ms) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => fn(...args), ms);\n };\n}\n\n// --- throttle ---\nexport function throttle(fn, ms) {\n let last = 0;\n return (...args) => {\n const now = Date.now();\n if (now - last >= ms) {\n last = now;\n fn(...args);\n }\n };\n}\n\n// Component context ref \u2014 injected by dom.js to avoid circular imports\nlet _getCurrentComponentRef = null;\nexport function _setComponentRef(fn) { _getCurrentComponentRef = fn; }\n\n// --- useMediaQuery ---\n// Reactive media query. Returns a signal. Cleans up listener on component unmount.\nexport function useMediaQuery(query) {\n if (typeof window === 'undefined') return signal(false);\n const mq = window.matchMedia(query);\n const s = signal(mq.matches);\n const handler = (e) => s.set(e.matches);\n mq.addEventListener('change', handler);\n\n // Register cleanup if inside a component context\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => mq.removeEventListener('change', handler));\n }\n\n return s;\n}\n\n// --- useLocalStorage ---\n// Signal synced with localStorage. Cleans up listeners on component unmount.\nexport function useLocalStorage(key, initial) {\n let stored;\n try {\n const raw = localStorage.getItem(key);\n stored = raw !== null ? JSON.parse(raw) : initial;\n } catch {\n stored = initial;\n }\n\n const s = signal(stored);\n\n // Sync to localStorage on changes\n const dispose = effect(() => {\n try {\n localStorage.setItem(key, JSON.stringify(s()));\n } catch (e) {\n if (__DEV__) console.warn('[what] localStorage write failed (quota exceeded?):', e);\n }\n });\n\n // Listen for changes from other tabs\n let storageHandler = null;\n if (typeof window !== 'undefined') {\n storageHandler = (e) => {\n if (e.key === key && e.newValue !== null) {\n try { s.set(JSON.parse(e.newValue)); } catch (err) {\n if (__DEV__) console.warn('[what] localStorage parse failed:', err);\n }\n }\n };\n window.addEventListener('storage', storageHandler);\n }\n\n // Register cleanup if inside a component context\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => {\n dispose();\n if (storageHandler) window.removeEventListener('storage', storageHandler);\n });\n }\n\n return s;\n}\n\n// --- portal ---\n// Render children into a different DOM container.\nexport function Portal({ target, children }) {\n // In SSR, just return null (portals are client-only)\n if (typeof document === 'undefined') return null;\n const container = typeof target === 'string'\n ? document.querySelector(target)\n : target;\n if (!container) return null;\n // The DOM reconciler will mount children here\n return { tag: '__portal', props: { container }, children: Array.isArray(children) ? children : [children], _vnode: true };\n}\n\n// --- useClickOutside ---\n// Detect clicks outside a ref'd element. Essential for dropdowns, modals, popovers.\nexport function useClickOutside(ref, handler) {\n if (typeof document === 'undefined') return;\n\n const listener = (e) => {\n const el = ref.current || ref;\n if (!el || el.contains(e.target)) return;\n handler(e);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n const ctx = _getCurrentComponentRef?.();\n if (ctx) {\n ctx._cleanupCallbacks = ctx._cleanupCallbacks || [];\n ctx._cleanupCallbacks.push(() => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n });\n }\n}\n\n// --- Transition helper ---\n// Animate elements in/out. Returns props to spread on the element.\nexport function transition(name, active) {\n return {\n class: active ? `${name}-enter ${name}-enter-active` : `${name}-leave ${name}-leave-active`,\n };\n}\n", "// What Framework - Fine-Grained DOM Runtime\n// Components run ONCE. Signals create individual DOM effects.\n// No VDOM reconciler, no diffing \u2014 direct DOM manipulation driven by signals.\n\nimport { effect, batch, untrack, signal, __DEV__, __devtools } from './reactive.js';\nimport { reportError, _injectGetCurrentComponent, shallowEqual } from './components.js';\nimport { _setComponentRef } from './helpers.js';\n// SVG elements that need namespace\nconst SVG_ELEMENTS = new Set([\n 'svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'ellipse',\n 'g', 'defs', 'use', 'symbol', 'clipPath', 'mask', 'pattern', 'image',\n 'text', 'tspan', 'textPath', 'foreignObject', 'linearGradient', 'radialGradient', 'stop',\n 'marker', 'animate', 'animateTransform', 'animateMotion', 'set', 'filter',\n 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix',\n 'feDiffuseLighting', 'feDisplacementMap', 'feFlood', 'feGaussianBlur', 'feImage',\n 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'feSpecularLighting',\n 'feTile', 'feTurbulence',\n]);\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// Track all mounted component contexts for disposal\nconst mountedComponents = new Set();\n\n// WeakMap: comment node \u2192 component context (for comment-node boundaries)\nconst _commentCtxMap = new WeakMap();\n\nfunction isDomNode(value) {\n if (!value || typeof value !== 'object') return false;\n if (typeof Node !== 'undefined' && value instanceof Node) return true;\n return typeof value.nodeType === 'number' && typeof value.nodeName === 'string';\n}\n\nfunction isVNode(value) {\n return !!value && typeof value === 'object' && (value._vnode === true || 'tag' in value);\n}\n\n// Dispose a component: run effect cleanups, hook cleanups, onCleanup callbacks\nfunction disposeComponent(ctx) {\n if (ctx.disposed) return;\n ctx.disposed = true;\n\n // Run cleanup callbacks\n if (ctx.cleanups) {\n for (const cleanup of ctx.cleanups) {\n try { cleanup(); } catch (e) { console.error('[what] cleanup error:', e); }\n }\n }\n\n // Run effect disposals\n if (ctx.effects) {\n for (const dispose of ctx.effects) {\n try { dispose(); } catch (e) { /* already disposed */ }\n }\n }\n\n // Run hook cleanups (useEffect return values)\n if (ctx.hooks) {\n for (const hook of ctx.hooks) {\n if (hook && typeof hook.cleanup === 'function') {\n try { hook.cleanup(); } catch (e) { console.error('[what] hook cleanup error:', e); }\n }\n }\n }\n\n // Run onCleanup callbacks\n if (ctx._cleanupCallbacks) {\n for (const fn of ctx._cleanupCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onCleanup error:', e); }\n }\n }\n\n if (__DEV__ && __devtools?.onComponentUnmount) __devtools.onComponentUnmount(ctx);\n mountedComponents.delete(ctx);\n}\n\n// Dispose all components and reactive effects attached to a DOM subtree.\n// Performance: checks _componentCtx / _dispose / _propEffects before walking\n// children, and only checks _commentCtxMap for comment nodes (nodeType 8).\nexport function disposeTree(node) {\n if (!node) return;\n if (node._componentCtx) {\n disposeComponent(node._componentCtx);\n }\n // Check comment node WeakMap for component context \u2014 only for comment nodes\n if (node.nodeType === 8) {\n const commentCtx = _commentCtxMap.get(node);\n if (commentCtx) {\n disposeComponent(commentCtx);\n }\n }\n // Dispose reactive function child effects ({() => ...} wrappers)\n if (node._dispose) {\n try { node._dispose(); } catch (e) { /* already disposed */ }\n }\n // Dispose reactive prop effects (value: () => ..., class: () => ..., etc.)\n if (node._propEffects) {\n for (const key in node._propEffects) {\n try { node._propEffects[key](); } catch (e) { /* already disposed */ }\n }\n }\n // Recursively dispose children\n const children = node.childNodes;\n if (children && children.length > 0) {\n for (let i = 0; i < children.length; i++) {\n disposeTree(children[i]);\n }\n }\n}\n\n// Mount a component tree into a DOM container\nexport function mount(vnode, container) {\n if (typeof container === 'string') {\n container = document.querySelector(container);\n }\n disposeTree(container); // Clean up any previous mount\n container.textContent = '';\n const node = createDOM(vnode, container);\n if (node) container.appendChild(node);\n return () => {\n disposeTree(container);\n container.textContent = '';\n };\n}\n\n// --- Create DOM from VNode ---\n\nexport function createDOM(vnode, parent, isSvg) {\n // Null/false/true \u2192 placeholder comment (preserves child indices for reconciliation)\n if (vnode == null || vnode === false || vnode === true) {\n return document.createComment('');\n }\n\n // Text\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n return document.createTextNode(String(vnode));\n }\n\n // DOM node passthrough (fine-grained components return real nodes)\n if (isDomNode(vnode)) {\n return vnode;\n }\n\n // Reactive function child \u2014 use comment markers (no wrapper element)\n // to avoid polluting the DOM and breaking CSS selectors like :first-child.\n if (typeof vnode === 'function') {\n const startMarker = document.createComment('fn');\n const endMarker = document.createComment('/fn');\n let currentNodes = [];\n // We need a parent to insert between markers. The caller (createElementFromVNode\n // or createComponent) will appendChild both markers and the content. We return\n // a document fragment containing start marker, then the effect will manage nodes\n // between start and end markers once they're in the real DOM.\n const frag = document.createDocumentFragment();\n frag.appendChild(startMarker);\n frag.appendChild(endMarker);\n\n const dispose = effect(() => {\n const val = vnode();\n const vnodes = (val == null || val === false || val === true)\n ? []\n : Array.isArray(val) ? val : [val];\n\n const realParent = endMarker.parentNode;\n if (!realParent) return; // not mounted yet \u2014 first run handled below\n\n // Remove old nodes between markers\n for (const old of currentNodes) {\n disposeTree(old);\n if (old.parentNode === realParent) realParent.removeChild(old);\n }\n currentNodes = [];\n\n // Add new nodes before endMarker\n for (const v of vnodes) {\n const node = createDOM(v, realParent, parent?._isSvg);\n if (node) {\n // If createDOM returned a DocumentFragment, track individual children\n // since fragment nodes get absorbed into the DOM on insertion.\n if (node.nodeType === 11 /* DOCUMENT_FRAGMENT_NODE */) {\n const children = Array.from(node.childNodes);\n realParent.insertBefore(node, endMarker);\n for (const child of children) currentNodes.push(child);\n } else {\n realParent.insertBefore(node, endMarker);\n currentNodes.push(node);\n }\n }\n }\n });\n\n startMarker._dispose = dispose;\n // Also store dispose on endMarker so disposeTree can find it from either marker\n endMarker._dispose = dispose;\n return frag;\n }\n\n // Array of vnodes\n if (Array.isArray(vnode)) {\n const frag = document.createDocumentFragment();\n for (const child of vnode) {\n const node = createDOM(child, parent, isSvg);\n if (node) frag.appendChild(node);\n }\n return frag;\n }\n\n // VNode with component tag \u2014 component runs ONCE\n if (isVNode(vnode) && typeof vnode.tag === 'function') {\n return createComponent(vnode, parent, isSvg);\n }\n\n // VNode with string tag \u2014 create element\n if (isVNode(vnode)) {\n return createElementFromVNode(vnode, parent, isSvg);\n }\n\n // Unknown \u2014 convert to text\n return document.createTextNode(String(vnode));\n}\n\n// --- Component Rendering ---\n// Components run ONCE. Props are passed as a signal for reactive access.\n\n// Shared Proxy handler for reactive props \u2014 defined once, reused by all components.\n// The Proxy target must be a plain object (not a function) so that ownKeys\n// invariants are satisfied. The propsSignal is stored as target._sig.\nconst _propsProxyHandler = {\n get(target, key) {\n if (key === '_sig') return undefined; // hide internal property\n return target._sig()[key];\n },\n has(target, key) {\n if (key === '_sig') return false;\n return key in target._sig();\n },\n ownKeys(target) {\n return Reflect.ownKeys(target._sig());\n },\n getOwnPropertyDescriptor(target, key) {\n if (key === '_sig') return undefined;\n const current = target._sig();\n if (key in current) {\n return { value: current[key], writable: false, enumerable: true, configurable: true };\n }\n return undefined;\n },\n};\n\nconst componentStack = [];\n\nexport function getCurrentComponent() {\n return componentStack[componentStack.length - 1];\n}\n\n// Inject into components.js and helpers.js to avoid circular imports\n_injectGetCurrentComponent(getCurrentComponent);\n_setComponentRef(getCurrentComponent);\n\nexport function getComponentStack() {\n return componentStack;\n}\n\nfunction createComponent(vnode, parent, isSvg) {\n let { tag: Component, props, children } = vnode;\n\n // Class component detection\n if (typeof Component === 'function' &&\n (Component.prototype?.isReactComponent || Component.prototype?.render)) {\n const ClassComp = Component;\n Component = function ClassComponentBridge(props) {\n const instance = new ClassComp(props);\n return instance.render();\n };\n Component.displayName = ClassComp.displayName || ClassComp.name || 'ClassComponent';\n }\n\n // Handle special boundary components\n if (Component === '__errorBoundary' || vnode.tag === '__errorBoundary') {\n return createErrorBoundary(vnode, parent);\n }\n if (Component === '__suspense' || vnode.tag === '__suspense') {\n return createSuspenseBoundary(vnode, parent);\n }\n if (Component === '__portal' || vnode.tag === '__portal') {\n return createPortalDOM(vnode, parent);\n }\n\n // Component context for hooks\n // Error boundary lookup: walk the parent chain once, cache the result.\n const parentCtx = componentStack[componentStack.length - 1] || null;\n let errorBoundary = null;\n if (parentCtx) {\n // Fast path: if parent has an error boundary, use it directly\n errorBoundary = parentCtx._errorBoundary || null;\n if (!errorBoundary) {\n let p = parentCtx._parentCtx;\n while (p) {\n if (p._errorBoundary) { errorBoundary = p._errorBoundary; break; }\n p = p._parentCtx;\n }\n }\n }\n const ctx = {\n hooks: [],\n hookIndex: 0,\n effects: [],\n cleanups: [],\n mounted: false,\n disposed: false,\n Component,\n _parentCtx: parentCtx,\n _errorBoundary: errorBoundary,\n };\n\n // Component boundaries: use comment nodes instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('c:start');\n const endComment = document.createComment('c:end');\n _commentCtxMap.set(startComment, ctx);\n ctx._startComment = startComment;\n ctx._endComment = endComment;\n\n // Fragment to hold comment boundaries + component output\n const container = document.createDocumentFragment();\n container._componentCtx = ctx;\n ctx._wrapper = startComment; // Reference for context lookup\n\n // Track for disposal\n mountedComponents.add(ctx);\n if (__DEV__ && __devtools?.onComponentMount) __devtools.onComponentMount(ctx);\n\n // Props signal for reactive updates from parent\n const propsChildren = children.length === 0 ? undefined : children.length === 1 ? children[0] : children;\n // Merge children into props without spreading when possible\n let mergedProps;\n if (propsChildren !== undefined) {\n mergedProps = props ? Object.assign({}, props, { children: propsChildren }) : { children: propsChildren };\n } else {\n mergedProps = props ? Object.assign({}, props) : {};\n }\n const propsSignal = signal(mergedProps);\n ctx._propsSignal = propsSignal;\n\n // Create a reactive props proxy: reading any prop inside an effect\n // will auto-track the dependency on the propsSignal. This makes prop\n // access reactive across re-renders without requiring the component\n // to be re-executed.\n // Reuse shared trap handlers to minimize per-component allocation.\n // Store propsSignal on a plain object target (Proxy invariant: ownKeys must\n // match non-configurable own properties of target; functions have 'prototype').\n const reactiveProps = new Proxy({ _sig: propsSignal }, _propsProxyHandler);\n\n // Component runs ONCE \u2014 not inside an effect\n componentStack.push(ctx);\n\n let result;\n try {\n result = Component(reactiveProps);\n } catch (error) {\n componentStack.pop();\n if (!reportError(error, ctx)) {\n console.error('[what] Uncaught error in component:', Component.name || 'Anonymous', error);\n throw error;\n }\n // Return fragment with just comment boundaries on error\n container.appendChild(startComment);\n container.appendChild(endComment);\n return container;\n }\n\n componentStack.pop();\n ctx.mounted = true;\n\n // Run onMount callbacks after DOM is ready\n if (ctx._mountCallbacks) {\n queueMicrotask(() => {\n if (ctx.disposed) return;\n for (const fn of ctx._mountCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onMount error:', e); }\n }\n });\n }\n\n // Build fragment: <!-- c:start --> [component output] <!-- c:end -->\n container.appendChild(startComment);\n const vnodes = Array.isArray(result) ? result : [result];\n for (const v of vnodes) {\n const node = createDOM(v, container, isSvg);\n if (node) container.appendChild(node);\n }\n container.appendChild(endComment);\n\n return container;\n}\n\n// Error boundary component handler\nfunction createErrorBoundary(vnode, parent) {\n const { errorState, handleError, fallback, reset } = vnode.props;\n const children = vnode.children;\n\n // Use comment node boundaries instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('eb:start');\n const endComment = document.createComment('eb:end');\n\n const boundaryCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _errorBoundary: handleError,\n _startComment: startComment,\n _endComment: endComment,\n };\n _commentCtxMap.set(startComment, boundaryCtx);\n\n const container = document.createDocumentFragment();\n container._componentCtx = boundaryCtx;\n container.appendChild(startComment);\n container.appendChild(endComment);\n\n const dispose = effect(() => {\n const error = errorState();\n\n componentStack.push(boundaryCtx);\n\n // Remove old content between comment boundaries\n if (startComment.parentNode) {\n while (startComment.nextSibling && startComment.nextSibling !== endComment) {\n const old = startComment.nextSibling;\n disposeTree(old);\n old.parentNode.removeChild(old);\n }\n }\n\n let vnodes;\n if (error) {\n vnodes = typeof fallback === 'function' ? [fallback({ error, reset })] : [fallback];\n } else {\n vnodes = children;\n }\n\n vnodes = Array.isArray(vnodes) ? vnodes : [vnodes];\n\n for (const v of vnodes) {\n const node = createDOM(v, parent);\n if (node) {\n // Insert before endComment\n if (endComment.parentNode) {\n endComment.parentNode.insertBefore(node, endComment);\n } else {\n // Still in fragment before first mount\n container.insertBefore(node, endComment);\n }\n }\n }\n\n componentStack.pop();\n });\n\n boundaryCtx.effects.push(dispose);\n return container;\n}\n\n// Suspense boundary component handler\nfunction createSuspenseBoundary(vnode, parent) {\n const { boundary, fallback, loading } = vnode.props;\n const children = vnode.children;\n\n // Use comment node boundaries instead of <span style=\"display:contents\">\n // to avoid DOM pollution, CSS selector breakage, and a11y issues.\n const startComment = document.createComment('sb:start');\n const endComment = document.createComment('sb:end');\n\n const boundaryCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _startComment: startComment,\n _endComment: endComment,\n };\n _commentCtxMap.set(startComment, boundaryCtx);\n\n const container = document.createDocumentFragment();\n container._componentCtx = boundaryCtx;\n container.appendChild(startComment);\n container.appendChild(endComment);\n\n const dispose = effect(() => {\n const isLoading = loading();\n const vnodes = isLoading ? [fallback] : children;\n const normalized = Array.isArray(vnodes) ? vnodes : [vnodes];\n\n componentStack.push(boundaryCtx);\n\n // Remove old content between comment boundaries\n if (startComment.parentNode) {\n while (startComment.nextSibling && startComment.nextSibling !== endComment) {\n const old = startComment.nextSibling;\n disposeTree(old);\n old.parentNode.removeChild(old);\n }\n }\n\n for (const v of normalized) {\n const node = createDOM(v, parent);\n if (node) {\n // Insert before endComment\n if (endComment.parentNode) {\n endComment.parentNode.insertBefore(node, endComment);\n } else {\n // Still in fragment before first mount\n container.insertBefore(node, endComment);\n }\n }\n }\n\n componentStack.pop();\n });\n\n boundaryCtx.effects.push(dispose);\n return container;\n}\n\n// Portal component handler\nfunction createPortalDOM(vnode, parent) {\n const { container } = vnode.props;\n const children = vnode.children;\n\n if (!container) {\n console.warn('[what] Portal: target container not found');\n return document.createComment('portal:empty');\n }\n\n const portalCtx = {\n hooks: [], hookIndex: 0, effects: [], cleanups: [],\n mounted: false, disposed: false,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n };\n\n const placeholder = document.createComment('portal');\n placeholder._componentCtx = portalCtx;\n\n const portalNodes = [];\n for (const child of children) {\n const node = createDOM(child, container);\n if (node) {\n container.appendChild(node);\n portalNodes.push(node);\n }\n }\n\n portalCtx._cleanupCallbacks = [() => {\n for (const node of portalNodes) {\n disposeTree(node);\n if (node.parentNode) node.parentNode.removeChild(node);\n }\n }];\n\n return placeholder;\n}\n\n// --- Create Element from VNode ---\n// For h()-based VNodes with string tags\n\nfunction createElementFromVNode(vnode, parent, isSvg) {\n const { tag, props, children } = vnode;\n\n const svgContext = isSvg || SVG_ELEMENTS.has(tag);\n const el = svgContext\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n\n // Apply props\n if (props) {\n applyProps(el, props, {}, svgContext);\n }\n\n // Append children\n const isSvgChildren = svgContext && tag !== 'foreignObject';\n for (let i = 0; i < children.length; i++) {\n const node = createDOM(children[i], el, isSvgChildren);\n if (node) el.appendChild(node);\n }\n\n el._vnode = vnode;\n return el;\n}\n\n// --- Prop Application ---\n// Only applied once for fine-grained (no diffing). Reactive props use effects.\n\nfunction applyProps(el, newProps, oldProps, isSvg) {\n if (!newProps) return;\n\n for (const key in newProps) {\n if (key === 'key' || key === 'children') continue;\n\n // Handle ref\n if (key === 'ref') {\n const ref = newProps.ref;\n if (typeof ref === 'function') ref(el);\n else if (ref) ref.current = el;\n continue;\n }\n\n setProp(el, key, newProps[key], isSvg);\n }\n}\n\nfunction setProp(el, key, value, isSvg) {\n // Reactive function props \u2014 wrap in effect for fine-grained updates\n if (typeof value === 'function' && !(key.startsWith('on') && key.length > 2) && key !== 'ref') {\n if (!el._propEffects) el._propEffects = {};\n if (el._propEffects[key]) {\n try { el._propEffects[key](); } catch (e) { /* already disposed */ }\n }\n el._propEffects[key] = effect(() => {\n const resolved = value();\n setProp(el, key, resolved, isSvg);\n });\n return;\n }\n\n // Event handlers\n if (key.startsWith('on') && key.length > 2) {\n let eventName = key.slice(2);\n let useCapture = false;\n if (eventName.endsWith('Capture')) {\n eventName = eventName.slice(0, -7);\n useCapture = true;\n }\n const event = eventName.toLowerCase();\n const storageKey = useCapture ? event + '_capture' : event;\n const old = el._events?.[storageKey];\n if (old && old._original === value) return;\n if (old) el.removeEventListener(event, old, useCapture);\n if (value == null) return;\n if (!el._events) el._events = {};\n // Single closure per event listener. Uses untrack to prevent accidental\n // signal subscriptions inside event handlers.\n const wrappedHandler = (e) => {\n if (!e.nativeEvent) e.nativeEvent = e;\n return untrack(() => wrappedHandler._handler(e));\n };\n wrappedHandler._handler = value;\n wrappedHandler._original = value;\n el._events[storageKey] = wrappedHandler;\n const eventOpts = value._eventOpts;\n el.addEventListener(event, wrappedHandler, eventOpts || useCapture || undefined);\n return;\n }\n\n // className / class\n if (key === 'className' || key === 'class') {\n if (isSvg) {\n el.setAttribute('class', value || '');\n } else {\n el.className = value || '';\n }\n return;\n }\n\n // Style\n if (key === 'style') {\n if (typeof value === 'string') {\n el.style.cssText = value;\n el._prevStyle = null;\n } else if (typeof value === 'object') {\n const oldStyle = el._prevStyle || {};\n for (const prop in oldStyle) {\n if (!(prop in value)) el.style[prop] = '';\n }\n for (const prop in value) {\n el.style[prop] = value[prop] ?? '';\n }\n el._prevStyle = { ...value };\n }\n return;\n }\n\n // dangerouslySetInnerHTML\n if (key === 'dangerouslySetInnerHTML') {\n el.innerHTML = value?.__html ?? '';\n return;\n }\n\n // innerHTML \u2014 require { __html: ... } wrapper to prevent XSS\n if (key === 'innerHTML') {\n if (value == null) return; // null/undefined \u2014 do nothing\n if (value && typeof value === 'object' && '__html' in value) {\n el.innerHTML = value.__html ?? '';\n } else {\n if (__DEV__) {\n console.warn(\n '[what] innerHTML received a raw string. This is a security risk (XSS). ' +\n 'Use innerHTML={{ __html: trustedString }} or dangerouslySetInnerHTML={{ __html: trustedString }} instead.'\n );\n }\n // Refuse to set raw string innerHTML \u2014 prevent XSS\n return;\n }\n return;\n }\n\n // Boolean attributes\n if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n return;\n }\n\n // data-* and aria-*\n if (key.startsWith('data-') || key.startsWith('aria-')) {\n el.setAttribute(key, value);\n return;\n }\n\n // SVG\n if (isSvg) {\n if (value === false || value == null) {\n el.removeAttribute(key);\n } else {\n el.setAttribute(key, value === true ? '' : String(value));\n }\n return;\n }\n\n // Default: property if exists, otherwise attribute\n if (key in el) {\n el[key] = value;\n } else {\n el.setAttribute(key, value);\n }\n}\n", "// What Framework - Fine-Grained Rendering Primitives\n// Solid-style rendering: components run once, signals create individual DOM effects.\n// No VDOM diffing \u2014 direct DOM manipulation with surgical signal-driven updates.\n\nimport { effect, untrack, createRoot, _createItemScope, signal, __DEV__ } from './reactive.js';\nimport { createDOM, disposeTree, getCurrentComponent, getComponentStack } from './dom.js';\nexport { effect, untrack };\n\n// --- Generic text insertion hook ---\n// External text engines (e.g., what-text) register a callback here via\n// _setTextInsertHook(). When null (default), zero cost \u2014 no module loaded,\n// no branch taken. The hook receives (parentElement, textString) on every\n// dynamic text insertion and update.\nlet _onTextInsert = null;\n\nexport function _setTextInsertHook(fn) {\n _onTextInsert = typeof fn === 'function' ? fn : null;\n}\n\n// --- _$createComponent(Component, props, children) ---\n// Internal compiler target for component instantiation. The compiler emits calls\n// to this function instead of h() \u2014 keeping h() out of compiled output entirely.\n// Merges children into props and delegates to createDOM which calls createComponent.\n\nexport function _$createComponent(Component, props, children) {\n if (children && children.length > 0) {\n const mergedChildren = children.length === 1 ? children[0] : children;\n // Mutate props in place when possible to avoid object spread allocation.\n // Compiled output creates a fresh props object per call, so mutation is safe.\n if (props) {\n props.children = mergedChildren;\n } else {\n props = { children: mergedChildren };\n }\n }\n // Build a VNode-like object and pass to createDOM which handles component execution\n return createDOM({ tag: Component, props: props || {}, children: children || [], key: null, _vnode: true });\n}\n\n// --- URL Sanitization for DOM attributes ---\n// Rejects javascript:, data:, vbscript: protocols (case-insensitive, trimmed).\n\nconst URL_ATTRS = new Set(['href', 'src', 'action', 'formaction', 'formAction']);\n\nfunction isSafeUrl(url) {\n if (typeof url !== 'string') return true; // non-string values are not URL-injection risks\n const normalized = url.trim().replace(/[\\s\\x00-\\x1f]/g, '').toLowerCase();\n if (normalized.startsWith('javascript:')) return false;\n if (normalized.startsWith('data:')) return false;\n if (normalized.startsWith('vbscript:')) return false;\n return true;\n}\n\n// --- template(html) ---\n// Pre-parse HTML string into a <template> element. Returns a factory function\n// that clones the DOM tree via cloneNode(true) \u2014 2-5x faster than createElement chains.\n// INTERNAL: Used by the compiler. Not intended for direct use by application code.\n// Exported as both `template` (for compiler output) and `_template` (to signal internal use).\n\n// Table child elements that need special parent wrapping for innerHTML parsing.\n// Browsers auto-correct bare <tr>, <td>, etc. when orphaned \u2014 wrapping prevents silent drops.\nconst TABLE_WRAPPERS = {\n tr: { depth: 2, wrap: '<table><tbody>', unwrap: '</tbody></table>' },\n td: { depth: 3, wrap: '<table><tbody><tr>', unwrap: '</tr></tbody></table>' },\n th: { depth: 3, wrap: '<table><tbody><tr>', unwrap: '</tr></tbody></table>' },\n thead: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n tbody: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n tfoot: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n colgroup: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n col: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n caption: { depth: 1, wrap: '<table>', unwrap: '</table>' },\n};\n\n// SVG element tags that must be created in an SVG namespace context.\nconst SVG_ELEMENTS = new Set([\n 'svg', 'path', 'circle', 'rect', 'line', 'polyline', 'polygon', 'ellipse',\n 'g', 'defs', 'use', 'text', 'tspan', 'foreignObject', 'clipPath', 'mask',\n 'pattern', 'linearGradient', 'radialGradient', 'stop', 'marker', 'symbol',\n 'image', 'animate', 'animateTransform', 'animateMotion', 'set',\n 'filter', 'feGaussianBlur', 'feOffset', 'feMerge', 'feMergeNode',\n 'feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite',\n 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap',\n 'feFlood', 'feImage', 'feMorphology', 'feSpecularLighting',\n 'feTile', 'feTurbulence', 'feDistantLight', 'fePointLight', 'feSpotLight',\n]);\n\nfunction getLeadingTag(html) {\n const m = html.match(/^<([a-zA-Z][a-zA-Z0-9]*)/);\n return m ? m[1] : '';\n}\n\n// Internal implementation \u2014 no warnings. Used by compiler via _$template.\nfunction _$templateImpl(html) {\n const trimmed = html.trim();\n const tag = getLeadingTag(trimmed);\n\n // SVG namespace: parse inside an SVG container then extract\n if (SVG_ELEMENTS.has(tag)) {\n return svgTemplate(trimmed);\n }\n\n // Table element wrapping: parse inside proper table parent then extract\n const tableInfo = TABLE_WRAPPERS[tag];\n if (tableInfo) {\n const t = document.createElement('template');\n t.innerHTML = tableInfo.wrap + trimmed + tableInfo.unwrap;\n // Pre-navigate to the target element once \u2014 avoids per-clone traversal.\n let target = t.content.firstChild;\n for (let i = 0; i < tableInfo.depth; i++) target = target.firstChild;\n return () => target.cloneNode(true);\n }\n\n const t = document.createElement('template');\n t.innerHTML = trimmed;\n return () => t.content.firstChild.cloneNode(true);\n}\n\n// Public export \u2014 warns in dev mode that this is a compiler internal.\n// Application code should use JSX, which the compiler transforms into _$template calls.\nlet _templateWarned = false;\nexport function template(html) {\n if (__DEV__ && !_templateWarned) {\n _templateWarned = true;\n console.warn(\n '[what] template() is a compiler internal. Use JSX instead. ' +\n 'Direct calls with user input can lead to XSS vulnerabilities.'\n );\n }\n return _$templateImpl(html);\n}\n\n// Compiler-internal alias \u2014 preferred name for compiled output (no warning)\nexport { _$templateImpl as _$template };\n\n// Legacy alias kept for backwards compat\nexport { template as _template };\n\n// --- svgTemplate(html) ---\n// Parse SVG content inside an SVG namespace container. Without this, innerHTML on a\n// <template> element creates HTML-namespace nodes, making SVG elements invisible.\n// If the HTML is a complete <svg> tag, it is parsed inside a temporary <div> so the\n// browser uses the correct SVG namespace. For inner SVG elements (path, circle, etc.),\n// they are wrapped in an <svg> container for parsing and then extracted.\n\nexport function svgTemplate(html) {\n const trimmed = html.trim();\n const tag = getLeadingTag(trimmed);\n\n if (tag === 'svg') {\n // Complete <svg> element \u2014 parse in a div (browsers handle the namespace)\n const t = document.createElement('template');\n t.innerHTML = trimmed;\n return () => t.content.firstChild.cloneNode(true);\n }\n\n // Inner SVG element (path, circle, g, etc.) \u2014 wrap in <svg> for namespace context\n const t = document.createElement('template');\n t.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\">${trimmed}</svg>`;\n return () => t.content.firstChild.firstChild.cloneNode(true);\n}\n\n// --- insert(parent, child, marker?) ---\n// Reactive child insertion. Handles all child types:\n// - string/number \u2192 text node\n// - function \u2192 effect that updates text node reactively\n// - DOM node \u2192 append directly\n// - array \u2192 insert each element\n\nexport function insert(parent, child, marker) {\n if (typeof child === 'function') {\n // Fast path: if the first evaluation returns a string/number, optimistically\n // create a text node for direct updates. If the value type changes later\n // (e.g., text -> vnode), fall back to full reconcileInsert.\n const first = child();\n const t = typeof first;\n if (t === 'string' || t === 'number') {\n const textNode = document.createTextNode(String(first));\n const m = marker || null;\n if (m) parent.insertBefore(textNode, m);\n else parent.appendChild(textNode);\n if (_onTextInsert) _onTextInsert(parent, String(first));\n let current = textNode;\n let isTextFastPath = true;\n effect(() => {\n const val = child();\n const vt = typeof val;\n if (isTextFastPath && (vt === 'string' || vt === 'number')) {\n // Fast path: still text \u2014 update data directly (no allocations)\n const str = String(val);\n if (textNode.data !== str) textNode.data = str;\n if (_onTextInsert) _onTextInsert(parent, str);\n } else {\n // Type changed \u2014 fall back to full reconcile\n isTextFastPath = false;\n current = reconcileInsert(parent, val, current, m);\n }\n });\n return textNode;\n }\n // General path for non-text reactive children (first value was null/vnode/array)\n let current = first != null ? reconcileInsert(parent, first, null, marker || null) : null;\n effect(() => {\n current = reconcileInsert(parent, child(), current, marker || null);\n });\n return current;\n }\n\n // Static text: create text node directly, skip reconcileInsert overhead\n if (typeof child === 'string' || typeof child === 'number') {\n const textNode = document.createTextNode(String(child));\n if (marker) parent.insertBefore(textNode, marker);\n else parent.appendChild(textNode);\n return textNode;\n }\n\n // Static DOM node: insert directly, skip reconcileInsert overhead\n if (child != null && typeof child === 'object' && child.nodeType > 0) {\n if (marker) parent.insertBefore(child, marker);\n else parent.appendChild(child);\n return child;\n }\n\n return reconcileInsert(parent, child, null, marker || null);\n}\n\nfunction isDomNode(value) {\n if (!value || typeof value !== 'object') return false;\n if (typeof Node !== 'undefined' && value instanceof Node) return true;\n return typeof value.nodeType === 'number' && typeof value.nodeName === 'string';\n}\n\nfunction isVNode(value) {\n return !!value && typeof value === 'object' && (value._vnode === true || 'tag' in value);\n}\n\n// Check if parent is an SVG element. Cached typeof check avoids repeated lookups.\nconst _hasSVGElement = typeof SVGElement !== 'undefined';\nfunction isSvgParent(parent) {\n return _hasSVGElement\n && parent instanceof SVGElement\n && parent.tagName !== 'foreignObject';\n}\n\nfunction asNodeArray(value) {\n if (value == null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction valuesToNodes(value, parent, out) {\n if (value == null || typeof value === 'boolean') return out;\n\n if (Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n valuesToNodes(value[i], parent, out);\n }\n return out;\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n out.push(document.createTextNode(String(value)));\n return out;\n }\n\n if (isDomNode(value)) {\n out.push(value);\n return out;\n }\n\n if (isVNode(value)) {\n out.push(createDOM(value, parent, isSvgParent(parent)));\n return out;\n }\n\n out.push(document.createTextNode(String(value)));\n return out;\n}\n\nfunction sameNodeArray(a, b) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction reconcileInsert(parent, value, current, marker) {\n // Guard: parent must be a node that supports child operations.\n // This catches cases where a stale DOM reference (e.g., a comment node from\n // shifted childNodes indices) is mistakenly passed as the parent.\n if (!parent || typeof parent.insertBefore !== 'function') {\n if (__DEV__) {\n console.warn('[what] reconcileInsert called with invalid parent:', parent);\n }\n return current;\n }\n\n const targetMarker = marker || null;\n\n if (value == null || typeof value === 'boolean') {\n const oldNodes = asNodeArray(current);\n for (let i = 0; i < oldNodes.length; i++) {\n const oldNode = oldNodes[i];\n if (oldNode.parentNode === parent) {\n disposeTree(oldNode);\n parent.removeChild(oldNode);\n }\n }\n return null;\n }\n\n if ((typeof value === 'string' || typeof value === 'number')\n && current && !Array.isArray(current) && current.nodeType === 3) {\n const text = String(value);\n if (current.data !== text) current.data = text;\n return current;\n }\n\n // Fast path: single DOM node value with single current node \u2014 skip array allocations\n if (typeof value === 'object' && value !== null && value.nodeType > 0 && !Array.isArray(value)) {\n if (value === current) return current;\n if (current && !Array.isArray(current) && current.nodeType > 0) {\n // Replace single node with single node\n if (current.parentNode === parent) {\n disposeTree(current);\n parent.replaceChild(value, current);\n } else {\n if (targetMarker) parent.insertBefore(value, targetMarker);\n else parent.appendChild(value);\n }\n return value;\n }\n }\n\n const newNodes = valuesToNodes(value, parent, []);\n const oldNodes = asNodeArray(current);\n\n if (sameNodeArray(oldNodes, newNodes)) {\n return current;\n }\n\n // Remove old nodes not in the new set. For small arrays (typical case),\n // linear scan is faster than Set allocation + hashing.\n const newLen = newNodes.length;\n for (let i = 0; i < oldNodes.length; i++) {\n const oldNode = oldNodes[i];\n if (oldNode.parentNode !== parent) continue;\n let found = false;\n for (let j = 0; j < newLen; j++) {\n if (newNodes[j] === oldNode) { found = true; break; }\n }\n if (!found) {\n disposeTree(oldNode);\n parent.removeChild(oldNode);\n }\n }\n\n let ref = targetMarker;\n for (let i = newNodes.length - 1; i >= 0; i--) {\n const node = newNodes[i];\n if (node.parentNode !== parent || node.nextSibling !== ref) {\n // Guard against stale ref from nested reconciliation\n if (ref && ref.parentNode !== parent) ref = null;\n if (ref) parent.insertBefore(node, ref);\n else parent.appendChild(node);\n }\n ref = node;\n }\n\n if (newNodes.length === 0) return null;\n return newNodes.length === 1 ? newNodes[0] : newNodes;\n}\n\n// --- mapArray(source, mapFn, options?) ---\n// Reactive list rendering with per-item scopes.\n// Unkeyed: tracks items by reference. Keyed: tracks by key function.\n// With key + raw: mapFn receives (item, index) \u2014 raw item value. Items identified by key for\n// efficient DOM reuse/moves. Use when items have per-field signals (no wrapper needed).\n// With key (no raw): mapFn receives (itemAccessor, index) \u2014 accessor is a signal getter.\n// When item reference changes but key persists, the signal updates in place.\n// Without key: mapFn receives (item, index) \u2014 raw item value. New reference = new row.\n\nexport function mapArray(source, mapFn, options) {\n const keyFn = options?.key;\n const raw = options?.raw || false;\n\n return (parent, marker) => {\n let items = [];\n let mappedNodes = [];\n let disposeFns = [];\n // Keyed mode state: key \u2192 { itemSignal }. Null for raw/unkeyed modes.\n let keyedState = keyFn && !raw ? new Map() : null;\n\n const endMarker = document.createComment('/list');\n parent.insertBefore(endMarker, marker || null);\n\n effect(() => {\n const newItems = source() || [];\n if (keyFn) {\n reconcileKeyed(parent, endMarker, items, newItems, mappedNodes, disposeFns, mapFn, keyFn, keyedState);\n } else {\n reconcileList(parent, endMarker, items, newItems, mappedNodes, disposeFns, mapFn);\n }\n // Save a snapshot of items for next diff. Use slice() to defend against\n // in-place mutation, but skip for empty arrays (common clear case).\n items = newItems.length > 0 ? newItems.slice() : newItems;\n });\n\n return endMarker;\n };\n}\n\nfunction reconcileList(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns, mapFn) {\n const newLen = newItems.length;\n const oldLen = oldItems.length;\n\n if (newLen === 0) {\n // Fast path: clear all \u2014 dispose reactive scopes first (handles effects/cleanups),\n // then remove DOM nodes. createRoot disposal handles all tracked effects; we only\n // need disposeTree for nodes with additional reactive bindings outside createRoot.\n if (oldLen > 0) {\n for (let i = 0; i < oldLen; i++) {\n if (disposeFns[i]) disposeFns[i]();\n }\n for (let i = oldLen - 1; i >= 0; i--) {\n const node = mappedNodes[i];\n if (node) {\n // Only walk subtree if the node has reactive state not tracked by createRoot\n if (node._componentCtx || node._dispose || node._propEffects) {\n disposeTree(node);\n }\n if (node.parentNode === parent) parent.removeChild(node);\n }\n }\n mappedNodes.length = 0;\n disposeFns.length = 0;\n }\n return;\n }\n\n if (oldLen === 0) {\n // Fast path: all new\n const frag = document.createDocumentFragment();\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const node = _createItemScope(dispose => {\n disposeFns[i] = dispose;\n return mapFn(item, i);\n });\n mappedNodes[i] = node;\n frag.appendChild(node);\n }\n parent.insertBefore(frag, endMarker);\n return;\n }\n\n // --- Common prefix/suffix skip ---\n let start = 0;\n const minLen = Math.min(oldLen, newLen);\n while (start < minLen && oldItems[start] === newItems[start]) start++;\n\n // If everything matches and same length, nothing changed\n if (start === oldLen && start === newLen) return;\n\n let oldEnd = oldLen - 1;\n let newEnd = newLen - 1;\n while (oldEnd >= start && newEnd >= start && oldItems[oldEnd] === newItems[newEnd]) {\n oldEnd--;\n newEnd--;\n }\n\n // Copy prefix/suffix into output arrays\n const newMapped = new Array(newLen);\n const newDispose = new Array(newLen);\n for (let i = 0; i < start; i++) {\n newMapped[i] = mappedNodes[i];\n newDispose[i] = disposeFns[i];\n }\n for (let i = newEnd + 1; i < newLen; i++) {\n // Suffix items: same item, possibly different index offset\n const oldI = oldEnd + 1 + (i - newEnd - 1);\n newMapped[i] = mappedNodes[oldI];\n newDispose[i] = disposeFns[oldI];\n }\n\n // Only reconcile the middle section: start..newEnd (new) vs start..oldEnd (old)\n const midNewLen = newEnd - start + 1;\n const midOldLen = oldEnd - start + 1;\n\n if (midNewLen === 0) {\n // Only removals in the middle\n for (let i = start; i <= oldEnd; i++) {\n disposeFns[i]?.();\n if (mappedNodes[i]?.parentNode) mappedNodes[i].parentNode.removeChild(mappedNodes[i]);\n }\n } else if (midOldLen === 0) {\n // Only insertions in the middle\n const marker = start < newLen && newMapped[newEnd + 1] ? newMapped[newEnd + 1] : endMarker;\n const frag = document.createDocumentFragment();\n for (let i = start; i <= newEnd; i++) {\n const item = newItems[i];\n const idx = i;\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(item, idx);\n });\n frag.appendChild(newMapped[i]);\n }\n parent.insertBefore(frag, marker);\n } else {\n // General case: reconcile middle section with LIS\n _reconcileMiddle(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns,\n mapFn, start, oldEnd, newEnd, newMapped, newDispose);\n }\n\n // Update arrays in place\n mappedNodes.length = newLen;\n disposeFns.length = newLen;\n for (let i = 0; i < newLen; i++) {\n mappedNodes[i] = newMapped[i];\n disposeFns[i] = newDispose[i];\n }\n}\n\nfunction _reconcileMiddle(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns,\n mapFn, start, oldEnd, newEnd, newMapped, newDispose) {\n // Build index map only for the middle section\n const oldIdxMap = new Map();\n for (let i = start; i <= oldEnd; i++) {\n oldIdxMap.set(oldItems[i], i);\n }\n\n // Match old items to new positions, collect old indices for LIS\n const midLen = newEnd - start + 1;\n const oldIndices = new Int32Array(midLen); // -1 = new item\n oldIndices.fill(-1);\n\n for (let i = start; i <= newEnd; i++) {\n const oldIdx = oldIdxMap.get(newItems[i]);\n if (oldIdx !== undefined) {\n oldIdxMap.delete(newItems[i]);\n newMapped[i] = mappedNodes[oldIdx];\n newDispose[i] = disposeFns[oldIdx];\n oldIndices[i - start] = oldIdx;\n }\n }\n\n // Dispose removed items\n for (const [, oldIdx] of oldIdxMap) {\n disposeFns[oldIdx]?.();\n if (mappedNodes[oldIdx]?.parentNode) mappedNodes[oldIdx].parentNode.removeChild(mappedNodes[oldIdx]);\n }\n\n // Compute LIS on old indices of reused items\n // Build the sequence of old indices for reused items only\n const reusedCount = midLen - _countNeg1(oldIndices, midLen);\n\n // Use a bitfield (via Uint8Array) to mark LIS positions \u2014 avoids Set overhead\n const inLIS = new Uint8Array(midLen);\n\n if (reusedCount > 1) {\n const seq = new Int32Array(reusedCount);\n const seqToMid = new Int32Array(reusedCount); // maps seq index \u2192 mid index\n let k = 0;\n for (let i = 0; i < midLen; i++) {\n if (oldIndices[i] !== -1) {\n seq[k] = oldIndices[i];\n seqToMid[k] = i;\n k++;\n }\n }\n const lisResult = _lis(seq, reusedCount);\n for (let i = 0; i < lisResult.length; i++) {\n inLIS[seqToMid[lisResult[i]]] = 1;\n }\n } else if (reusedCount === 1) {\n // Single reused item is trivially in LIS\n for (let i = 0; i < midLen; i++) {\n if (oldIndices[i] !== -1) { inLIS[i] = 1; break; }\n }\n }\n\n // Create new items\n for (let i = start; i <= newEnd; i++) {\n if (!newMapped[i]) {\n const item = newItems[i];\n const idx = i;\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(item, idx);\n });\n }\n }\n\n // Position: work backwards from the item after newEnd (suffix start or endMarker)\n let nextSibling = newEnd + 1 < newMapped.length && newMapped[newEnd + 1]\n ? newMapped[newEnd + 1] : endMarker;\n\n for (let i = newEnd; i >= start; i--) {\n const mi = i - start;\n if (oldIndices[mi] === -1 || !inLIS[mi]) {\n // New item or moved item \u2014 insert\n // Guard against stale nextSibling from nested reconciliation\n if (nextSibling && nextSibling.parentNode !== parent) nextSibling = endMarker;\n parent.insertBefore(newMapped[i], nextSibling);\n }\n nextSibling = newMapped[i];\n }\n}\n\nfunction _countNeg1(arr, len) {\n let c = 0;\n for (let i = 0; i < len; i++) if (arr[i] === -1) c++;\n return c;\n}\n\n// Longest Increasing Subsequence \u2014 returns indices into the input array.\n// O(n log n) using patience sorting. Uses typed arrays for performance.\nfunction _lis(arr, len) {\n if (len === 0) return [];\n if (len === 1) return [0];\n\n const tails = new Int32Array(len); // indices into arr\n const predecessors = new Int32Array(len);\n let tailLen = 1;\n tails[0] = 0;\n predecessors[0] = -1;\n\n for (let i = 1; i < len; i++) {\n if (arr[i] > arr[tails[tailLen - 1]]) {\n predecessors[i] = tails[tailLen - 1];\n tails[tailLen++] = i;\n } else {\n let lo = 0, hi = tailLen - 1;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (arr[tails[mid]] < arr[i]) lo = mid + 1;\n else hi = mid;\n }\n tails[lo] = i;\n predecessors[i] = lo > 0 ? tails[lo - 1] : -1;\n }\n }\n\n const result = new Array(tailLen);\n let k = tails[tailLen - 1];\n for (let i = tailLen - 1; i >= 0; i--) {\n result[i] = k;\n k = predecessors[k];\n }\n return result;\n}\n\n// --- reconcileKeyed ---\n// Keyed reconciliation: tracks items by key function, not by reference.\n// When a key persists but its item reference changes, the item signal updates\n// in place \u2014 no DOM node destruction/creation. Only effects reading the\n// item accessor re-run (e.g., textContent update for changed label).\n\nfunction reconcileKeyed(parent, endMarker, oldItems, newItems, mappedNodes, disposeFns, mapFn, keyFn, keyedState) {\n const newLen = newItems.length;\n const oldLen = oldItems.length;\n\n // --- Fast path: clear all ---\n if (newLen === 0) {\n if (oldLen > 0) {\n // Dispose reactive scopes first, then remove DOM nodes.\n for (let i = 0; i < oldLen; i++) {\n if (disposeFns[i]) disposeFns[i]();\n }\n for (let i = oldLen - 1; i >= 0; i--) {\n const node = mappedNodes[i];\n if (node) {\n if (node._componentCtx || node._dispose || node._propEffects) {\n disposeTree(node);\n }\n if (node.parentNode === parent) parent.removeChild(node);\n }\n }\n mappedNodes.length = 0;\n disposeFns.length = 0;\n if (keyedState) keyedState.clear();\n }\n return;\n }\n\n // --- Fast path: all new ---\n if (oldLen === 0) {\n const frag = document.createDocumentFragment();\n for (let i = 0; i < newLen; i++) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item; // raw mode: pass item directly\n }\n const node = _createItemScope(dispose => {\n disposeFns[idx] = dispose;\n return mapFn(accessor, idx);\n });\n mappedNodes[i] = node;\n frag.appendChild(node);\n }\n parent.insertBefore(frag, endMarker);\n return;\n }\n\n // --- Common prefix: skip matching keys at the start ---\n let start = 0;\n const minLen = Math.min(oldLen, newLen);\n while (start < minLen) {\n // Fast path: same reference \u2192 same key, no update needed\n if (oldItems[start] === newItems[start]) { start++; continue; }\n const oldKey = keyFn(oldItems[start]);\n const newKey = keyFn(newItems[start]);\n if (oldKey !== newKey) break;\n // Key matches but reference changed \u2014 update signal (non-raw mode only)\n if (keyedState) keyedState.get(oldKey).itemSig.set(newItems[start]);\n start++;\n }\n\n // --- Common suffix: skip matching keys at the end ---\n let oldEnd = oldLen - 1;\n let newEnd = newLen - 1;\n while (oldEnd >= start && newEnd >= start) {\n if (oldItems[oldEnd] === newItems[newEnd]) { oldEnd--; newEnd--; continue; }\n const oldKey = keyFn(oldItems[oldEnd]);\n const newKey = keyFn(newItems[newEnd]);\n if (oldKey !== newKey) break;\n if (keyedState) keyedState.get(oldKey).itemSig.set(newItems[newEnd]);\n oldEnd--;\n newEnd--;\n }\n\n // If everything matched, nothing to do\n if (start > oldEnd && start > newEnd) {\n // Just copy existing mappings to output\n return;\n }\n\n // Copy prefix/suffix into output arrays\n const newMapped = new Array(newLen);\n const newDispose = new Array(newLen);\n for (let i = 0; i < start; i++) {\n newMapped[i] = mappedNodes[i];\n newDispose[i] = disposeFns[i];\n }\n for (let i = newEnd + 1; i < newLen; i++) {\n const oldI = oldEnd + 1 + (i - newEnd - 1);\n newMapped[i] = mappedNodes[oldI];\n newDispose[i] = disposeFns[oldI];\n }\n\n const midNewLen = newEnd - start + 1;\n const midOldLen = oldEnd - start + 1;\n\n // --- Only additions in middle ---\n if (midOldLen === 0) {\n const marker = newEnd + 1 < newLen && newMapped[newEnd + 1] ? newMapped[newEnd + 1] : endMarker;\n const frag = document.createDocumentFragment();\n for (let i = start; i <= newEnd; i++) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item;\n }\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(accessor, idx);\n });\n frag.appendChild(newMapped[i]);\n }\n parent.insertBefore(frag, marker);\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n return;\n }\n\n // --- Only removals in middle ---\n if (midNewLen === 0) {\n for (let i = start; i <= oldEnd; i++) {\n disposeFns[i]?.();\n if (mappedNodes[i]?.parentNode) parent.removeChild(mappedNodes[i]);\n if (keyedState) keyedState.delete(keyFn(oldItems[i]));\n }\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n return;\n }\n\n // --- General case: reconcile middle section ---\n // Build old key \u2192 old index map for middle section only\n const oldKeyMap = new Map();\n for (let i = start; i <= oldEnd; i++) {\n oldKeyMap.set(keyFn(oldItems[i]), i);\n }\n\n const oldIndices = new Int32Array(midNewLen);\n oldIndices.fill(-1);\n\n // Match by key\n for (let i = start; i <= newEnd; i++) {\n const key = keyFn(newItems[i]);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldKeyMap.delete(key);\n newMapped[i] = mappedNodes[oldIdx];\n newDispose[i] = disposeFns[oldIdx];\n oldIndices[i - start] = oldIdx;\n // Update item signal if reference changed (non-raw mode only)\n if (keyedState && newItems[i] !== oldItems[oldIdx]) {\n keyedState.get(key).itemSig.set(newItems[i]);\n }\n }\n }\n\n // Dispose removed items\n for (const [key, oldIdx] of oldKeyMap) {\n disposeFns[oldIdx]?.();\n if (mappedNodes[oldIdx]?.parentNode) parent.removeChild(mappedNodes[oldIdx]);\n if (keyedState) keyedState.delete(key);\n }\n\n // Create new items\n for (let i = start; i <= newEnd; i++) {\n if (!newMapped[i]) {\n const item = newItems[i];\n const idx = i;\n let accessor;\n if (keyedState) {\n const key = keyFn(item);\n const itemSig = signal(item);\n accessor = itemSig;\n keyedState.set(key, { itemSig });\n } else {\n accessor = item;\n }\n newMapped[i] = _createItemScope(dispose => {\n newDispose[idx] = dispose;\n return mapFn(accessor, idx);\n });\n }\n }\n\n // Position using LIS\n // First check: are reused items already in order? (common for update-in-place)\n let reusedCount = 0;\n let alreadySorted = true;\n let lastOldIdx = -1;\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedCount++;\n if (oldIndices[i] <= lastOldIdx) alreadySorted = false;\n lastOldIdx = oldIndices[i];\n }\n }\n\n const inLIS = new Uint8Array(midNewLen);\n\n if (alreadySorted) {\n // All reused items are in order \u2014 mark all as in LIS (no moves needed)\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) inLIS[i] = 1;\n }\n } else if (reusedCount > 1) {\n const seq = new Int32Array(reusedCount);\n const seqToMid = new Int32Array(reusedCount);\n let k = 0;\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) {\n seq[k] = oldIndices[i];\n seqToMid[k] = i;\n k++;\n }\n }\n const lisResult = _lis(seq, reusedCount);\n for (let i = 0; i < lisResult.length; i++) {\n inLIS[seqToMid[lisResult[i]]] = 1;\n }\n } else if (reusedCount === 1) {\n for (let i = 0; i < midNewLen; i++) {\n if (oldIndices[i] !== -1) { inLIS[i] = 1; break; }\n }\n }\n\n // Position: work backwards, insert items not in LIS\n let nextSibling = newEnd + 1 < newMapped.length && newMapped[newEnd + 1]\n ? newMapped[newEnd + 1] : endMarker;\n\n for (let i = newEnd; i >= start; i--) {\n const mi = i - start;\n if (oldIndices[mi] === -1 || !inLIS[mi]) {\n // Guard against stale nextSibling from nested reconciliation\n if (nextSibling && nextSibling.parentNode !== parent) nextSibling = endMarker;\n parent.insertBefore(newMapped[i], nextSibling);\n }\n nextSibling = newMapped[i];\n }\n\n _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen);\n}\n\nfunction _copyBack(mappedNodes, disposeFns, newMapped, newDispose, newLen) {\n mappedNodes.length = newLen;\n disposeFns.length = newLen;\n for (let i = 0; i < newLen; i++) {\n mappedNodes[i] = newMapped[i];\n disposeFns[i] = newDispose[i];\n }\n}\n\n// --- spread(el, props) ---\n// Fine-grained prop effects. Function props create individual effects.\n// Event props use direct assignment.\n\nexport function spread(el, props) {\n for (const key in props) {\n const value = props[key];\n\n if (key.startsWith('on') && key.length > 2) {\n // Event handler \u2014 direct assignment. Use $$name for delegated events.\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value);\n continue;\n }\n\n if (typeof value === 'function' && !key.startsWith('on')) {\n // Reactive prop \u2014 create micro-effect\n if (key === 'class' || key === 'className') {\n effect(() => { el.className = value() || ''; });\n } else if (key === 'style' && typeof value() === 'object') {\n effect(() => {\n const styles = value();\n for (const prop in styles) {\n el.style[prop] = styles[prop] ?? '';\n }\n });\n } else {\n effect(() => { setProp(el, key, value()); });\n }\n } else {\n // Static prop\n setProp(el, key, value);\n }\n }\n}\n\nexport function setProp(el, key, value) {\n // Ref handling \u2014 assign element to ref object/callback (defense in depth)\n if (key === 'ref') {\n if (typeof value === 'function') value(el);\n else if (value && typeof value === 'object') value.current = el;\n return;\n }\n\n // Key prop \u2014 no-op, WhatFW has no virtual DOM (defense in depth, issue #6)\n if (key === 'key') return;\n\n // Sanitize URL attributes \u2014 reject dangerous protocols\n if (URL_ATTRS.has(key) || URL_ATTRS.has(key.toLowerCase())) {\n if (!isSafeUrl(value)) {\n if (typeof console !== 'undefined') {\n console.warn(`[what] Blocked unsafe URL in \"${key}\" attribute: ${value}`);\n }\n return;\n }\n }\n\n if (key === 'class' || key === 'className') {\n el.className = value || '';\n } else if (key === 'dangerouslySetInnerHTML') {\n el.innerHTML = value?.__html ?? '';\n } else if (key === 'innerHTML') {\n if (value && typeof value === 'object' && '__html' in value) {\n el.innerHTML = value.__html ?? '';\n } else {\n // Plain string innerHTML is rejected for security \u2014 use { __html: string } form\n if (typeof console !== 'undefined' && value != null && value !== '') {\n console.warn(\n '[what] Plain string innerHTML is not allowed. Use { __html: \"...\" } or dangerouslySetInnerHTML={{ __html: \"...\" }} instead.'\n );\n }\n // Ignored \u2014 do not set innerHTML from plain string\n }\n } else if (key === 'style') {\n if (typeof value === 'string') {\n el.style.cssText = value;\n } else if (typeof value === 'object') {\n for (const prop in value) {\n el.style[prop] = value[prop] ?? '';\n }\n }\n } else if (key.startsWith('data-') || key.startsWith('aria-')) {\n el.setAttribute(key, value);\n } else if (typeof value === 'boolean') {\n if (value) el.setAttribute(key, '');\n else el.removeAttribute(key);\n } else if (key in el) {\n el[key] = value;\n } else {\n el.setAttribute(key, value);\n }\n}\n\n// --- delegateEvents(eventNames) ---\n// Event delegation: common events handled at document level.\n// Handlers stored as el.$$click, el.$$input, etc.\n// Single listener per event type on document \u2014 reduces listener count from N to 1.\n\nconst delegatedEvents = new Set();\n\nexport function delegateEvents(eventNames) {\n for (const name of eventNames) {\n if (delegatedEvents.has(name)) continue;\n delegatedEvents.add(name);\n\n document.addEventListener(name, (e) => {\n let node = e.target;\n const key = '$$' + name;\n\n // Walk up the DOM tree looking for handlers\n while (node) {\n const handler = node[key];\n if (handler) {\n handler(e);\n if (e.cancelBubble) return;\n }\n node = node.parentNode;\n }\n });\n }\n}\n\n// --- addEventListener helper for non-delegated events ---\nexport function on(el, event, handler) {\n el.addEventListener(event, handler);\n return () => el.removeEventListener(event, handler);\n}\n\n// --- className helper for conditional classes ---\nexport function classList(el, classes) {\n effect(() => {\n for (const name in classes) {\n const value = typeof classes[name] === 'function' ? classes[name]() : classes[name];\n el.classList.toggle(name, !!value);\n }\n });\n}\n\n// =========================================================================\n// DOM Hydration\n// =========================================================================\n// Reuses server-rendered DOM instead of creating new nodes.\n// After hydration is complete, switches to normal rendering for updates.\n\nlet _isHydrating = false;\nlet _hydrationCursor = null;\n\nexport function isHydrating() {\n return _isHydrating;\n}\n\n/**\n * hydrate(vnode, container)\n * Walk existing DOM nodes in `container`, match them against the vnode tree,\n * attach reactive bindings, and skip cloneNode. Once done, switch to normal rendering.\n */\nexport function hydrate(vnode, container) {\n _isHydrating = true;\n _hydrationCursor = { parent: container, index: 0 };\n\n try {\n const result = hydrateNode(vnode, container);\n return result;\n } finally {\n _isHydrating = false;\n _hydrationCursor = null;\n }\n}\n\n/**\n * Claim the next DOM node from the hydration cursor.\n * Returns the existing DOM node or null if none available.\n */\nfunction claimNode(parent) {\n const children = parent.childNodes;\n while (_hydrationCursor.index < children.length) {\n const node = children[_hydrationCursor.index];\n // Skip hydration comment markers\n if (node.nodeType === 8) { // Comment node\n const text = node.textContent;\n if (text === '$' || text === '/$' || text === '[]' || text === '/[]') {\n _hydrationCursor.index++;\n continue;\n }\n }\n _hydrationCursor.index++;\n return node;\n }\n return null;\n}\n\nfunction isDevMode() {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n}\n\nfunction hydrateNode(vnode, parent) {\n if (vnode == null || typeof vnode === 'boolean') {\n return null;\n }\n\n // Text node\n if (typeof vnode === 'string' || typeof vnode === 'number') {\n const existing = claimNode(parent);\n const text = String(vnode);\n\n if (existing && existing.nodeType === 3) {\n // Reuse text node \u2014 check for mismatch in dev\n if (isDevMode() && existing.textContent !== text) {\n console.warn(\n `[what] Hydration mismatch: expected text \"${text}\", got \"${existing.textContent}\"`\n );\n existing.textContent = text;\n }\n return existing;\n }\n\n // Mismatch: expected text node, got element or nothing\n if (isDevMode()) {\n console.warn(\n `[what] Hydration mismatch: expected text node \"${text}\", got ${existing ? existing.nodeName : 'nothing'}. Falling back to client render.`\n );\n }\n const textNode = document.createTextNode(text);\n if (existing) {\n parent.replaceChild(textNode, existing);\n } else {\n parent.appendChild(textNode);\n }\n return textNode;\n }\n\n // Reactive function child \u2014 attach effect to existing node\n if (typeof vnode === 'function') {\n // Unwrap to get the initial value for hydration\n const initialValue = vnode();\n let current = hydrateNode(initialValue, parent);\n\n // Set up reactive effect for future updates (normal rendering path)\n effect(() => {\n const value = vnode();\n // After hydration, this runs as normal insert\n if (!_isHydrating) {\n current = reconcileInsert(parent, value, current, null);\n }\n });\n return current;\n }\n\n // Array \u2014 hydrate each child\n if (Array.isArray(vnode)) {\n const nodes = [];\n for (const child of vnode) {\n const node = hydrateNode(child, parent);\n if (node) nodes.push(node);\n }\n return nodes.length === 1 ? nodes[0] : nodes;\n }\n\n // VNode \u2014 component or element\n if (typeof vnode === 'object' && vnode._vnode) {\n // Component \u2014 route through component context so hooks work during hydration\n if (typeof vnode.tag === 'function') {\n const componentStack = getComponentStack();\n const Component = vnode.tag;\n const props = vnode.props || {};\n const children = vnode.children || [];\n\n // Set up component context (mirrors createComponent in dom.js)\n const ctx = {\n hooks: [],\n hookIndex: 0,\n effects: [],\n cleanups: [],\n mounted: false,\n disposed: false,\n Component,\n _parentCtx: componentStack[componentStack.length - 1] || null,\n _errorBoundary: null,\n };\n\n // Push context so hooks can access it\n componentStack.push(ctx);\n\n let result;\n try {\n const propsChildren = children.length === 0 ? undefined\n : children.length === 1 ? children[0] : children;\n result = Component({ ...props, children: propsChildren });\n } catch (error) {\n componentStack.pop();\n console.error('[what] Error in component during hydration:', Component.name || 'Anonymous', error);\n return null;\n }\n\n componentStack.pop();\n ctx.mounted = true;\n\n // Run onMount callbacks after hydration\n if (ctx._mountCallbacks) {\n queueMicrotask(() => {\n if (ctx.disposed) return;\n for (const fn of ctx._mountCallbacks) {\n try { fn(); } catch (e) { console.error('[what] onMount error:', e); }\n }\n });\n }\n\n return hydrateNode(result, parent);\n }\n\n // Element \u2014 claim existing DOM element\n const existing = claimNode(parent);\n const expectedTag = vnode.tag.toUpperCase();\n\n if (existing && existing.nodeType === 1 && existing.nodeName === expectedTag) {\n // Match! Reuse this element. Apply props/bindings.\n hydrateElementProps(existing, vnode.props || {});\n\n // Hydrate children\n const savedCursor = _hydrationCursor;\n _hydrationCursor = { parent: existing, index: 0 };\n\n const rawInner = vnode.props?.dangerouslySetInnerHTML?.__html;\n if (rawInner == null) {\n for (const child of vnode.children) {\n hydrateNode(child, existing);\n }\n }\n\n _hydrationCursor = savedCursor;\n return existing;\n }\n\n // Mismatch \u2014 fall back to client render for this subtree\n if (isDevMode()) {\n console.warn(\n `[what] Hydration mismatch: expected <${vnode.tag}>, got ${existing ? existing.nodeName : 'nothing'}. Falling back to client render.`\n );\n }\n\n // Create the element from scratch\n const newEl = document.createElement(vnode.tag);\n for (const key in vnode.props || {}) {\n if (key === 'children' || key === 'key') continue;\n setProp(newEl, key, vnode.props[key]);\n }\n for (const child of vnode.children) {\n reconcileInsert(newEl, child, null, null);\n }\n if (existing) {\n parent.replaceChild(newEl, existing);\n } else {\n parent.appendChild(newEl);\n }\n return newEl;\n }\n\n // DOM node \u2014 use directly\n if (isDomNode(vnode)) {\n return vnode;\n }\n\n // Fallback \u2014 create text node\n const textNode = document.createTextNode(String(vnode));\n parent.appendChild(textNode);\n return textNode;\n}\n\n/**\n * Apply props to an existing hydrated element.\n * Attaches event handlers and reactive bindings without re-creating the element.\n */\nfunction hydrateElementProps(el, props) {\n for (const key in props) {\n if (key === 'children' || key === 'key' || key === 'ref') continue;\n if (key === 'dangerouslySetInnerHTML' || key === 'innerHTML') continue;\n\n const value = props[key];\n\n // Event handlers \u2014 always attach (they don't exist in SSR HTML)\n if (key.startsWith('on') && key.length > 2) {\n const event = key.slice(2).toLowerCase();\n el.addEventListener(event, value);\n continue;\n }\n\n // Delegated events ($$click etc.)\n if (key.startsWith('$$')) {\n el[key] = value;\n continue;\n }\n\n // Reactive props \u2014 set up effects\n if (typeof value === 'function' && !key.startsWith('on')) {\n if (key === 'class' || key === 'className') {\n effect(() => { el.className = value() || ''; });\n } else if (key === 'style' && typeof value() === 'object') {\n effect(() => {\n const styles = value();\n for (const prop in styles) {\n el.style[prop] = styles[prop] ?? '';\n }\n });\n } else {\n effect(() => { setProp(el, key, value()); });\n }\n continue;\n }\n\n // Static props \u2014 skip attributes already set from SSR\n // Only attach non-serializable props or ones that may differ\n if (key === 'data-hk') continue;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["prev", "batch", "cleanup", "props", "SVG_ELEMENTS", "t", "t", "current", "isDomNode", "isVNode", "oldNodes", "setProp", "textNode", "componentStack"]
|
|
7
7
|
}
|