@getforma/core 0.6.1 → 0.8.2

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.
Files changed (52) hide show
  1. package/README.md +125 -15
  2. package/dist/chunk-3U57L2TY.cjs +38 -0
  3. package/dist/chunk-3U57L2TY.cjs.map +1 -0
  4. package/dist/{chunk-TKGUHASG.js → chunk-N522P3G6.js} +20 -12
  5. package/dist/chunk-N522P3G6.js.map +1 -0
  6. package/dist/chunk-OZCHIVAZ.js +35 -0
  7. package/dist/chunk-OZCHIVAZ.js.map +1 -0
  8. package/dist/{chunk-YSKF3VRA.cjs → chunk-YMIMKO4W.cjs} +51 -20
  9. package/dist/chunk-YMIMKO4W.cjs.map +1 -0
  10. package/dist/forma-runtime-csp.js +1 -1
  11. package/dist/forma-runtime.js +1 -1
  12. package/dist/formajs-runtime-hardened.global.js +1 -1
  13. package/dist/formajs-runtime-hardened.global.js.map +1 -1
  14. package/dist/formajs-runtime.global.js +1 -1
  15. package/dist/formajs-runtime.global.js.map +1 -1
  16. package/dist/formajs.global.js +1 -1
  17. package/dist/formajs.global.js.map +1 -1
  18. package/dist/index.cjs +112 -115
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +30 -21
  21. package/dist/index.d.ts +30 -21
  22. package/dist/index.js +25 -50
  23. package/dist/index.js.map +1 -1
  24. package/dist/runtime-hardened.cjs +106 -27
  25. package/dist/runtime-hardened.cjs.map +1 -1
  26. package/dist/runtime-hardened.js +107 -28
  27. package/dist/runtime-hardened.js.map +1 -1
  28. package/dist/runtime.cjs +128 -50
  29. package/dist/runtime.cjs.map +1 -1
  30. package/dist/runtime.js +102 -24
  31. package/dist/runtime.js.map +1 -1
  32. package/dist/signal-B4_wQJHs.d.cts +53 -0
  33. package/dist/signal-B4_wQJHs.d.ts +53 -0
  34. package/dist/ssr/index.cjs +19 -2
  35. package/dist/ssr/index.cjs.map +1 -1
  36. package/dist/ssr/index.js +19 -2
  37. package/dist/ssr/index.js.map +1 -1
  38. package/dist/tc39-compat.cjs +4 -12
  39. package/dist/tc39-compat.cjs.map +1 -1
  40. package/dist/tc39-compat.d.cts +1 -1
  41. package/dist/tc39-compat.d.ts +1 -1
  42. package/dist/tc39-compat.js +3 -11
  43. package/dist/tc39-compat.js.map +1 -1
  44. package/package.json +2 -2
  45. package/dist/chunk-DPSAVBCP.js +0 -26
  46. package/dist/chunk-DPSAVBCP.js.map +0 -1
  47. package/dist/chunk-KH3F5NRU.cjs +0 -29
  48. package/dist/chunk-KH3F5NRU.cjs.map +0 -1
  49. package/dist/chunk-TKGUHASG.js.map +0 -1
  50. package/dist/chunk-YSKF3VRA.cjs.map +0 -1
  51. package/dist/signal-CfLDwMyg.d.cts +0 -29
  52. package/dist/signal-CfLDwMyg.d.ts +0 -29
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/reactive/root.ts","../src/reactive/cleanup.ts","../src/reactive/dev.ts","../src/reactive/effect.ts","../src/reactive/memo.ts","../src/reactive/batch.ts","../src/reactive/untrack.ts","../src/reactive/on.ts","../src/reactive/ref.ts","../src/reactive/reducer.ts","../src/reactive/suspense-context.ts","../src/reactive/resource.ts","../src/dom/element.ts","../src/dom/show.ts","../src/dom/hydrate.ts","../src/dom/list.ts"],"names":["rawEffect","cleanup","createComputed","startBatch","endBatch","pauseTracking","resumeTracking","value","createSignal","fragment","ABORT_SYM","parent","CACHE_SYM","DYNAMIC_CHILD_SYM"],"mappings":"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","file":"chunk-YSKF3VRA.cjs","sourcesContent":["/**\n * Forma Reactive - Root\n *\n * Explicit reactive ownership scope. All effects created inside a root\n * are automatically disposed when the root is torn down.\n *\n * Replaces the module-level disposalBag pattern in mount.ts.\n */\n\n// ---------------------------------------------------------------------------\n// Root scope tracking\n// ---------------------------------------------------------------------------\n\nlet currentRoot: RootScope | null = null;\n// \"Safety Car\": use a fixed-capacity stack to prevent unbounded growth\n// from deeply nested createRoot calls. Stack is trimmed after pop.\nconst rootStack: (RootScope | null)[] = [];\n\ninterface RootScope {\n disposers: (() => void)[];\n}\n\n/**\n * Create a reactive root scope.\n *\n * All effects created (via `createEffect`) inside the callback are tracked.\n * The returned `dispose` function tears them all down.\n *\n * ```ts\n * const dispose = createRoot(() => {\n * createEffect(() => console.log(count()));\n * createEffect(() => console.log(name()));\n * });\n * // later: dispose() stops both effects\n * ```\n */\nexport function createRoot<T>(fn: (dispose: () => void) => T): T {\n const scope: RootScope = { disposers: [] };\n\n rootStack.push(currentRoot);\n currentRoot = scope;\n\n const dispose = () => {\n for (const d of scope.disposers) {\n try { d(); } catch { /* ensure all disposers run */ }\n }\n scope.disposers.length = 0;\n };\n\n try {\n return fn(dispose);\n } finally {\n currentRoot = rootStack.pop() ?? null;\n // \"Safety Car\": trim stack array if a deep nesting spike left excess capacity.\n // Without this, a spike of 100 nested roots leaves a length-0 array with\n // 100 slots of allocated memory that never shrinks.\n if (rootStack.length === 0) {\n rootStack.length = 0;\n }\n }\n}\n\n/**\n * @internal — called by createEffect to register disposers in the current root.\n */\nexport function registerDisposer(dispose: () => void): void {\n if (currentRoot) {\n currentRoot.disposers.push(dispose);\n }\n}\n\n/**\n * @internal — check if we're inside a root scope.\n */\nexport function hasActiveRoot(): boolean {\n return currentRoot !== null;\n}\n","/**\n * Forma Reactive - Cleanup\n *\n * Register cleanup functions within reactive scopes.\n * Inspired by SolidJS onCleanup().\n */\n\n// ---------------------------------------------------------------------------\n// Cleanup context tracking\n// ---------------------------------------------------------------------------\n\ntype CleanupCollector = ((fn: () => void) => void) | null;\n\nlet currentCleanupCollector: CleanupCollector = null;\n\n/**\n * Register a cleanup function in the current reactive scope.\n * The cleanup runs before the effect re-executes and on disposal.\n *\n * More composable than returning a cleanup from the effect function,\n * since it can be called from helper functions.\n *\n * ```ts\n * createEffect(() => {\n * const timer = setInterval(tick, 1000);\n * onCleanup(() => clearInterval(timer));\n * });\n * ```\n */\nexport function onCleanup(fn: () => void): void {\n currentCleanupCollector?.(fn);\n}\n\n/**\n * @internal — Set the cleanup collector for the current effect execution.\n */\nexport function setCleanupCollector(collector: CleanupCollector): CleanupCollector {\n const prev = currentCleanupCollector;\n currentCleanupCollector = collector;\n return prev;\n}\n","/**\n * Forma Reactive - Dev Mode\n *\n * Development utilities stripped from production builds via __DEV__ flag.\n * Bundlers replace __DEV__ with false → dead-code elimination removes all dev paths.\n */\n\n// __DEV__ is replaced by bundler (tsup define). Defaults to true for unbundled usage.\ndeclare const process: { env?: Record<string, string | undefined> } | undefined;\nexport const __DEV__: boolean = typeof process !== 'undefined'\n ? (process!.env?.NODE_ENV !== 'production')\n : true;\n\n// ---------------------------------------------------------------------------\n// Global error handler\n// ---------------------------------------------------------------------------\n\ntype ErrorHandler = (error: unknown, info?: { source?: string }) => void;\n\nlet _errorHandler: ErrorHandler | null = null;\n\n/**\n * Install a global error handler for FormaJS reactive errors.\n * Called when effects, computeds, or event handlers throw.\n *\n * ```ts\n * onError((err, info) => {\n * console.error(`[${info?.source}]`, err);\n * Sentry.captureException(err);\n * });\n * ```\n */\nexport function onError(handler: ErrorHandler): void {\n _errorHandler = handler;\n}\n\n/** @internal */\nexport function reportError(error: unknown, source?: string): void {\n if (_errorHandler) {\n try { _errorHandler(error, source ? { source } : {}); } catch { /* prevent infinite loop */ }\n }\n if (__DEV__) {\n console.error(`[forma] ${source ?? 'Unknown'} error:`, error);\n }\n}\n","/**\n * Forma Reactive - Effect\n *\n * Side-effectful reactive computation that auto-tracks signal dependencies.\n * Backed by alien-signals for automatic dependency tracking.\n *\n * TC39 Signals equivalent: Signal.subtle.Watcher (effect is a userland concept)\n */\n\nimport { effect as rawEffect } from 'alien-signals';\nimport { hasActiveRoot, registerDisposer } from './root.js';\nimport { setCleanupCollector } from './cleanup.js';\nimport { reportError } from './dev.js';\n\n// ---------------------------------------------------------------------------\n// Cleanup array pool — avoids allocating a new array every effect re-run\n// ---------------------------------------------------------------------------\n\nconst POOL_SIZE = 32;\nconst MAX_REENTRANT_RUNS = 100;\nconst pool: (() => void)[][] = [];\nfor (let i = 0; i < POOL_SIZE; i++) pool.push([]);\nlet poolIdx = POOL_SIZE;\n\nfunction acquireArray(): (() => void)[] {\n if (poolIdx > 0) {\n const arr = pool[--poolIdx]!;\n arr.length = 0;\n return arr;\n }\n return [];\n}\n\nfunction releaseArray(arr: (() => void)[]): void {\n arr.length = 0;\n if (poolIdx < POOL_SIZE) {\n pool[poolIdx++] = arr;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Unified cleanup runner — single function for both re-run and dispose paths\n// ---------------------------------------------------------------------------\n\nfunction runCleanup(fn: (() => void) | undefined): void {\n if (fn === undefined) return;\n try {\n fn();\n } catch (e) {\n reportError(e, 'effect cleanup');\n }\n}\n\nfunction runCleanups(bag: (() => void)[] | undefined): void {\n if (bag === undefined) return;\n for (let i = 0; i < bag.length; i++) {\n try { bag[i]!(); } catch (e) { reportError(e, 'effect cleanup'); }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactive effect that auto-tracks signal dependencies.\n *\n * The provided function runs immediately and re-runs whenever any signal it\n * reads changes. If the function returns a cleanup function, that cleanup is\n * called before each re-run and on disposal.\n *\n * Additionally, `onCleanup()` can be called inside the effect to register\n * cleanup functions composably.\n *\n * Returns a dispose function that stops the effect.\n */\n/**\n * @internal — Lightweight effect for Forma's internal DOM bindings.\n *\n * Bypasses createEffect's cleanup infrastructure (pool, collector, error\n * reporting, engine compression) since internal effects never use\n * onCleanup() or return cleanup functions. This saves ~4 function calls\n * per effect creation and per re-run.\n *\n * ONLY use for effects that:\n * 1. Never call onCleanup()\n * 2. Never return a cleanup function\n * 3. Contain simple \"read signal → write DOM\" logic\n */\nexport function internalEffect(fn: () => void): () => void {\n const dispose = rawEffect(fn);\n if (hasActiveRoot()) {\n registerDisposer(dispose);\n }\n return dispose;\n}\n\nexport function createEffect(fn: () => void | (() => void)): () => void {\n const shouldRegister = hasActiveRoot();\n\n // Most effects have zero or one cleanup. Track the single-cleanup case\n // without array allocation; only promote to pooled array when needed.\n let cleanup: (() => void) | undefined;\n let cleanupBag: (() => void)[] | undefined;\n let nextCleanup: (() => void) | undefined;\n let nextCleanupBag: (() => void)[] | undefined;\n\n const addCleanup = (cb: () => void) => {\n if (nextCleanupBag !== undefined) {\n nextCleanupBag.push(cb);\n return;\n }\n if (nextCleanup !== undefined) {\n const bag = acquireArray();\n bag.push(nextCleanup, cb);\n nextCleanup = undefined;\n nextCleanupBag = bag;\n return;\n }\n nextCleanup = cb;\n };\n\n // \"Engine Compression\" exploit: most effects never use cleanup (onCleanup()\n // or return value). After the first clean run, we know this effect is\n // \"cleanup-free\" and can skip the entire cleanup infrastructure on re-runs.\n // This saves 4 function calls per re-run: acquireArray, setCleanupCollector,\n // releaseArray, and bag inspection. Like the engine compression ratio exploit —\n // the \"rules\" say we should always prepare for cleanup, but we measure at\n // \"room temperature\" (first run) and exploit the gap.\n let skipCleanupInfra = false;\n let firstRun = true;\n let running = false;\n let rerunRequested = false;\n\n const runOnce = () => {\n // Run and clear previous cleanups (only if any exist).\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n\n // Ultra-fast path: this effect has proven it doesn't use cleanup.\n // Skip acquireArray + setCleanupCollector + bag checks + releaseArray.\n if (skipCleanupInfra) {\n try { fn(); } catch (e) { reportError(e, 'effect'); }\n return;\n }\n\n nextCleanup = undefined;\n nextCleanupBag = undefined;\n\n // Full path: install collector for onCleanup() calls.\n const prevCollector = setCleanupCollector(addCleanup);\n\n try {\n const result = fn();\n\n if (typeof result === 'function') {\n addCleanup(result as () => void);\n }\n\n // Hot path: no cleanups registered or returned — enable ultra-fast path.\n if (nextCleanup === undefined && nextCleanupBag === undefined) {\n // First clean run → enable ultra-fast path for all subsequent runs\n if (firstRun) skipCleanupInfra = true;\n return;\n }\n\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else {\n cleanup = nextCleanup;\n }\n } catch (e) {\n reportError(e, 'effect');\n\n if (nextCleanupBag !== undefined) {\n cleanupBag = nextCleanupBag;\n } else {\n cleanup = nextCleanup;\n }\n } finally {\n setCleanupCollector(prevCollector);\n firstRun = false;\n }\n };\n\n const safeFn = () => {\n if (running) {\n rerunRequested = true;\n return;\n }\n\n running = true;\n try {\n let reentrantRuns = 0;\n do {\n rerunRequested = false;\n runOnce();\n if (rerunRequested) {\n reentrantRuns++;\n if (reentrantRuns >= MAX_REENTRANT_RUNS) {\n reportError(\n new Error(`createEffect exceeded ${MAX_REENTRANT_RUNS} re-entrant runs`),\n 'effect',\n );\n rerunRequested = false;\n }\n }\n } while (rerunRequested);\n } finally {\n running = false;\n }\n };\n\n const dispose = rawEffect(safeFn);\n\n // Wrap dispose to also run final cleanups\n let disposed = false;\n const wrappedDispose = () => {\n if (disposed) return;\n disposed = true;\n dispose();\n if (cleanup !== undefined) {\n runCleanup(cleanup);\n cleanup = undefined;\n }\n if (cleanupBag !== undefined) {\n runCleanups(cleanupBag);\n releaseArray(cleanupBag);\n cleanupBag = undefined;\n }\n };\n\n // Register in current root scope (if any)\n if (shouldRegister) {\n registerDisposer(wrappedDispose);\n }\n\n return wrappedDispose;\n}\n","/**\n * Forma Reactive - Memo\n *\n * Alias for createComputed with SolidJS/React-familiar naming.\n * A memoized derived value that only recomputes when its dependencies change.\n *\n * TC39 Signals equivalent: Signal.Computed\n */\n\nimport { createComputed } from './computed.js';\n\n/**\n * Create a memoized computed value.\n * Identical to `createComputed` — provided for React/SolidJS familiarity.\n *\n * Note: Unlike SolidJS's createComputed (which is an eager synchronous\n * side effect), both createComputed and createMemo in FormaJS are lazy\n * cached derivations — equivalent to SolidJS's createMemo. They are\n * identical.\n *\n * The computation runs lazily and caches the result. It only recomputes\n * when a signal it reads during computation changes.\n *\n * ```ts\n * const [count, setCount] = createSignal(0);\n * const doubled = createMemo(() => count() * 2);\n * console.log(doubled()); // 0\n * setCount(5);\n * console.log(doubled()); // 10\n * ```\n */\nexport const createMemo: typeof createComputed = createComputed;\n","/**\n * Forma Reactive - Batch\n *\n * Groups multiple signal updates and defers effect execution until the\n * outermost batch completes. Prevents intermediate re-renders.\n * Backed by alien-signals.\n *\n * TC39 Signals: no built-in batch — this is a userland optimization.\n */\n\nimport { startBatch, endBatch } from 'alien-signals';\n\n/**\n * Group multiple signal updates so that effects only run once after all\n * updates have been applied.\n *\n * ```ts\n * batch(() => {\n * setA(1);\n * setB(2);\n * // effects that depend on A and B won't run yet\n * });\n * // effects run here, once\n * ```\n *\n * Batches are nestable — only the outermost batch triggers the flush.\n */\nexport function batch(fn: () => void): void {\n startBatch();\n try {\n fn();\n } finally {\n endBatch();\n }\n}\n","/**\n * Forma Reactive - Untrack\n *\n * Read signals without subscribing to them in the reactive graph.\n * Essential for reading values inside effects without creating dependencies.\n *\n * TC39 Signals equivalent: Signal.subtle.untrack()\n */\n\nimport { pauseTracking, resumeTracking } from 'alien-signals';\n\n/**\n * Execute a function without tracking signal reads.\n * Any signals read inside `fn` will NOT become dependencies of the\n * surrounding effect or computed.\n *\n * ```ts\n * createEffect(() => {\n * const a = count(); // tracked — effect re-runs when count changes\n * const b = untrack(() => other()); // NOT tracked — effect ignores other changes\n * });\n * ```\n */\nexport function untrack<T>(fn: () => T): T {\n pauseTracking();\n try {\n return fn();\n } finally {\n resumeTracking();\n }\n}\n","/**\n * Forma Reactive - On\n *\n * Explicit dependency tracking for effects.\n * Only re-runs when the specified signals change, ignoring all other reads.\n *\n * SolidJS equivalent: on()\n * Vue equivalent: watch() with explicit deps\n * React equivalent: useEffect dependency array\n */\n\nimport { untrack } from './untrack.js';\n\n/**\n * Create a tracked effect body that only fires when specific dependencies change.\n *\n * Wraps a function so that only the `deps` signals are tracked.\n * All signal reads inside `fn` are untracked (won't cause re-runs).\n *\n * Use with `createEffect`:\n *\n * ```ts\n * const [a, setA] = createSignal(1);\n * const [b, setB] = createSignal(2);\n *\n * // Only re-runs when `a` changes, NOT when `b` changes:\n * createEffect(on(a, (value, prev) => {\n * console.log(`a changed: ${prev} → ${value}, b is ${b()}`);\n * }));\n *\n * setA(10); // fires: \"a changed: 1 → 10, b is 2\"\n * setB(20); // does NOT fire\n * ```\n *\n * Multiple dependencies:\n * ```ts\n * createEffect(on(\n * () => [a(), b()] as const,\n * ([aVal, bVal], prev) => { ... }\n * ));\n * ```\n */\nexport function on<T, U>(\n deps: () => T,\n fn: (value: T, prev: T | undefined) => U,\n options?: { defer?: boolean },\n): () => U | undefined {\n let prev: T | undefined;\n let isFirst = true;\n\n return () => {\n // Track only the deps\n const value = deps();\n\n if (options?.defer && isFirst) {\n isFirst = false;\n prev = value;\n return undefined;\n }\n\n // Run the body untracked so it doesn't add extra dependencies\n const result = untrack(() => fn(value, prev));\n prev = value;\n return result;\n };\n}\n","/**\n * Forma Reactive - Ref\n *\n * Mutable container that does NOT trigger reactivity.\n * Use for DOM references, previous values, instance variables —\n * anything that needs to persist across effect re-runs without\n * causing re-execution.\n *\n * React equivalent: useRef\n * SolidJS equivalent: (none — uses plain variables in setup)\n */\n\nexport interface Ref<T> {\n current: T;\n}\n\n/**\n * Create a mutable ref container.\n *\n * Unlike signals, writing to `.current` does NOT trigger effects.\n * Use when you need a stable reference across reactive scopes.\n *\n * ```ts\n * const timerRef = createRef<number | null>(null);\n *\n * createEffect(() => {\n * timerRef.current = setInterval(tick, 1000);\n * onCleanup(() => clearInterval(timerRef.current!));\n * });\n *\n * // DOM ref pattern:\n * const elRef = createRef<HTMLElement | null>(null);\n * h('div', { ref: (el) => { elRef.current = el; } });\n * ```\n */\nexport function createRef<T>(initialValue: T): Ref<T> {\n return { current: initialValue };\n}\n","/**\n * Forma Reactive - Reducer\n *\n * State machine pattern — dispatch actions to a pure reducer function.\n * Fine-grained: only the resulting state signal is reactive.\n *\n * React equivalent: useReducer\n * SolidJS equivalent: (none — uses createSignal + helpers)\n */\n\nimport { createSignal, type SignalGetter } from './signal.js';\n\nexport type Dispatch<A> = (action: A) => void;\n\n/**\n * Create a reducer — predictable state updates via dispatched actions.\n *\n * The reducer function must be pure: `(state, action) => newState`.\n * Returns a [state, dispatch] tuple.\n *\n * ```ts\n * type Action = { type: 'increment' } | { type: 'decrement' } | { type: 'reset' };\n *\n * const [count, dispatch] = createReducer(\n * (state: number, action: Action) => {\n * switch (action.type) {\n * case 'increment': return state + 1;\n * case 'decrement': return state - 1;\n * case 'reset': return 0;\n * }\n * },\n * 0,\n * );\n *\n * dispatch({ type: 'increment' }); // count() === 1\n * dispatch({ type: 'increment' }); // count() === 2\n * dispatch({ type: 'reset' }); // count() === 0\n * ```\n */\nexport function createReducer<S, A>(\n reducer: (state: S, action: A) => S,\n initialState: S,\n): [state: SignalGetter<S>, dispatch: Dispatch<A>] {\n const [state, setState] = createSignal(initialState);\n\n const dispatch: Dispatch<A> = (action) => {\n setState((prev) => reducer(prev, action));\n };\n\n return [state, dispatch];\n}\n","/**\n * Forma Reactive - Suspense Context\n *\n * Shared context stack for Suspense boundaries. Lives in the reactive layer\n * (not DOM) so that createResource can import it without circular dependencies.\n *\n * The pattern mirrors the lifecycle context stack in component/define.ts.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface SuspenseContext {\n /** Increment when a resource starts loading inside this boundary. */\n increment(): void;\n /** Decrement when a resource resolves/rejects inside this boundary. */\n decrement(): void;\n}\n\n// ---------------------------------------------------------------------------\n// Context stack\n// ---------------------------------------------------------------------------\n\nlet currentSuspenseContext: SuspenseContext | null = null;\nconst suspenseStack: (SuspenseContext | null)[] = [];\n\nexport function pushSuspenseContext(ctx: SuspenseContext): void {\n suspenseStack.push(currentSuspenseContext);\n currentSuspenseContext = ctx;\n}\n\nexport function popSuspenseContext(): void {\n currentSuspenseContext = suspenseStack.pop() ?? null;\n}\n\n/** Get the current Suspense context (if any). Called by createResource. */\nexport function getSuspenseContext(): SuspenseContext | null {\n return currentSuspenseContext;\n}\n","/**\n * Forma Reactive - Resource\n *\n * Async data fetching primitive with reactive loading/error state.\n * Tracks a source signal and refetches when it changes.\n *\n * SolidJS equivalent: createResource\n * React equivalent: use() + Suspense (React 19), or useSWR/react-query\n */\n\nimport { createSignal, type SignalGetter } from './signal.js';\nimport { internalEffect } from './effect.js';\nimport { untrack } from './untrack.js';\nimport { getSuspenseContext } from './suspense-context.js';\n\nexport interface Resource<T> {\n /** The resolved data (or undefined while loading). */\n (): T | undefined;\n /** True while the fetcher is running. */\n loading: SignalGetter<boolean>;\n /** The error if the fetcher rejected (or undefined). */\n error: SignalGetter<unknown>;\n /** Manually refetch with the current source value. */\n refetch: () => void;\n /** Manually set the data (overrides fetcher result). */\n mutate: (value: T | undefined) => void;\n}\n\nexport interface ResourceOptions<T> {\n /** Initial value before first fetch resolves. */\n initialValue?: T;\n}\n\n/**\n * Create an async resource that fetches data reactively.\n *\n * When `source` changes, the fetcher re-runs automatically.\n * Provides reactive `loading` and `error` signals.\n *\n * ```ts\n * const [userId, setUserId] = createSignal(1);\n *\n * const user = createResource(\n * userId, // source signal\n * (id) => fetch(`/api/users/${id}`).then(r => r.json()), // fetcher\n * );\n *\n * internalEffect(() => {\n * if (user.loading()) console.log('Loading...');\n * else if (user.error()) console.log('Error:', user.error());\n * else console.log('User:', user());\n * });\n *\n * setUserId(2); // automatically refetches\n * ```\n *\n * Without a source signal (static fetch):\n * ```ts\n * const posts = createResource(\n * () => true, // constant source — fetches once\n * () => fetch('/api/posts').then(r => r.json()),\n * );\n * ```\n */\nexport function createResource<T, S = true>(\n source: SignalGetter<S>,\n fetcher: (source: S) => Promise<T>,\n options?: ResourceOptions<T>,\n): Resource<T> {\n const [data, setData] = createSignal<T | undefined>(options?.initialValue);\n const [loading, setLoading] = createSignal(false);\n const [error, setError] = createSignal<unknown>(undefined);\n\n // Capture the Suspense context at creation time (not at fetch time).\n // This is critical because the Suspense boundary pushes/pops its context\n // synchronously during children() execution.\n const suspenseCtx = getSuspenseContext();\n\n let abortController: AbortController | null = null;\n let fetchVersion = 0;\n\n const doFetch = () => {\n // Read source outside tracking to get current value\n const sourceValue = untrack(source);\n\n // Abort previous in-flight request\n if (abortController) {\n abortController.abort();\n }\n const controller = new AbortController();\n abortController = controller;\n\n const version = ++fetchVersion;\n const isLatest = () => version === fetchVersion;\n let suspensePending = false;\n\n // Notify Suspense boundary that a fetch has started\n if (suspenseCtx) {\n suspenseCtx.increment();\n suspensePending = true;\n }\n\n setLoading(true);\n setError(undefined);\n\n Promise.resolve(fetcher(sourceValue))\n .then((result) => {\n // Only apply if this is still the latest fetch and wasn't aborted.\n if (isLatest() && !controller.signal.aborted) {\n setData(() => result);\n }\n })\n .catch((err) => {\n if (isLatest() && !controller.signal.aborted) {\n // Ignore abort errors\n if (err?.name !== 'AbortError') {\n setError(err);\n }\n }\n })\n .finally(() => {\n if (suspensePending) suspenseCtx?.decrement();\n if (isLatest()) {\n setLoading(false);\n if (abortController === controller) {\n abortController = null; // Release controller for GC\n }\n }\n });\n };\n\n // Auto-fetch when source changes\n internalEffect(() => {\n source(); // track the source signal\n doFetch();\n });\n\n // Build the resource object\n const resource = (() => data()) as Resource<T>;\n resource.loading = loading;\n resource.error = error;\n resource.refetch = doFetch;\n resource.mutate = (value) => setData(() => value);\n\n return resource;\n}\n","/**\n * Forma DOM - Element\n *\n * Hyperscript-style element factory (`h`) and Fragment helper.\n * Backed by alien-signals via forma/reactive.\n *\n * Supports both HTML and SVG elements with automatic namespace detection.\n * Provides event listener cleanup via AbortController.\n */\n\nimport { internalEffect } from 'forma/reactive';\nimport { hydrating, type HydrationDescriptor } from './hydrate.js';\n\n/**\n * Symbol used as JSX Fragment factory. h(Fragment, null, ...children) returns DocumentFragment.\n *\n * Typed as a callable for TypeScript's JSX checker — at runtime it's a symbol\n * that h() detects via `tag === Fragment`. esbuild transforms `<>...</>` into\n * `h(Fragment, null, ...)` which never actually calls Fragment.\n */\nexport const Fragment: (props: { children?: unknown }) => DocumentFragment =\n Symbol.for('forma.fragment') as any;\n\n// ---------------------------------------------------------------------------\n// SVG namespace and tag detection\n// ---------------------------------------------------------------------------\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Known SVG tag names for O(1) lookup. */\nconst SVG_TAGS = new Set([\n 'svg',\n 'path',\n 'circle',\n 'rect',\n 'line',\n 'polyline',\n 'polygon',\n 'ellipse',\n 'g',\n 'text',\n 'tspan',\n 'textPath',\n 'defs',\n 'use',\n 'symbol',\n 'clipPath',\n 'mask',\n 'pattern',\n 'marker',\n 'linearGradient',\n 'radialGradient',\n 'stop',\n 'filter',\n 'feGaussianBlur',\n 'feColorMatrix',\n 'feOffset',\n 'feBlend',\n 'feMerge',\n 'feMergeNode',\n 'feComposite',\n 'feFlood',\n 'feMorphology',\n 'feTurbulence',\n 'feDisplacementMap',\n 'feImage',\n 'foreignObject',\n 'animate',\n 'animateTransform',\n 'animateMotion',\n 'set',\n 'image',\n 'switch',\n 'desc',\n 'title',\n 'metadata',\n]);\n\n// ---------------------------------------------------------------------------\n// Boolean HTML attributes (set/remove via setAttribute/removeAttribute)\n// ---------------------------------------------------------------------------\n\nconst BOOLEAN_ATTRS = new Set([\n 'disabled',\n 'checked',\n 'readonly',\n 'required',\n 'autofocus',\n 'autoplay',\n 'controls',\n 'default',\n 'defer',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'reversed',\n 'selected',\n 'async',\n]);\n\n// ---------------------------------------------------------------------------\n// Element prototype cache — cloneNode(false) is a C++ memcpy, faster than\n// createElement which must parse the tag string and validate.\n// \"Flexible Wings\" exploit: the prototypes pass static inspection (they're\n// standard elements) but flex at runtime to avoid parsing overhead.\n// ---------------------------------------------------------------------------\n\nlet ELEMENT_PROTOS: Record<string, HTMLElement> | null = null;\n\nfunction getProto(tag: string): HTMLElement {\n if (!ELEMENT_PROTOS) {\n ELEMENT_PROTOS = Object.create(null);\n // Pre-create prototypes for the 30 most common HTML tags\n for (const t of [\n 'div', 'span', 'p', 'a', 'li', 'ul', 'ol', 'button', 'input',\n 'label', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'section', 'header',\n 'footer', 'main', 'nav', 'table', 'tr', 'td', 'th', 'tbody',\n 'img', 'form', 'select', 'option', 'textarea', 'i', 'b', 'strong',\n 'em', 'small', 'article', 'aside', 'details', 'summary',\n ]) {\n ELEMENT_PROTOS![t] = document.createElement(t);\n }\n }\n return ELEMENT_PROTOS![tag] ?? (ELEMENT_PROTOS![tag] = document.createElement(tag));\n}\n\n// ---------------------------------------------------------------------------\n// Event name cache — avoids .slice(2).toLowerCase() string allocations\n// on every event binding. \"Super Clipping\" exploit.\n// ---------------------------------------------------------------------------\n\nconst EVENT_NAMES: Record<string, string> = Object.create(null);\n\nfunction eventName(key: string): string {\n return EVENT_NAMES[key] ?? (EVENT_NAMES[key] = key.slice(2).toLowerCase());\n}\n\n// ---------------------------------------------------------------------------\n// Symbol-based AbortController storage (avoids WeakMap overhead)\n// ---------------------------------------------------------------------------\n\nconst ABORT_SYM = Symbol.for('forma-abort');\n\n/** Get or lazily create an AbortController for an element. */\nfunction getAbortController(el: Element): AbortController {\n let controller = (el as any)[ABORT_SYM] as AbortController | undefined;\n if (!controller) {\n controller = new AbortController();\n (el as any)[ABORT_SYM] = controller;\n }\n return controller;\n}\n\n/**\n * Remove all event listeners previously attached via `h()` on the given element.\n *\n * Calls `AbortController.abort()` for the element, which automatically removes\n * every listener that was registered with its signal. The controller is then\n * deleted so a fresh one is created if the element is reused.\n */\nexport function cleanup(el: Element): void {\n const controller = (el as any)[ABORT_SYM] as AbortController | undefined;\n if (controller) {\n controller.abort();\n delete (el as any)[ABORT_SYM];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Attribute diffing cache (avoids redundant DOM writes)\n// ---------------------------------------------------------------------------\n\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction getCache(el: Element): Record<string, unknown> {\n return (el as any)[CACHE_SYM] ?? ((el as any)[CACHE_SYM] = Object.create(null));\n}\n\n// ---------------------------------------------------------------------------\n// Prop handler functions (extracted for dispatch table)\n// ---------------------------------------------------------------------------\n\ntype PropHandler = (el: Element, key: string, value: unknown) => void;\n\n/** Handle class / className prop. */\nfunction handleClass(el: Element, _key: string, value: unknown): void {\n if (typeof value === 'function') {\n internalEffect(() => {\n const v = (value as () => string)();\n const cache = getCache(el);\n if (cache['class'] === v) return;\n cache['class'] = v;\n if (el instanceof HTMLElement) {\n el.className = v;\n } else {\n el.setAttribute('class', v);\n }\n });\n } else {\n const cache = getCache(el);\n if (cache['class'] === value) return;\n cache['class'] = value;\n if (el instanceof HTMLElement) {\n el.className = value as string;\n } else {\n el.setAttribute('class', value as string);\n }\n }\n}\n\n/** Handle style prop. Reconciles object styles by removing stale keys. */\nfunction handleStyle(el: Element, _key: string, value: unknown): void {\n if (typeof value === 'function') {\n let prevKeys: string[] = [];\n internalEffect(() => {\n const v = (value as () => string | Record<string, string>)();\n if (typeof v === 'string') {\n const cache = getCache(el);\n if (cache['style'] === v) return;\n cache['style'] = v;\n prevKeys = [];\n (el as HTMLElement | SVGElement).style.cssText = v;\n } else if (v && typeof v === 'object') {\n const style = (el as HTMLElement | SVGElement).style;\n const nextKeys = Object.keys(v);\n // Remove keys that were present last time but are absent now\n for (const k of prevKeys) {\n if (!(k in (v as Record<string, string>))) {\n style.removeProperty(k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()));\n }\n }\n Object.assign(style, v);\n prevKeys = nextKeys;\n }\n });\n } else if (typeof value === 'string') {\n const cache = getCache(el);\n if (cache['style'] === value) return;\n cache['style'] = value;\n (el as HTMLElement | SVGElement).style.cssText = value;\n } else if (value && typeof value === 'object') {\n Object.assign((el as HTMLElement | SVGElement).style, value);\n }\n}\n\n/** Handle event handler props (onClick, onInput, etc.). Cached eventName. */\nfunction handleEvent(el: Element, key: string, value: unknown): void {\n const controller = getAbortController(el);\n el.addEventListener(\n eventName(key),\n value as EventListener,\n { signal: controller.signal },\n );\n}\n\n/**\n * Handle dangerouslySetInnerHTML prop.\n *\n * **Security:** No sanitization is performed. Never pass user-controlled\n * strings through `__html` — this will create an XSS vulnerability.\n * Only use with trusted, server-generated markup.\n *\n * Supports both static `{ __html: string }` values and reactive functions\n * that return `{ __html: string }`.\n */\nfunction handleInnerHTML(el: Element, _key: string, value: unknown): void {\n if (typeof value === 'function') {\n internalEffect(() => {\n const resolved = (value as () => unknown)();\n if (resolved == null) {\n el.innerHTML = '';\n return;\n }\n if (typeof resolved !== 'object' || !('__html' in (resolved as any))) {\n throw new TypeError(\n 'dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof resolved,\n );\n }\n const html = (resolved as { __html: string }).__html;\n if (typeof html !== 'string') {\n throw new TypeError(\n 'dangerouslySetInnerHTML: __html must be a string, got ' + typeof html,\n );\n }\n const cache = getCache(el);\n if (cache['innerHTML'] === html) return;\n cache['innerHTML'] = html;\n el.innerHTML = html;\n });\n } else {\n if (value == null) {\n el.innerHTML = '';\n return;\n }\n if (typeof value !== 'object' || !('__html' in (value as any))) {\n throw new TypeError(\n 'dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof value,\n );\n }\n const html = (value as { __html: string }).__html;\n if (typeof html !== 'string') {\n throw new TypeError(\n 'dangerouslySetInnerHTML: __html must be a string, got ' + typeof html,\n );\n }\n el.innerHTML = html;\n }\n}\n\n/** Handle xlink: namespaced SVG attributes. */\nfunction handleXLink(el: Element, key: string, value: unknown): void {\n const localName = key.slice(6); // strip \"xlink:\" prefix\n if (typeof value === 'function') {\n internalEffect(() => {\n const v = (value as () => unknown)();\n if (v == null || v === false) {\n el.removeAttributeNS(XLINK_NS, localName);\n } else {\n el.setAttributeNS(XLINK_NS, key, String(v));\n }\n });\n } else {\n if (value == null || value === false) {\n el.removeAttributeNS(XLINK_NS, localName);\n } else {\n el.setAttributeNS(XLINK_NS, key, String(value));\n }\n }\n}\n\n/** Handle boolean attributes (disabled, checked, etc.). */\nfunction handleBooleanAttr(el: Element, key: string, value: unknown): void {\n if (typeof value === 'function') {\n internalEffect(() => {\n const v = (value as () => boolean)();\n const cache = getCache(el);\n if (cache[key] === v) return;\n cache[key] = v;\n if (v) {\n el.setAttribute(key, '');\n } else {\n el.removeAttribute(key);\n }\n });\n } else {\n const cache = getCache(el);\n if (cache[key] === value) return;\n cache[key] = value;\n if (value) {\n el.setAttribute(key, '');\n } else {\n el.removeAttribute(key);\n }\n }\n}\n\n/** Handle generic attributes with setAttribute/removeAttribute. */\nfunction handleGenericAttr(el: Element, key: string, value: unknown): void {\n if (typeof value === 'function') {\n internalEffect(() => {\n const v = (value as () => unknown)();\n if (v == null || v === false) {\n const cache = getCache(el);\n if (cache[key] === null) return;\n cache[key] = null;\n el.removeAttribute(key);\n } else {\n const strVal = String(v);\n const cache = getCache(el);\n if (cache[key] === strVal) return;\n cache[key] = strVal;\n el.setAttribute(key, strVal);\n }\n });\n } else {\n if (value == null || value === false) {\n const cache = getCache(el);\n if (cache[key] === null) return;\n cache[key] = null;\n el.removeAttribute(key);\n } else {\n const strVal = String(value);\n const cache = getCache(el);\n if (cache[key] === strVal) return;\n cache[key] = strVal;\n el.setAttribute(key, strVal);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Prop dispatch table (O(1) Map lookup replaces sequential if/else chain)\n// ---------------------------------------------------------------------------\n\nconst PROP_HANDLERS = new Map<string, PropHandler>();\n\n// Register specific prop handlers\nPROP_HANDLERS.set('class', handleClass);\nPROP_HANDLERS.set('className', handleClass);\nPROP_HANDLERS.set('style', handleStyle);\nPROP_HANDLERS.set('ref', () => {}); // no-op, handled in h()\nPROP_HANDLERS.set('dangerouslySetInnerHTML', handleInnerHTML);\n\n// Register boolean attrs into the dispatch table\nfor (const attr of BOOLEAN_ATTRS) {\n PROP_HANDLERS.set(attr, handleBooleanAttr);\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Apply a single prop to an element (supports both HTML and SVG). */\nfunction applyProp(el: Element, key: string, value: unknown): void {\n // \"Twin Chassis\" exploit: inline check for the #1 most common prop\n // String === is ~2ns vs Map.get() ~8ns. Saves 75% dispatch time for 'class'.\n if (key === 'class') { handleClass(el, key, value); return; }\n\n // 2. Event handler detection (2-char check, faster than startsWith)\n // Events are the #2 most common prop type — check before Map.\n if (key.charCodeAt(0) === 111 /* 'o' */ && key.charCodeAt(1) === 110 /* 'n' */ && key.length > 2) {\n handleEvent(el, key, value); return;\n }\n\n // 3. Dispatch table for remaining known props (className, style, boolean attrs)\n const handler = PROP_HANDLERS.get(key);\n if (handler) { handler(el, key, value); return; }\n\n // 4. xlink: namespace (rare, check last)\n if (key.charCodeAt(0) === 120 /* 'x' */ && key.startsWith('xlink:')) {\n handleXLink(el, key, value); return;\n }\n\n // 5. Generic attribute fallback\n handleGenericAttr(el, key, value);\n}\n\n// ---------------------------------------------------------------------------\n// \"Blown Diffuser\" — static prop fast path (no cache, no effects)\n// Used only during h() initial element creation for non-function prop values.\n// Saves: getCache() lookup, cache diff check, cache write — per static prop.\n// ---------------------------------------------------------------------------\n\nfunction applyStaticProp(el: Element, key: string, value: unknown): void {\n if (value == null || value === false) return;\n\n if (key === 'class' || key === 'className') {\n (el as HTMLElement).className = value as string;\n return;\n }\n\n if (key === 'style') {\n if (typeof value === 'string') {\n (el as HTMLElement | SVGElement).style.cssText = value;\n } else if (value && typeof value === 'object') {\n Object.assign((el as HTMLElement | SVGElement).style, value);\n }\n return;\n }\n\n if (key === 'dangerouslySetInnerHTML') {\n if (typeof value !== 'object' || !('__html' in (value as any))) {\n throw new TypeError(\n 'dangerouslySetInnerHTML: expected { __html: string }, got ' + typeof value,\n );\n }\n const html = (value as { __html: string }).__html;\n if (typeof html !== 'string') {\n throw new TypeError(\n 'dangerouslySetInnerHTML: __html must be a string, got ' + typeof html,\n );\n }\n el.innerHTML = html;\n return;\n }\n\n // xlink: namespace\n if (key.charCodeAt(0) === 120 /* x */ && key.startsWith('xlink:')) {\n el.setAttributeNS(XLINK_NS, key, String(value));\n return;\n }\n\n // Boolean attrs\n if (BOOLEAN_ATTRS.has(key)) {\n if (value) el.setAttribute(key, '');\n return;\n }\n\n // Generic: true → empty string attribute, else stringified value\n if (value === true) {\n el.setAttribute(key, '');\n } else {\n el.setAttribute(key, String(value));\n }\n}\n\n/** Append a single child to a parent node. */\nfunction appendChild(parent: Node, child: unknown): void {\n // \"Active Suspension\" exploit: check the MOST COMMON type first.\n // In h('div', props, h('span'), h('button')), children are Nodes 70%+ of the time.\n // instanceof Node returns false in O(1) for primitives (null, string, number)\n // because V8 checks \"is this an object?\" first — no prototype chain walk.\n // This saves 3-5 wasted type comparisons vs the conventional null-first order.\n if (child instanceof Node) {\n parent.appendChild(child);\n return;\n }\n\n // \"Track Limits\": new Text() bypasses Document.createTextNode's validation.\n if (typeof child === 'string') {\n parent.appendChild(new Text(child));\n return;\n }\n\n // Null/false/true → skip (React-style conditional pattern)\n if (child == null || child === false || child === true) {\n return;\n }\n\n if (typeof child === 'number') {\n parent.appendChild(new Text(String(child)));\n return;\n }\n\n // Function child: reactive binding via signal getter.\n // The return value determines the binding type:\n // - Node (from h() call) → append/replace as element\n // - primitive (string/number/null) → bind as text\n if (typeof child === 'function') {\n if (parent instanceof Element) {\n (parent as any)[DYNAMIC_CHILD_SYM] = true;\n }\n let currentNode: Node | null = null;\n internalEffect(() => {\n const v = (child as () => unknown)();\n if (v instanceof Node) {\n // Function returned a DOM element — adopt or replace\n if (currentNode) {\n parent.replaceChild(v, currentNode);\n } else {\n parent.appendChild(v);\n }\n currentNode = v;\n } else {\n // Primitive value — bind as text\n const text = typeof v === 'symbol' ? String(v) : String(v ?? '');\n if (!currentNode) {\n currentNode = new Text(text);\n parent.appendChild(currentNode);\n } else if (currentNode.nodeType === 3) {\n (currentNode as Text).data = text;\n } else {\n const tn = new Text(text);\n parent.replaceChild(tn, currentNode);\n currentNode = tn;\n }\n }\n });\n return;\n }\n\n if (Array.isArray(child)) {\n for (const item of child) {\n appendChild(parent, item);\n }\n return;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a real DOM element with optional props and children.\n *\n * Supports both HTML and SVG elements. SVG tags are detected automatically\n * and created with the correct SVG namespace. Inside a `foreignObject`,\n * children switch back to the HTML namespace.\n *\n * Event listeners are attached with an AbortController signal so they can\n * be removed in bulk via `cleanup(el)`.\n *\n * Hyperscript-style API:\n * ```ts\n * h('div', { class: 'container', onClick: handleClick },\n * h('span', null, 'Hello'),\n * h('span', null, name), // name is a signal getter\n * )\n *\n * h('svg', { viewBox: '0 0 24 24', fill: 'none' },\n * h('path', { d: 'M12 2L2 22h20L12 2z', stroke: 'currentColor' }),\n * )\n * ```\n */\n// Overloads: function component, Fragment, string\nexport function h(tag: (props: Record<string, unknown>) => unknown, props?: Record<string, unknown> | null, ...children: unknown[]): Node;\nexport function h(tag: typeof Fragment, props?: null, ...children: unknown[]): DocumentFragment;\nexport function h(tag: string, props?: Record<string, unknown> | null, ...children: unknown[]): HTMLElement;\nexport function h(\n tag: string | typeof Fragment | ((props: Record<string, unknown>) => unknown),\n props?: Record<string, unknown> | null,\n ...children: unknown[]\n): HTMLElement | DocumentFragment {\n // Function component: call with merged props + children\n if (typeof tag === 'function' && tag !== Fragment) {\n const mergedProps = { ...(props ?? {}), children };\n return tag(mergedProps) as unknown as HTMLElement;\n }\n\n // Fragment: return DocumentFragment with children\n if (tag === Fragment) {\n const frag = document.createDocumentFragment();\n for (const child of children) {\n appendChild(frag, child);\n }\n return frag;\n }\n\n // After the Fragment guard above, tag is guaranteed to be a string\n const tagName = tag as string;\n\n if (hydrating) {\n return { type: 'element', tag: tagName, props: props ?? null, children } as unknown as HTMLElement;\n }\n\n // \"Flexible Wings\" exploit: for HTML elements, clone a pre-created prototype\n // instead of calling createElement. cloneNode(false) is a single C++ memcpy\n // that copies the element's internal state without parsing the tag string.\n // Skip the SVG Set lookup entirely when the tag is in the proto cache (hot path).\n let el: Element;\n if (ELEMENT_PROTOS && ELEMENT_PROTOS[tagName]) {\n el = ELEMENT_PROTOS[tagName]!.cloneNode(false) as HTMLElement;\n } else if (SVG_TAGS.has(tagName)) {\n el = document.createElementNS(SVG_NS, tagName);\n } else {\n el = getProto(tagName).cloneNode(false) as HTMLElement;\n }\n\n // \"Blown Diffuser\" exploit: split props into static and dynamic paths.\n // Static props (string/number/boolean literals) go through a zero-cache\n // fast path. Only dynamic props (function values) need the attribute cache\n // for diffing on re-runs. This avoids:\n // - Object.create(null) allocation for elements with only static props\n // - Cache read/write operations that always miss on first call\n // - getCache() indirection in every prop handler\n if (props) {\n let hasDynamic = false;\n for (const key in props) {\n if (key === 'ref') continue;\n const value = props[key];\n\n // Event handlers: no cache needed, direct binding\n if (key.charCodeAt(0) === 111 /* o */ && key.charCodeAt(1) === 110 /* n */ && key.length > 2) {\n handleEvent(el, key, value);\n continue;\n }\n\n // Dynamic prop (function value, not event): needs cache + effect\n if (typeof value === 'function') {\n if (!hasDynamic) {\n // Lazy-allocate cache only when first dynamic prop is found\n (el as any)[CACHE_SYM] = Object.create(null);\n hasDynamic = true;\n }\n applyProp(el, key, value);\n continue;\n }\n\n // Static prop: zero-cache fast path — direct DOM write\n applyStaticProp(el, key, value);\n }\n }\n\n // Append children — fast path for single string/number child avoids\n // Text node allocation + separate appendChild. el.textContent is a single\n // native C++ call that combines both operations.\n const childLen = children.length;\n if (childLen === 1) {\n const only = children[0];\n if (typeof only === 'string') {\n el.textContent = only;\n } else if (typeof only === 'number') {\n el.textContent = String(only);\n } else {\n appendChild(el, only);\n }\n } else if (childLen > 1) {\n for (const child of children) {\n appendChild(el, child);\n }\n }\n\n // Call ref after element is fully constructed\n if (props && typeof props['ref'] === 'function') {\n (props['ref'] as (el: Element) => void)(el);\n }\n\n return el as unknown as HTMLElement;\n}\n\n/**\n * Create a DocumentFragment from children.\n *\n * ```ts\n * fragment(\n * h('li', null, 'one'),\n * h('li', null, 'two'),\n * )\n * ```\n */\nexport function fragment(...children: unknown[]): DocumentFragment {\n const frag = document.createDocumentFragment();\n for (const child of children) {\n appendChild(frag, child);\n }\n return frag;\n}\n","/**\n * Forma DOM - Show (Conditional Rendering)\n *\n * Surgically swaps a single DOM node based on a boolean signal.\n * Uses comment markers (like createList) for zero-wrapper rendering.\n * When condition changes, only ONE node is removed and ONE inserted.\n *\n * Each branch is rendered inside createRoot + untrack so that:\n * 1. Inner effects survive when the show effect re-runs (alien-signals\n * would otherwise dispose child effects linked to the parent).\n * 2. Inner effects are explicitly disposed when the branch changes.\n *\n * SolidJS equivalent: <Show when={} fallback={}>\n */\n\nimport { internalEffect, untrack, createRoot } from 'forma/reactive';\nimport { hydrating, type ShowDescriptor } from './hydrate.js';\n\n/**\n * Conditionally render content based on a reactive boolean.\n *\n * ```ts\n * const [show, setShow] = createSignal(true);\n * const fragment = createShow(\n * show,\n * () => h('div', null, 'Visible!'),\n * () => h('div', null, 'Hidden fallback'),\n * );\n * container.appendChild(fragment);\n * ```\n *\n * Returns a DocumentFragment with comment markers. The content between\n * markers is swapped reactively when `when()` changes.\n */\nexport function createShow(\n when: () => unknown,\n thenFn: () => Node,\n elseFn?: () => Node,\n): DocumentFragment {\n if (hydrating) {\n const branch = when() ? thenFn() : (elseFn?.() ?? null);\n return {\n type: 'show',\n condition: when,\n whenTrue: thenFn,\n whenFalse: elseFn,\n initialBranch: branch,\n } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-show');\n const endMarker = document.createComment('/forma-show');\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n let currentNode: Node | null = null;\n let lastTruthy: boolean | null = null;\n let currentDispose: (() => void) | null = null;\n\n const showDispose = internalEffect(() => {\n const truthy = !!when();\n const DEBUG = typeof (globalThis as any).__FORMA_DEBUG__ !== 'undefined';\n const DEBUG_LABEL = DEBUG ? thenFn.toString().slice(0, 60) : '';\n\n if (truthy === lastTruthy) {\n if (DEBUG) console.log('[forma:show] skip (same)', truthy, DEBUG_LABEL);\n return;\n }\n if (DEBUG) console.log('[forma:show]', lastTruthy, '→', truthy, DEBUG_LABEL);\n lastTruthy = truthy;\n\n const parent = startMarker.parentNode;\n if (!parent) {\n if (DEBUG) console.warn('[forma:show] parentNode is null! skipping.', DEBUG_LABEL);\n return;\n }\n if (DEBUG) console.log('[forma:show] parent:', parent.nodeName, 'inDoc:', document.contains(parent as any));\n\n // Dispose previous branch's inner effects\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n\n // Remove current node. If it was a DocumentFragment, its children\n // transferred to the DOM on insertion and the fragment is now detached.\n // In that case, clear everything between the markers.\n if (currentNode) {\n if (currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n } else {\n while (startMarker.nextSibling && startMarker.nextSibling !== endMarker) {\n parent.removeChild(startMarker.nextSibling);\n }\n }\n }\n\n // Render inside createRoot so child effects are tracked for disposal,\n // and inside untrack so they are NOT linked to the show effect\n // (alien-signals disposes child effects on parent re-run, which would\n // kill reactivity in branches whose condition stays the same).\n const branchFn = truthy ? thenFn : elseFn;\n if (branchFn) {\n let branchDispose!: () => void;\n currentNode = createRoot((dispose) => {\n branchDispose = dispose;\n return untrack(() => branchFn());\n });\n currentDispose = branchDispose;\n } else {\n currentNode = null;\n }\n\n if (currentNode) {\n parent.insertBefore(currentNode, endMarker);\n }\n });\n\n // Attach cleanup so external disposal can clean up the branch and effect.\n (fragment as any).__showDispose = () => {\n showDispose();\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n };\n\n return fragment;\n}\n","/**\n * FormaJS DOM - Hydrate\n *\n * Descriptor-based island hydration. During hydration, h() returns plain\n * descriptor objects instead of DOM elements. A top-down walk (adoptNode)\n * then matches these descriptors against SSR DOM to attach events and\n * reactive bindings. No DOM elements are created during hydration.\n */\n\nimport { internalEffect, createSignal, untrack, __DEV__ } from 'forma/reactive';\nimport { h } from './element.js';\nimport { reconcileList, createList } from './list.js';\nimport { createShow } from './show.js';\n\n// Same symbol identity as element.ts — Symbol.for() guarantees cross-module\n// sharing so cleanup(el) in element.ts aborts controllers created here.\nconst ABORT_SYM = Symbol.for('forma-abort');\n\n// ---------------------------------------------------------------------------\n// Hydration state — module-level boolean\n// ---------------------------------------------------------------------------\n\n/** True while hydration is in progress. Checked by h() to branch. */\nexport let hydrating = false;\n\n/**\n * Set the hydrating state. Used internally by hydration functions.\n * Required because `export let` cannot be reassigned from outside the module.\n */\nexport function setHydrating(value: boolean): void {\n hydrating = value;\n}\n\n// ---------------------------------------------------------------------------\n// Descriptor interfaces\n// ---------------------------------------------------------------------------\n\n/** Descriptor returned by h() during hydration instead of a real Element. */\nexport interface HydrationDescriptor {\n type: 'element';\n tag: string;\n props: Record<string, unknown> | null;\n children: unknown[];\n}\n\n/** Descriptor returned by createShow() during hydration. */\nexport interface ShowDescriptor {\n type: 'show';\n condition: () => unknown;\n whenTrue: () => unknown;\n whenFalse?: () => unknown;\n initialBranch: unknown;\n}\n\n/** Descriptor returned by createList() during hydration. */\nexport interface ListDescriptor {\n type: 'list';\n items: () => unknown[];\n keyFn: (item: unknown) => string | number;\n renderFn: (item: unknown, index: () => number) => HTMLElement;\n options?: Record<string, unknown>;\n}\n\n/** Maps built by collectMarkers() for O(1) marker lookup during adoption. */\nexport interface MarkerMap {\n text: Map<number, Text>;\n show: Map<number, { start: Comment; end: Comment; cachedContent: DocumentFragment | null }>;\n list: Map<number, { start: Comment; end: Comment }>;\n}\n\n// ---------------------------------------------------------------------------\n// Type guards\n// ---------------------------------------------------------------------------\n\n/** Check if a value is a HydrationDescriptor. */\nexport function isDescriptor(v: unknown): v is HydrationDescriptor {\n return v != null && typeof v === 'object' && 'type' in v && v.type === 'element';\n}\n\n/** Check if a value is a ShowDescriptor. */\nexport function isShowDescriptor(v: unknown): v is ShowDescriptor {\n return v != null && typeof v === 'object' && 'type' in v && v.type === 'show';\n}\n\n/** Check if a value is a ListDescriptor. */\nexport function isListDescriptor(v: unknown): v is ListDescriptor {\n return v != null && typeof v === 'object' && 'type' in v && v.type === 'list';\n}\n\n// ---------------------------------------------------------------------------\n// collectMarkers() — single-pass TreeWalker\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the DOM under `root` once, collecting text and show markers into a\n * MarkerMap for O(1) lookup during adoptNode().\n *\n * Text markers: `<!--f:t0-->`, `<!--f:t1-->`, ... followed by a Text node\n * Show markers: `<!--f:s0-->` ... `<!--/f:s0-->` pairs\n */\nexport function collectMarkers(root: Element): MarkerMap {\n const text = new Map<number, Text>();\n const show = new Map<number, { start: Comment; end: Comment; cachedContent: DocumentFragment | null }>();\n const list = new Map<number, { start: Comment; end: Comment }>();\n\n // Pending show-start comments keyed by index, waiting for their closing marker\n const pendingShow = new Map<number, Comment>();\n // Pending list-start comments keyed by index, waiting for their closing marker\n const pendingList = new Map<number, Comment>();\n\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_ALL, {\n acceptNode(node) {\n // Skip child island subtrees (REJECT = skip node AND all descendants)\n if (node !== root && node.nodeType === 1 &&\n (node as Element).hasAttribute('data-forma-island')) {\n return NodeFilter.FILTER_REJECT;\n }\n // Only process comments and text nodes\n if (node.nodeType === Node.COMMENT_NODE || node.nodeType === Node.TEXT_NODE) {\n return NodeFilter.FILTER_ACCEPT;\n }\n // Elements: skip the node itself but walk into children\n return NodeFilter.FILTER_SKIP;\n }\n });\n\n while (walker.nextNode()) {\n const node = walker.currentNode;\n\n if (node.nodeType === Node.COMMENT_NODE) {\n const data = (node as Comment).data;\n\n // Text marker: \"f:t<index>\"\n if (data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 116 /* t */) {\n const idx = parseInt(data.slice(3), 10);\n if (!isNaN(idx)) {\n // The text node is the next sibling\n const next = node.nextSibling;\n if (next && next.nodeType === Node.TEXT_NODE) {\n text.set(idx, next as Text);\n }\n }\n continue;\n }\n\n // Show opening marker: \"f:s<index>\"\n if (data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 115 /* s */) {\n const idx = parseInt(data.slice(3), 10);\n if (!isNaN(idx)) {\n pendingShow.set(idx, node as Comment);\n }\n continue;\n }\n\n // Show closing marker: \"/f:s<index>\"\n if (data.length >= 5 && data.charCodeAt(0) === 47 /* / */ && data.charCodeAt(1) === 102 /* f */ && data.charCodeAt(2) === 58 /* : */ && data.charCodeAt(3) === 115 /* s */) {\n const idx = parseInt(data.slice(4), 10);\n if (!isNaN(idx)) {\n const start = pendingShow.get(idx);\n if (start) {\n show.set(idx, { start, end: node as Comment, cachedContent: null });\n pendingShow.delete(idx);\n }\n }\n continue;\n }\n\n // List opening marker: \"f:l<index>\"\n if (data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 108 /* l */) {\n const idx = parseInt(data.slice(3), 10);\n if (!isNaN(idx)) {\n pendingList.set(idx, node as Comment);\n }\n continue;\n }\n\n // List closing marker: \"/f:l<index>\"\n if (data.length >= 5 && data.charCodeAt(0) === 47 /* / */ && data.charCodeAt(1) === 102 /* f */ && data.charCodeAt(2) === 58 /* : */ && data.charCodeAt(3) === 108 /* l */) {\n const idx = parseInt(data.slice(4), 10);\n if (!isNaN(idx)) {\n const start = pendingList.get(idx);\n if (start) {\n list.set(idx, { start, end: node as Comment });\n pendingList.delete(idx);\n }\n }\n continue;\n }\n }\n }\n\n return { text, show, list };\n}\n\n// ---------------------------------------------------------------------------\n// applyDynamicProps()\n// ---------------------------------------------------------------------------\n\n/**\n * Attach event handlers and reactive attribute bindings to an existing\n * SSR element. Static (non-function) props are skipped because they are\n * already baked into the server HTML.\n */\nexport function applyDynamicProps(el: Element, props: Record<string, unknown> | null): void {\n if (!props) return;\n\n for (const key in props) {\n const value = props[key];\n\n // Skip non-function values — they are static and already in the SSR HTML\n if (typeof value !== 'function') continue;\n\n // Event handlers: onXxx — use AbortController so cleanup(el) removes them\n if (key.charCodeAt(0) === 111 /* o */ && key.charCodeAt(1) === 110 /* n */ && key.length > 2) {\n let ac = (el as any)[ABORT_SYM] as AbortController | undefined;\n if (!ac) {\n ac = new AbortController();\n (el as any)[ABORT_SYM] = ac;\n }\n el.addEventListener(key.slice(2).toLowerCase(), value as EventListener, { signal: ac.signal });\n continue;\n }\n\n // Reactive attribute binding (function, non-event)\n const fn = value as () => unknown;\n const attrKey = key; // capture for closure\n internalEffect(() => {\n const v = fn();\n if (v === false || v == null) {\n el.removeAttribute(attrKey);\n } else if (v === true) {\n el.setAttribute(attrKey, '');\n } else {\n el.setAttribute(attrKey, String(v));\n }\n });\n }\n}\n\n// ---------------------------------------------------------------------------\n// descriptorToElement()\n// ---------------------------------------------------------------------------\n\n/**\n * Convert any hydration-mode value (descriptor, show, list, or Node) back\n * into a real DOM Node. Used when SSR content mismatches client state and\n * the framework needs to create fresh DOM from captured descriptors.\n *\n * Temporarily exits hydration mode so h(), createShow(), createList()\n * create real elements with reactive bindings.\n */\nexport function ensureNode(value: unknown): Node | null {\n if (value instanceof Node) return value;\n if (value == null || value === false || value === true) return null;\n if (typeof value === 'string') return new Text(value);\n if (typeof value === 'number') return new Text(String(value));\n if (isDescriptor(value)) return descriptorToElement(value);\n if (isShowDescriptor(value)) {\n const prevH = hydrating;\n hydrating = false;\n try {\n return createShow(\n value.condition,\n () => ensureNode(value.whenTrue()) ?? document.createComment('empty'),\n value.whenFalse\n ? () => ensureNode(value.whenFalse!()) ?? document.createComment('empty')\n : undefined,\n );\n } finally {\n hydrating = prevH;\n }\n }\n if (isListDescriptor(value)) {\n const prevH = hydrating;\n hydrating = false;\n try {\n return createList(value.items, value.keyFn, value.renderFn, value.options);\n } finally {\n hydrating = prevH;\n }\n }\n return null;\n}\n\n/**\n * Convert a HydrationDescriptor back into a real DOM Element by calling h().\n * Used as a fallback when SSR DOM is missing or mismatched.\n *\n * Temporarily exits hydration mode so h() creates real elements.\n * Handles nested ShowDescriptor and ListDescriptor children by converting\n * them to real reactive primitives (createShow, createList).\n */\nexport function descriptorToElement(desc: HydrationDescriptor): Element {\n const prevHydrating = hydrating;\n hydrating = false;\n\n try {\n // Map children: recurse for nested descriptors, convert Show/List\n const children = desc.children.map((child) => {\n if (isDescriptor(child)) return descriptorToElement(child);\n if (isShowDescriptor(child)) return ensureNode(child);\n if (isListDescriptor(child)) return ensureNode(child);\n return child;\n });\n\n return h(desc.tag, desc.props, ...children);\n } finally {\n hydrating = prevHydrating;\n }\n}\n\n// ---------------------------------------------------------------------------\n// DOM cursor helpers for adoptNode\n// ---------------------------------------------------------------------------\n\n/** Check if comment data is an island start marker (f:iN). */\nfunction isIslandStart(data: string): boolean {\n return data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 105 /* i */;\n}\n\n/** Check if comment data is a show start marker (f:sN). */\nfunction isShowStart(data: string): boolean {\n return data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 115 /* s */;\n}\n\n/** Check if comment data is a text marker (f:tN). */\nfunction isTextStart(data: string): boolean {\n return data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 116 /* t */;\n}\n\n/** Check if comment data is a list start marker (f:lN). */\nfunction isListStart(data: string): boolean {\n return data.length >= 4 && data.charCodeAt(0) === 102 /* f */ && data.charCodeAt(1) === 58 /* : */ && data.charCodeAt(2) === 108 /* l */;\n}\n\n/** Find the closing comment marker for a start marker (e.g., f:i0 → /f:i0). */\nfunction findClosingMarker(start: Comment): Comment | null {\n const closing = '/' + start.data;\n let node: Node | null = start.nextSibling;\n while (node) {\n if (node.nodeType === 8 && (node as Comment).data === closing) {\n return node as Comment;\n }\n node = node.nextSibling;\n }\n return null;\n}\n\n/** Find the first Text node between two comment markers (exclusive). */\nfunction findTextBetween(start: Comment, end: Comment): Text | null {\n let node: Node | null = start.nextSibling;\n while (node && node !== end) {\n if (node.nodeType === 3) return node as Text;\n node = node.nextSibling;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Show descriptor helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Find the first Element node between two comment markers (exclusive).\n */\nfunction nextElementBetweenMarkers(start: Comment, end: Comment): Element | undefined {\n let node: Node | null = start.nextSibling;\n while (node && node !== end) {\n if (node.nodeType === 1) return node as Element;\n node = node.nextSibling;\n }\n return undefined;\n}\n\n/**\n * Extract all nodes between two comment markers into a DocumentFragment.\n * The markers themselves are left in place.\n */\nfunction extractContentBetweenMarkers(start: Comment, end: Comment): DocumentFragment {\n const frag = document.createDocumentFragment();\n let node = start.nextSibling;\n while (node && node !== end) {\n const next = node.nextSibling;\n frag.appendChild(node);\n node = next;\n }\n return frag;\n}\n\n/**\n * Set up reactive show effect after hydration adoption.\n *\n * During initial hydration, content is adopted in place (no DOM movement).\n * On first toggle, current content is scooped into a cached fragment.\n * Subsequent toggles swap between cached fragments (pure DOM moves, no re-render).\n */\nfunction setupShowEffect(\n desc: ShowDescriptor,\n marker: { start: Comment; end: Comment; cachedContent: DocumentFragment | null },\n): void {\n let currentCondition = !!desc.condition();\n let thenFragment: DocumentFragment | null = null;\n let elseFragment: DocumentFragment | null = null;\n\n // Reverse mismatch: SSR is empty but client condition is true.\n // Insert truthy content immediately so the user sees correct content.\n const hasSSRContent = marker.start.nextSibling !== marker.end;\n if (!hasSSRContent && currentCondition) {\n if (__DEV__) console.warn('[forma] Hydration: show condition mismatch — SSR empty but client condition is true');\n const trueBranch = desc.whenTrue();\n if (trueBranch instanceof Node) {\n marker.start.parentNode!.insertBefore(trueBranch, marker.end);\n }\n }\n\n internalEffect(() => {\n const next = !!desc.condition();\n if (next === currentCondition) return;\n currentCondition = next;\n\n const parent = marker.start.parentNode;\n if (!parent) return;\n\n // Cache current content\n const current = extractContentBetweenMarkers(marker.start, marker.end);\n if (!next) {\n thenFragment = current;\n } else {\n elseFragment = current;\n }\n\n // Insert the appropriate branch: cached fragment if available, else factory\n let branch: unknown = next\n ? (thenFragment ?? desc.whenTrue())\n : (desc.whenFalse ? (elseFragment ?? desc.whenFalse()) : null);\n\n if (next && thenFragment) thenFragment = null; // consumed\n if (!next && elseFragment) elseFragment = null; // consumed\n\n // Convert hydration descriptors to real DOM (happens when SSR/client\n // branch mismatch causes the factory to return a pre-computed descriptor)\n if (branch != null && !(branch instanceof Node)) {\n branch = ensureNode(branch);\n }\n\n if (branch instanceof Node) {\n parent.insertBefore(branch, marker.end);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// adoptBranchContent() — walk nested show/list descriptors in SSR content\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively adopt the content between show markers against a descriptor\n * that may be a HydrationDescriptor, ShowDescriptor, or ListDescriptor.\n *\n * This handles the case where createShow nests: the outer show's\n * initialBranch is itself a ShowDescriptor (not a plain element), so we\n * need to find inner SSR markers and walk into them.\n */\nfunction adoptBranchContent(\n desc: unknown,\n regionStart: Comment,\n regionEnd: Comment,\n): void {\n if (isDescriptor(desc)) {\n // Plain element — find it between markers and adopt\n const el = nextElementBetweenMarkers(regionStart, regionEnd);\n if (el) adoptNode(desc, el);\n } else if (isShowDescriptor(desc)) {\n // Nested show — find inner show markers between region markers\n let node: ChildNode | null = regionStart.nextSibling;\n while (node && node !== regionEnd) {\n if (node.nodeType === 8 && isShowStart((node as Comment).data)) {\n const innerStart = node as Comment;\n const innerEnd = findClosingMarker(innerStart);\n if (innerEnd) {\n // Recursively adopt the inner show's content\n if (desc.initialBranch) {\n adoptBranchContent(desc.initialBranch, innerStart, innerEnd);\n }\n // Set up the inner show's toggle effect\n setupShowEffect(desc, { start: innerStart, end: innerEnd, cachedContent: null });\n }\n break;\n }\n node = node.nextSibling;\n }\n }\n // ListDescriptor adoption within show markers is handled by the existing\n // list adoption code in adoptNode when it encounters list markers.\n}\n\n// ---------------------------------------------------------------------------\n// adoptNode() — top-down descriptor walk with DOM cursor\n// ---------------------------------------------------------------------------\n\n/**\n * Walk a descriptor tree top-down, matching each descriptor against the\n * corresponding SSR DOM using a childNode cursor. Attaches event handlers\n * and reactive bindings without creating new DOM nodes.\n *\n * The cursor approach handles:\n * - Island markers (<!--f:iN-->): creates real DOM from descriptor\n * - Show markers (<!--f:sN-->): binds show effects or reactive text\n * - Text markers (<!--f:tN-->): binds reactive text effects\n * - Tag mismatches: falls back to descriptorToElement()\n */\nexport function adoptNode(\n desc: HydrationDescriptor,\n ssrEl: Element | undefined,\n): void {\n // Mismatch check\n if (!ssrEl || ssrEl.tagName !== desc.tag.toUpperCase()) {\n if (__DEV__) console.warn(`Hydration mismatch: expected <${desc.tag}>, got <${ssrEl?.tagName?.toLowerCase() ?? 'nothing'}>`);\n const fresh = descriptorToElement(desc);\n if (ssrEl) ssrEl.replaceWith(fresh);\n return;\n }\n\n // Attach dynamic props\n applyDynamicProps(ssrEl, desc.props);\n\n // Walk children via DOM cursor (instead of children[index])\n let cursor: ChildNode | null = ssrEl.firstChild;\n\n for (const child of desc.children) {\n // Skip falsy children\n if (child === false || child == null) continue;\n\n if (isDescriptor(child)) {\n // Skip whitespace-only text nodes\n while (cursor && cursor.nodeType === 3 && !(cursor as Text).data.trim()) {\n cursor = cursor.nextSibling;\n }\n\n // Skip child island elements — they are handled by their own activation\n while (cursor && cursor.nodeType === 1 &&\n (cursor as Element).hasAttribute('data-forma-island')) {\n cursor = cursor.nextSibling;\n }\n\n if (!cursor) {\n // No more DOM nodes — append fresh\n ssrEl.appendChild(descriptorToElement(child));\n continue;\n }\n\n if (cursor.nodeType === 1) {\n // Element node — adopt recursively\n const el = cursor as Element;\n cursor = cursor.nextSibling;\n adoptNode(child, el);\n } else if (cursor.nodeType === 8 && isIslandStart((cursor as Comment).data)) {\n // Island marker — create real DOM and insert before end marker\n const end = findClosingMarker(cursor as Comment);\n const fresh = descriptorToElement(child);\n if (end) {\n end.parentNode!.insertBefore(fresh, end);\n cursor = end.nextSibling;\n } else {\n ssrEl.appendChild(fresh);\n cursor = null;\n }\n } else {\n // Unexpected node — create fresh and append\n ssrEl.appendChild(descriptorToElement(child));\n }\n\n } else if (isShowDescriptor(child)) {\n // Advance cursor to next show marker\n while (cursor && !(cursor.nodeType === 8 && isShowStart((cursor as Comment).data))) {\n cursor = cursor.nextSibling;\n }\n\n if (cursor) {\n const start = cursor as Comment;\n const end = findClosingMarker(start);\n if (end) {\n if (child.initialBranch) {\n // Walk the initial branch against SSR content between markers.\n // initialBranch can be a HydrationDescriptor (element), ShowDescriptor\n // (nested show), or ListDescriptor — adoptBranchContent handles all.\n adoptBranchContent(child.initialBranch, start, end);\n }\n setupShowEffect(child, { start, end, cachedContent: null });\n cursor = end.nextSibling;\n }\n }\n\n } else if (isListDescriptor(child)) {\n // Advance cursor to next list marker\n while (cursor && !(cursor.nodeType === 8 && isListStart((cursor as Comment).data))) {\n cursor = cursor.nextSibling;\n }\n\n if (cursor) {\n const start = cursor as Comment;\n const end = findClosingMarker(start);\n if (end) {\n // Walk DOM between markers, collect SSR elements\n const ssrKeyMap = new Map<string | number, HTMLElement>();\n const ssrElements: HTMLElement[] = [];\n let node: Node | null = start.nextSibling;\n while (node && node !== end) {\n if (node.nodeType === 1) {\n const el = node as HTMLElement;\n ssrElements.push(el);\n const key = el.getAttribute('data-forma-key');\n if (key != null) {\n ssrKeyMap.set(key, el);\n }\n }\n node = node.nextSibling;\n }\n\n // Read current items without tracking (we set up our own effect below)\n const currentItems = untrack(() => child.items()) as any[];\n const listKeyFn = child.keyFn;\n const listRenderFn = child.renderFn;\n\n // Fallback: if no SSR elements have data-forma-key, match by index\n const useIndexFallback = ssrKeyMap.size === 0 && ssrElements.length > 0;\n\n // Match current items to SSR nodes by key (or index fallback)\n const adoptedNodes: Node[] = [];\n const adoptedItems: any[] = [];\n const usedIndices = new Set<number>();\n\n for (let i = 0; i < currentItems.length; i++) {\n const item = currentItems[i];\n const key = listKeyFn(item);\n\n let ssrNode: HTMLElement | undefined;\n if (useIndexFallback) {\n // Index-based matching: SSR elements lack keys, adopt by position\n if (i < ssrElements.length) {\n ssrNode = ssrElements[i];\n usedIndices.add(i);\n }\n } else {\n // Key-based matching: SSR keys from getAttribute() are always strings\n ssrNode = ssrKeyMap.get(String(key));\n if (ssrNode) ssrKeyMap.delete(String(key));\n }\n\n if (ssrNode) {\n // Reuse SSR element\n adoptedNodes.push(ssrNode);\n adoptedItems.push(item);\n } else {\n // Not found in SSR — render fresh, exit hydration mode temporarily\n if (__DEV__) console.warn(`[FormaJS] Hydration: list item key \"${key}\" not found in SSR — rendering fresh`);\n const prevHydrating = hydrating;\n hydrating = false;\n try {\n const [getIndex] = createSignal(i);\n const fresh = listRenderFn(item, getIndex);\n // Insert before end marker\n end.parentNode!.insertBefore(fresh, end);\n adoptedNodes.push(fresh);\n adoptedItems.push(item);\n } finally {\n hydrating = prevHydrating;\n }\n }\n }\n\n // Remove unused SSR nodes (keys that weren't matched, or excess index-based)\n if (useIndexFallback) {\n for (let i = 0; i < ssrElements.length; i++) {\n if (!usedIndices.has(i) && ssrElements[i]!.parentNode) {\n ssrElements[i]!.parentNode!.removeChild(ssrElements[i]!);\n }\n }\n } else {\n for (const [unusedKey, unusedNode] of ssrKeyMap) {\n if (__DEV__) console.warn(`[FormaJS] Hydration: removing extra SSR list item with key \"${unusedKey}\"`);\n if (unusedNode.parentNode) {\n unusedNode.parentNode.removeChild(unusedNode);\n }\n }\n }\n\n // Reorder adopted nodes to match item order (insert before end marker)\n const parent = start.parentNode!;\n for (const adoptedNode of adoptedNodes) {\n parent.insertBefore(adoptedNode, end);\n }\n\n // Set up state for reactive reconciliation.\n // Cache maps key → { element, item, getIndex, setIndex } so that\n // index signals can be updated after reconcileList reorders items\n // (same pattern as the non-hydration createList in list.ts).\n let cache = new Map<string | number, {\n element: HTMLElement;\n item: any;\n getIndex: () => number;\n setIndex: (v: number) => void;\n }>();\n\n // Seed cache with adopted items\n for (let i = 0; i < adoptedItems.length; i++) {\n const item = adoptedItems[i];\n const key = listKeyFn(item);\n const [getIndex, setIndex] = createSignal(i);\n cache.set(key, {\n element: adoptedNodes[i] as HTMLElement,\n item,\n getIndex,\n setIndex,\n });\n }\n\n let reconcileNodes = adoptedNodes.slice();\n let reconcileItems = adoptedItems.slice();\n\n // Attach reactive effect that calls reconcileList for subsequent updates\n internalEffect(() => {\n const newItems = child.items() as any[];\n\n // The parent is discovered lazily: once inserted into the live DOM\n const parent = start.parentNode;\n if (!parent) return;\n\n const result = reconcileList(\n parent,\n reconcileItems,\n newItems,\n reconcileNodes,\n listKeyFn,\n (item: any) => {\n const prevHydrating = hydrating;\n hydrating = false;\n try {\n const key = listKeyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n const element = untrack(() => listRenderFn(item, getIndex));\n cache.set(key, { element, item, getIndex, setIndex });\n return element;\n } finally {\n hydrating = prevHydrating;\n }\n },\n (_node: Node, item: any) => {\n const key = listKeyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n },\n end,\n );\n\n // Rebuild cache + update index signals in a single pass\n const newCache = new Map<string | number, typeof cache extends Map<any, infer V> ? V : never>();\n for (let i = 0; i < newItems.length; i++) {\n const key = listKeyFn(newItems[i]!);\n const cached = cache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n cache = newCache;\n\n reconcileNodes = result.nodes;\n reconcileItems = result.items;\n });\n\n cursor = end.nextSibling;\n }\n }\n\n } else if (typeof child === 'function') {\n // Reactive binding — could be text (signal getter) or element (returns descriptor).\n // Peek at the return value to determine type before choosing the adoption path.\n while (cursor && cursor.nodeType === 3 && !(cursor as Text).data.trim()) {\n cursor = cursor.nextSibling;\n }\n\n // If cursor is at an element, check whether function returns a descriptor\n if (cursor && cursor.nodeType === 1) {\n const initial = (child as () => unknown)();\n if (isDescriptor(initial)) {\n // Function returned a descriptor — adopt the element at cursor\n const el = cursor as Element;\n cursor = cursor.nextSibling;\n adoptNode(initial, el);\n continue;\n }\n // Not a descriptor — fall through to text handling\n }\n\n if (cursor && cursor.nodeType === 8) {\n const data = (cursor as Comment).data;\n\n if (isTextStart(data)) {\n // Text marker: <!--f:tN-->text<!--/f:tN-->\n const endMarker = findClosingMarker(cursor as Comment);\n let textNode = cursor.nextSibling;\n if (!textNode || textNode.nodeType !== 3) {\n // Defensive fallback: SSR should have emitted a text node between\n // markers. If missing, create one — but warn in dev mode.\n if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for marker ${data} — SSR walker should emit content between markers`);\n const created = document.createTextNode('');\n cursor.parentNode!.insertBefore(created, endMarker || cursor.nextSibling);\n textNode = created;\n }\n internalEffect(() => {\n (textNode as Text).data = String((child as () => unknown)());\n });\n cursor = endMarker ? endMarker.nextSibling : textNode.nextSibling;\n } else if (isShowStart(data)) {\n // Show marker used for reactive text (IR compiled inline ternary as ShowIf)\n const start = cursor as Comment;\n const end = findClosingMarker(start);\n if (end) {\n let textNode = findTextBetween(start, end);\n if (!textNode) {\n // Defensive fallback: SSR should have emitted content between\n // show markers for reactive text. Warn in dev mode.\n if (__DEV__) console.warn(`[FormaJS] Hydration: created text node for show marker ${start.data} — SSR walker should emit content between markers`);\n textNode = document.createTextNode('');\n start.parentNode!.insertBefore(textNode, end);\n }\n internalEffect(() => {\n (textNode as Text).data = String((child as () => unknown)());\n });\n cursor = end.nextSibling;\n } else {\n cursor = cursor.nextSibling;\n }\n } else {\n cursor = cursor.nextSibling;\n }\n } else if (cursor && cursor.nodeType === 3) {\n // Existing text node without markers — bind reactive effect directly\n const textNode = cursor as Text;\n cursor = cursor.nextSibling;\n internalEffect(() => {\n textNode.data = String((child as () => unknown)());\n });\n } else {\n // No cursor (empty parent) or unexpected node — SSR element has no\n // children where a reactive text binding is expected. This means the\n // IR didn't cover this part of the component tree. Warn and create.\n if (__DEV__) console.warn(`[FormaJS] Hydration: created text node in empty <${ssrEl.tagName.toLowerCase()}> — IR may not cover this component`);\n const textNode = document.createTextNode('');\n ssrEl.appendChild(textNode);\n internalEffect(() => {\n textNode.data = String((child as () => unknown)());\n });\n }\n } else if (typeof child === 'string' || typeof child === 'number') {\n // Static text — advance cursor past corresponding text node\n if (cursor && cursor.nodeType === 3) {\n cursor = cursor.nextSibling;\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// hydrateIsland() — full orchestration\n// ---------------------------------------------------------------------------\n\n/**\n * Hydrate an SSR island in-place. Runs the component in hydration mode so\n * h() returns descriptors, then walks the descriptor tree against the SSR DOM\n * to attach event handlers and reactive bindings. No DOM elements are created.\n *\n * The component function MUST be called inside a reactive root (createRoot)\n * so that effects created during adoption are properly tracked.\n *\n * Returns the active root element — usually `target`, but may be a replacement\n * element when the CSR fallback fires (empty island shell replaced by the\n * component's own root element).\n *\n * @param component A function that builds the UI (calls h(), createShow, etc.)\n * @param target The container element with `data-forma-ssr` attribute\n */\nexport function hydrateIsland(component: () => unknown, target: Element): Element {\n // Check if the island has SSR content to hydrate against.\n // An empty island shell (tag + static attrs from compiler, no children)\n // has nothing to hydrate — fall through to CSR mode.\n const hasSSRContent = target.childElementCount > 0 ||\n (target.childNodes.length > 0 &&\n Array.from(target.childNodes).some(n =>\n n.nodeType === 1 || (n.nodeType === 3 && (n as Text).data.trim())));\n\n if (!hasSSRContent) {\n // CSR fallback: SSR emitted an empty shell element for this island.\n // Run the component in normal (non-hydration) mode and replace the\n // shell with the component's own root element.\n if (__DEV__) {\n const name = target.getAttribute('data-forma-component') || 'unknown';\n console.warn(\n `[forma] Island \"${name}\" has no SSR content — falling back to CSR. ` +\n `This means the IR walker did not render content between ISLAND_START and ISLAND_END.`,\n );\n }\n\n const result = component();\n if (result instanceof Element) {\n // Transfer data-forma-* attributes from the shell to the component's root\n for (const attr of Array.from(target.attributes)) {\n if (attr.name.startsWith('data-forma-')) {\n result.setAttribute(attr.name, attr.value);\n }\n }\n target.replaceWith(result);\n return result;\n } else if (result instanceof Node) {\n target.appendChild(result);\n }\n return target;\n }\n\n // 1. Enter hydration mode (h() returns descriptors)\n setHydrating(true);\n\n // 2. Run component — builds descriptor tree, zero DOM work\n let descriptor: unknown;\n try {\n descriptor = component();\n } finally {\n // 3. Exit hydration mode\n setHydrating(false);\n }\n\n // Guard: if component returned nothing (e.g. mock fn in tests, or simple\n // islands that only set up effects), skip adoption entirely.\n if (!descriptor || !isDescriptor(descriptor)) {\n target.removeAttribute('data-forma-ssr');\n return target;\n }\n\n // 4. Walk descriptor tree top-down against SSR DOM.\n // For island activation: the target IS the island root element (has\n // data-forma-island). Adopt directly on target.\n // For mount() container pattern: target is a wrapper, adopt on target.children[0].\n if (target.hasAttribute('data-forma-island')) {\n adoptNode(descriptor, target);\n } else {\n adoptNode(descriptor, target.children[0] as Element);\n }\n\n // 5. Remove SSR marker\n target.removeAttribute('data-forma-ssr');\n return target;\n}\n\n","/**\n * Forma DOM - List\n *\n * Keyed list reconciliation with Longest Increasing Subsequence (LIS).\n * The LIS tells us the maximum set of DOM nodes that can stay in place;\n * only the remaining nodes need to be moved. This minimises DOM operations\n * to exactly `n - LIS_length` moves — provably optimal.\n *\n * Algorithm used by ivi, Inferno, and (with variations) Solid, Vue 3, Svelte.\n *\n * Uses comment-node markers instead of a wrapper <div>, so the list can be\n * placed inside <table>, <ul>, <select>, etc. without breaking semantics.\n *\n * Total module budget: <2KB minified.\n */\n\nimport { createSignal, internalEffect, untrack, __DEV__ } from '../reactive';\nimport { hydrating } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface ReconcileResult<T> {\n nodes: Node[];\n items: T[];\n}\n\nexport interface ListTransitionHooks {\n onInsert?: (node: Node) => void;\n onBeforeRemove?: (node: Node, done: () => void) => void;\n}\n\ninterface CachedItem<T> {\n element: HTMLElement;\n item: T;\n getIndex: () => number;\n setIndex: (v: number) => void;\n}\n\nexport interface CreateListOptions {\n /**\n * How to handle same-key items whose object identity changed.\n * - 'none' (default): keep the existing row node for maximum throughput.\n * - 'rerender': re-render changed rows and patch static row DOM in place.\n */\n updateOnItemChange?: 'none' | 'rerender';\n}\n\n// ---------------------------------------------------------------------------\n// LIS — O(n log n) via patience sorting + binary search\n// ---------------------------------------------------------------------------\n\n/**\n * Find the longest increasing subsequence.\n * Returns indices into the input array.\n * O(n log n) time, O(n) space.\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // Pre-allocate typed arrays — avoids V8 array growth overhead on push\n const tails = new Int32Array(n);\n const tailIndices = new Int32Array(n);\n const predecessor = new Int32Array(n).fill(-1);\n let tailsLen = 0;\n\n for (let i = 0; i < n; i++) {\n const val = arr[i]!;\n\n // Binary search: leftmost tail >= val\n let lo = 0, hi = tailsLen;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n tails[lo] = val;\n tailIndices[lo] = i;\n if (lo > 0) predecessor[i] = tailIndices[lo - 1]!;\n if (lo >= tailsLen) tailsLen++;\n }\n\n // Reconstruct — return plain array since callers expect number[]\n const result = new Array<number>(tailsLen);\n let idx = tailIndices[tailsLen - 1]!;\n for (let i = tailsLen - 1; i >= 0; i--) {\n result[i] = idx;\n idx = predecessor[idx]!;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// reconcileList — low-level keyed reconciler\n// ---------------------------------------------------------------------------\n\n/** Below this threshold, use flat array scan instead of Map for better cache locality. */\nconst SMALL_LIST_THRESHOLD = 32;\nconst ABORT_SYM = Symbol.for('forma-abort');\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction canPatchStaticElement(target: Node, source: Node): target is HTMLElement {\n return target instanceof HTMLElement\n && source instanceof HTMLElement\n && target.tagName === source.tagName\n && !(target as any)[ABORT_SYM]\n && !(target as any)[CACHE_SYM]\n && !(target as any)[DYNAMIC_CHILD_SYM]\n && !(source as any)[ABORT_SYM]\n && !(source as any)[CACHE_SYM]\n && !(source as any)[DYNAMIC_CHILD_SYM];\n}\n\nfunction patchStaticElement(target: HTMLElement, source: HTMLElement): void {\n // Sync attributes (events/reactive bindings are excluded by canPatchStaticElement).\n const sourceAttrNames = new Set<string>();\n for (const attr of Array.from(source.attributes)) {\n sourceAttrNames.add(attr.name);\n if (target.getAttribute(attr.name) !== attr.value) {\n target.setAttribute(attr.name, attr.value);\n }\n }\n for (const attr of Array.from(target.attributes)) {\n if (!sourceAttrNames.has(attr.name)) {\n target.removeAttribute(attr.name);\n }\n }\n\n // Move freshly rendered children into the existing keyed node.\n target.replaceChildren(...Array.from(source.childNodes));\n}\n\n/**\n * Small-list reconciler: uses flat arrays + indexOf instead of Map/Set.\n * For < 32 items, linear scan is faster than hash computation overhead.\n */\nfunction reconcileSmall<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // Build flat arrays for old keys/nodes — better cache locality than Map\n const oldKeys: (string | number)[] = new Array(oldLen);\n for (let i = 0; i < oldLen; i++) {\n oldKeys[i] = keyFn(oldItems[i]!);\n }\n\n // Classify each new item: find matching old index via linear scan\n const oldIndices = new Array<number>(newLen);\n const oldUsed = new Uint8Array(oldLen); // 0 = unused, 1 = used\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n let found = -1;\n for (let j = 0; j < oldLen; j++) {\n if (!oldUsed[j] && oldKeys[j] === key) {\n found = j;\n oldUsed[j] = 1;\n break;\n }\n }\n oldIndices[i] = found;\n }\n\n // Remove old items not reused\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // Fast path: same keys, same order -> just update, 0 DOM moves\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // LIS for minimum moves (still needed even for small lists)\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = [];\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array as a bitmap instead of Set for small lists\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // Build result: walk right-to-left for stable insertBefore targets\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n/**\n * Reconcile a DOM parent's children to match a new array of items.\n * Uses keyed reconciliation with LIS for minimum DOM operations.\n *\n * For small lists (< 32 items), uses a flat array scan path that avoids\n * Map/Set hash overhead and provides better cache locality.\n *\n * @param parent - The container DOM element\n * @param oldItems - Previous array (from last reconciliation)\n * @param newItems - New array to render\n * @param oldNodes - Previous DOM nodes array\n * @param keyFn - Extracts a unique key from each item\n * @param createFn - Creates a new DOM node for an item\n * @param updateFn - Updates an existing DOM node with new item data\n * @param beforeNode - Optional boundary marker. When provided, new nodes are\n * inserted before this node instead of appended to parent.\n * This allows the reconciler to operate within a range\n * delimited by comment markers.\n * @returns Object with new nodes array and items array for next call\n */\nexport function reconcileList<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // --- Trivial: new is empty -> remove all ---\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n return { nodes: [], items: [] };\n }\n\n // --- Trivial: old is empty -> create all ---\n if (oldLen === 0) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = createFn(newItems[i]!);\n if (beforeNode) {\n parent.insertBefore(node, beforeNode);\n } else {\n parent.appendChild(node);\n }\n hooks?.onInsert?.(node);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n\n // --- Small list path: flat array scan, no Map/Set overhead ---\n if (oldLen < SMALL_LIST_THRESHOLD) {\n return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);\n }\n\n // --- Large list path: Map-based approach ---\n const oldKeyMap = new Map<string | number, number>();\n for (let i = 0; i < oldLen; i++) {\n oldKeyMap.set(keyFn(oldItems[i]!), i);\n }\n\n // --- Classify each new item: reuse or create ---\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const oldIndices = new Array<number>(newLen); // -1 means new item\n const oldUsed = new Uint8Array(oldLen);\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldIndices[i] = oldIdx;\n oldUsed[oldIdx] = 1;\n } else {\n oldIndices[i] = -1;\n }\n }\n\n // --- Remove old items not in new array ---\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // --- Fast path: same keys, same order -> just update, 0 DOM moves ---\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // --- Find LIS of old indices (reused items only) ---\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = []; // position in new array\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // --- Build result: walk right-to-left for stable insertBefore targets ---\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n // NEW: create and insert\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n // REUSE: update content\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n // LIS item: already in correct relative position, don't move\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n // Insert/move into position\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n// ---------------------------------------------------------------------------\n// createList — high-level reactive API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactively-bound list of DOM elements with keyed reconciliation.\n *\n * Returns a `DocumentFragment` containing two comment markers\n * (`<!--forma-list-start-->` and `<!--forma-list-end-->`) that delimit the\n * list's range in the DOM. All managed elements live between these markers.\n *\n * This avoids a wrapper `<div>` which would break `<table>`, `<ul>`,\n * `<select>` semantics and pollute the DOM.\n *\n * When the `items` signal changes, only the minimal set of DOM mutations is\n * performed using the LIS algorithm:\n * - New keys: create elements via `renderFn`\n * - Removed keys: remove elements from DOM\n * - Moved keys: reorder elements using minimum moves (n - LIS)\n * - Same keys: keep row nodes and update index signals\n * (or re-render row content when `updateOnItemChange: 'rerender'`)\n *\n * @param items Signal getter returning the current array of items.\n * @param keyFn Extracts a unique key from each item.\n * @param renderFn Renders a single item. Receives the item and a reactive index getter.\n * @returns A DocumentFragment to insert into the DOM. The fragment includes\n * start/end comment markers and any initial list items.\n *\n * ```ts\n * const frag = createList(\n * todos,\n * (t) => t.id,\n * (todo, index) => h('li', null, () => `${index() + 1}. ${todo.text}`),\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createList<T>(\n items: () => T[],\n keyFn: (item: T) => string | number,\n renderFn: (item: T, index: () => number) => HTMLElement,\n options?: CreateListOptions,\n): DocumentFragment {\n if (hydrating) {\n return { type: 'list', items, keyFn, renderFn, options } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-list-start');\n const endMarker = document.createComment('forma-list-end');\n\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Cache: key -> { element, item, setIndex }\n let cache = new Map<string | number, CachedItem<T>>();\n let currentNodes: Node[] = [];\n let currentItems: T[] = [];\n const updateOnItemChange = options?.updateOnItemChange ?? 'none';\n\n internalEffect(() => {\n const newItems = items();\n\n // The parent is discovered lazily: once the fragment has been inserted\n // into the live DOM the markers have a parentNode.\n const parent = startMarker.parentNode;\n if (!parent) {\n // Markers are not yet in the DOM — nothing to reconcile.\n // This can happen if the effect fires synchronously before mount.\n return;\n }\n\n // Edge case: non-array\n if (!Array.isArray(newItems)) {\n if (__DEV__) {\n console.warn('[forma] createList: value is not an array, treating as empty');\n }\n // Remove all nodes between the markers\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node);\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n return;\n }\n\n // Filter nullish items — avoid array allocation when no nulls found (common case)\n let cleanItems: T[] = newItems;\n for (let i = 0; i < newItems.length; i++) {\n if (newItems[i] == null) {\n cleanItems = newItems.filter(item => item != null);\n break;\n }\n }\n\n // Dev-mode duplicate key detection\n if (__DEV__) {\n const seen = new Set<string | number>();\n for (const item of cleanItems) {\n const key = keyFn(item);\n if (seen.has(key)) {\n console.warn('[forma] createList: duplicate key detected:', key);\n }\n seen.add(key);\n }\n }\n\n const updateRow = updateOnItemChange === 'rerender'\n ? (node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (!cached) return;\n if (cached.item === item) return;\n cached.item = item;\n\n if (!(node instanceof HTMLElement)) return;\n if ((node as any)[ABORT_SYM] || (node as any)[CACHE_SYM] || (node as any)[DYNAMIC_CHILD_SYM]) {\n return;\n }\n\n const next = untrack(() => renderFn(item, cached.getIndex));\n if (canPatchStaticElement(node, next)) {\n patchStaticElement(node, next);\n cached.element = node;\n }\n }\n : (_node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n };\n\n const result = reconcileList<T>(\n parent,\n currentItems,\n cleanItems,\n currentNodes,\n keyFn,\n // createFn: create element + cache entry\n (item) => {\n const key = keyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n // Prevent child effects created during render from being nested under\n // the reconciler effect, which can stall their updates on reorders.\n const element = untrack(() => renderFn(item, getIndex));\n cache.set(key, { element, item, getIndex, setIndex });\n return element;\n },\n updateRow,\n // beforeNode: insert items before the end marker\n endMarker,\n );\n\n // Rebuild cache + update index signals in a single pass.\n // Avoids .map() array allocation + Set construction from the previous approach.\n const newCache = new Map<string | number, CachedItem<T>>();\n for (let i = 0; i < cleanItems.length; i++) {\n const key = keyFn(cleanItems[i]!);\n const cached = cache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n cache = newCache;\n\n currentNodes = result.nodes;\n currentItems = result.items;\n });\n\n return fragment;\n}\n"]}
@@ -1,29 +0,0 @@
1
- /**
2
- * Forma Reactive - Signal
3
- *
4
- * Fine-grained reactive primitive backed by alien-signals.
5
- * API: createSignal returns [getter, setter] tuple following SolidJS conventions.
6
- *
7
- * TC39 Signals equivalent: Signal.State
8
- */
9
- type SignalGetter<T> = () => T;
10
- type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;
11
- interface SignalOptions<T> {
12
- /** Debug name — attached to getter in dev mode for devtools inspection. */
13
- name?: string;
14
- /** Custom equality check. Default: Object.is (via alien-signals). */
15
- equals?: (prev: T, next: T) => boolean;
16
- }
17
- /**
18
- * Create a reactive signal.
19
- *
20
- * ```ts
21
- * const [count, setCount] = createSignal(0);
22
- * console.log(count()); // 0
23
- * setCount(1);
24
- * setCount(prev => prev + 1);
25
- * ```
26
- */
27
- declare function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>];
28
-
29
- export { type SignalGetter as S, type SignalOptions as a, createSignal as c };
@@ -1,29 +0,0 @@
1
- /**
2
- * Forma Reactive - Signal
3
- *
4
- * Fine-grained reactive primitive backed by alien-signals.
5
- * API: createSignal returns [getter, setter] tuple following SolidJS conventions.
6
- *
7
- * TC39 Signals equivalent: Signal.State
8
- */
9
- type SignalGetter<T> = () => T;
10
- type SignalSetter<T> = (v: T | ((prev: T) => T)) => void;
11
- interface SignalOptions<T> {
12
- /** Debug name — attached to getter in dev mode for devtools inspection. */
13
- name?: string;
14
- /** Custom equality check. Default: Object.is (via alien-signals). */
15
- equals?: (prev: T, next: T) => boolean;
16
- }
17
- /**
18
- * Create a reactive signal.
19
- *
20
- * ```ts
21
- * const [count, setCount] = createSignal(0);
22
- * console.log(count()); // 0
23
- * setCount(1);
24
- * setCount(prev => prev + 1);
25
- * ```
26
- */
27
- declare function createSignal<T>(initialValue: T): [get: SignalGetter<T>, set: SignalSetter<T>];
28
-
29
- export { type SignalGetter as S, type SignalOptions as a, createSignal as c };