@getforma/core 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/chunk-263HW3KN.cjs +35 -0
- package/dist/chunk-263HW3KN.cjs.map +1 -0
- package/dist/chunk-2QQBKQIF.js +30 -0
- package/dist/chunk-2QQBKQIF.js.map +1 -0
- package/dist/{chunk-6FW5E54W.cjs → chunk-2Y5US35K.cjs} +127 -103
- package/dist/chunk-2Y5US35K.cjs.map +1 -0
- package/dist/{chunk-3G7ET4O5.js → chunk-INNOI6TG.js} +121 -94
- package/dist/chunk-INNOI6TG.js.map +1 -0
- package/dist/{chunk-T33QUD2Y.cjs → chunk-JRQNDXX7.cjs} +43 -43
- package/dist/{chunk-T33QUD2Y.cjs.map → chunk-JRQNDXX7.cjs.map} +1 -1
- package/dist/{chunk-AFRFF7XL.js → chunk-MIOMT2CB.js} +4 -4
- package/dist/{chunk-AFRFF7XL.js.map → chunk-MIOMT2CB.js.map} +1 -1
- package/dist/chunk-W7OUWVRA.cjs +106 -0
- package/dist/chunk-W7OUWVRA.cjs.map +1 -0
- package/dist/chunk-XLVBYXOU.js +100 -0
- package/dist/chunk-XLVBYXOU.js.map +1 -0
- package/dist/forma-runtime-csp.js +92 -6
- package/dist/forma-runtime.js +138 -12
- package/dist/formajs-runtime-hardened.global.js +92 -6
- package/dist/formajs-runtime-hardened.global.js.map +1 -1
- package/dist/formajs-runtime.global.js +138 -12
- package/dist/formajs-runtime.global.js.map +1 -1
- package/dist/formajs.global.js +192 -95
- package/dist/formajs.global.js.map +1 -1
- package/dist/http.cjs +11 -11
- package/dist/http.js +2 -2
- package/dist/index.cjs +66 -66
- package/dist/index.d.cts +11 -25
- package/dist/index.d.ts +11 -25
- package/dist/index.js +6 -6
- package/dist/{resource-DeEzxUz6.d.cts → resource-D6HfVgiA.d.cts} +7 -2
- package/dist/{resource-BHsgURy0.d.ts → resource-ljs2X5NM.d.ts} +7 -2
- package/dist/runtime-hardened.cjs +93 -5
- package/dist/runtime-hardened.cjs.map +1 -1
- package/dist/runtime-hardened.js +93 -5
- package/dist/runtime-hardened.js.map +1 -1
- package/dist/runtime.cjs +47 -31
- package/dist/runtime.cjs.map +1 -1
- package/dist/runtime.js +21 -5
- package/dist/runtime.js.map +1 -1
- package/dist/server.cjs +7 -7
- package/dist/server.d.cts +2 -2
- package/dist/server.d.ts +2 -2
- package/dist/server.js +2 -2
- package/dist/{signal-C9v4akyJ.d.cts → signal-CRBJYQ6B.d.cts} +0 -8
- package/dist/{signal-C9v4akyJ.d.ts → signal-CRBJYQ6B.d.ts} +0 -8
- package/dist/ssr/index.cjs +23 -42
- package/dist/ssr/index.cjs.map +1 -1
- package/dist/ssr/index.js +23 -42
- package/dist/ssr/index.js.map +1 -1
- package/dist/tc39-compat.cjs +3 -6
- package/dist/tc39-compat.cjs.map +1 -1
- package/dist/tc39-compat.d.cts +1 -1
- package/dist/tc39-compat.d.ts +1 -1
- package/dist/tc39-compat.js +1 -4
- package/dist/tc39-compat.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-3G7ET4O5.js.map +0 -1
- package/dist/chunk-6FW5E54W.cjs.map +0 -1
- package/dist/chunk-HLM5BZZQ.js +0 -35
- package/dist/chunk-HLM5BZZQ.js.map +0 -1
- package/dist/chunk-QLPCVK7C.cjs +0 -38
- package/dist/chunk-QLPCVK7C.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dom/element.ts","../src/dom/show.ts","../src/dom/hydrate.ts","../src/dom/list.ts"],"names":["fragment","ABORT_SYM","parent","CACHE_SYM","DYNAMIC_CHILD_SYM"],"mappings":"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","file":"chunk-AFRFF7XL.js","sourcesContent":["/**\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/**\n * Parse a CSS string (e.g. \"color: red; font-size: 14px\") into a style object.\n * Uses camelCase keys for CSSOM assignment via Object.assign(el.style, ...).\n * This avoids el.style.cssText which is blocked by strict CSP style-src policies.\n */\nfunction parseCssString(css: string): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const decl of css.split(';')) {\n const colon = decl.indexOf(':');\n if (colon < 0) continue;\n const prop = decl.slice(0, colon).trim();\n const val = decl.slice(colon + 1).trim();\n if (prop && val) {\n // kebab-case → camelCase (e.g. \"font-size\" → \"fontSize\")\n const camel = prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n obj[camel] = val;\n }\n }\n return obj;\n}\n\n/** Apply a style object to an element via CSSOM (CSP-safe). */\nfunction applyStyleObj(el: Element, obj: Record<string, string>, prevKeys: string[]): string[] {\n const style = (el as HTMLElement | SVGElement).style;\n const nextKeys = Object.keys(obj);\n for (const k of prevKeys) {\n if (!(k in obj)) {\n style.removeProperty(k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()));\n }\n }\n Object.assign(style, obj);\n return nextKeys;\n}\n\n/** Handle style prop. Reconciles styles via CSSOM (CSP-safe — never uses cssText). */\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 = applyStyleObj(el, parseCssString(v), prevKeys);\n } else if (v && typeof v === 'object') {\n prevKeys = applyStyleObj(el, v as Record<string, string>, prevKeys);\n }\n });\n } else if (typeof value === 'string') {\n const cache = getCache(el);\n if (cache['style'] === value) return;\n cache['style'] = value;\n applyStyleObj(el, parseCssString(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 if (el instanceof HTMLElement) {\n el.className = value as string;\n } else {\n el.setAttribute('class', value as string);\n }\n return;\n }\n\n if (key === 'style') {\n if (typeof value === 'string') {\n applyStyleObj(el, parseCssString(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 // - Array (from .map()) → wrap in DocumentFragment, append/replace\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 // Fragment children are tracked separately because DocumentFragment\n // empties itself on appendChild — we need to remove children manually.\n let currentFragChildren: Node[] | null = null;\n let warnedArray = false;\n const DEBUG = typeof (globalThis as any).__FORMA_DEBUG__ !== 'undefined';\n\n // Helper: remove all tracked fragment children or the single current node\n const clearCurrent = () => {\n if (currentFragChildren) {\n for (const c of currentFragChildren) {\n if (c.parentNode === parent) parent.removeChild(c);\n }\n currentFragChildren = null;\n }\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n currentNode = null;\n };\n\n internalEffect(() => {\n const v = (child as () => unknown)();\n\n // Array return (e.g. from .map()) → wrap in DocumentFragment\n let resolved: unknown = v;\n if (Array.isArray(v)) {\n const frag = document.createDocumentFragment();\n for (const item of v) {\n if (item instanceof Node) frag.appendChild(item);\n else if (Array.isArray(item)) {\n if (DEBUG) console.warn('[forma] Nested arrays in function children are not supported. Flatten the array or use createList().');\n } else if (item != null && item !== false && item !== true) {\n frag.appendChild(new Text(String(item)));\n }\n }\n // Empty array → treat as null (no DOM output)\n resolved = frag.childNodes.length > 0 ? frag : null;\n\n if (DEBUG && !warnedArray) {\n warnedArray = true;\n console.warn('[forma] Function child returned an array — auto-wrapped in DocumentFragment. Consider using createList() or wrapping in a container element for better performance.');\n }\n }\n\n if (resolved instanceof Node) {\n // Clear previous state (fragment children or single node)\n clearCurrent();\n\n // Track fragment children before appendChild empties the fragment\n const isNewFrag = resolved instanceof DocumentFragment;\n if (isNewFrag) {\n currentFragChildren = Array.from(resolved.childNodes);\n }\n\n // Insert the new node/fragment\n parent.appendChild(resolved);\n currentNode = isNewFrag ? null : (resolved as Node);\n } else if (resolved == null || resolved === false || resolved === true) {\n // Null/false/true/empty array — remove current content\n clearCurrent();\n } else {\n // Primitive value — bind as text\n // Clear fragment children if transitioning from array → primitive\n if (currentFragChildren) {\n for (const c of currentFragChildren) {\n if (c.parentNode === parent) parent.removeChild(c);\n }\n currentFragChildren = null;\n }\n const text = typeof resolved === 'symbol' ? String(resolved) : String(resolved ?? '');\n if (!currentNode) {\n currentNode = new Text(text);\n parent.appendChild(currentNode);\n } else if (currentNode.nodeType === 3) {\n // In-place text update — avoids DOM removal/insertion\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, registerDisposer } 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 | null = () => null,\n): DocumentFragment {\n if (hydrating) {\n const branch = when() ? thenFn() : elseFn();\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 // Defense-in-depth: when the parent root is disposed, explicitly null\n // closure references so GC can reclaim them. The branch root is already\n // auto-registered with the parent (Solid-style ownership), but the closure\n // variables currentDispose / currentNode still hold stale references.\n registerDisposer(() => {\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n currentNode = null;\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, createRoot, registerDisposer, __DEV__ } from '../reactive';\nimport { hydrating } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Return value from {@link reconcileList} — the new nodes and items arrays. */\nexport interface ReconcileResult<T> {\n /** The DOM nodes currently in the list, in order. */\n nodes: Node[];\n /** The items array corresponding to the current nodes. */\n items: T[];\n}\n\n/** Animation hooks for list transitions. */\nexport interface ListTransitionHooks {\n /** Called after a new node is inserted into the DOM. */\n onInsert?: (node: Node) => void;\n /** Called before a node is removed. Call `done()` when the exit animation finishes. */\n onBeforeRemove?: (node: Node, done: () => void) => void;\n}\n\ninterface CachedItem<T> {\n element: HTMLElement;\n item: T;\n getIndex: () => number;\n setIndex: (v: number) => void;\n dispose: () => void;\n}\n\nexport interface CreateListOptions {\n /**\n * How to handle same-key items whose object identity changed.\n * - 'none' (default): keep the existing row node for maximum throughput.\n * - 'rerender': re-render changed rows and patch static row DOM in place.\n */\n updateOnItemChange?: 'none' | 'rerender';\n}\n\n// ---------------------------------------------------------------------------\n// LIS — O(n log n) via patience sorting + binary search\n// ---------------------------------------------------------------------------\n\n/**\n * Find the longest increasing subsequence.\n * Returns indices into the input array.\n * O(n log n) time, O(n) space.\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // Pre-allocate typed arrays — avoids V8 array growth overhead on push\n const tails = new Int32Array(n);\n const tailIndices = new Int32Array(n);\n const predecessor = new Int32Array(n).fill(-1);\n let tailsLen = 0;\n\n for (let i = 0; i < n; i++) {\n const val = arr[i]!;\n\n // Binary search: leftmost tail >= val\n let lo = 0, hi = tailsLen;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n tails[lo] = val;\n tailIndices[lo] = i;\n if (lo > 0) predecessor[i] = tailIndices[lo - 1]!;\n if (lo >= tailsLen) tailsLen++;\n }\n\n // Reconstruct — return plain array since callers expect number[]\n const result = new Array<number>(tailsLen);\n let idx = tailIndices[tailsLen - 1]!;\n for (let i = tailsLen - 1; i >= 0; i--) {\n result[i] = idx;\n idx = predecessor[idx]!;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// reconcileList — low-level keyed reconciler\n// ---------------------------------------------------------------------------\n\n/** Below this threshold, use flat array scan instead of Map for better cache locality. */\nconst SMALL_LIST_THRESHOLD = 32;\nconst ABORT_SYM = Symbol.for('forma-abort');\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction canPatchStaticElement(target: Node, source: Node): target is HTMLElement {\n return target instanceof HTMLElement\n && source instanceof HTMLElement\n && target.tagName === source.tagName\n && !(target as any)[ABORT_SYM]\n && !(target as any)[CACHE_SYM]\n && !(target as any)[DYNAMIC_CHILD_SYM]\n && !(source as any)[ABORT_SYM]\n && !(source as any)[CACHE_SYM]\n && !(source as any)[DYNAMIC_CHILD_SYM];\n}\n\nfunction patchStaticElement(target: HTMLElement, source: HTMLElement): void {\n // Sync attributes (events/reactive bindings are excluded by canPatchStaticElement).\n const sourceAttrNames = new Set<string>();\n for (const attr of Array.from(source.attributes)) {\n sourceAttrNames.add(attr.name);\n if (target.getAttribute(attr.name) !== attr.value) {\n target.setAttribute(attr.name, attr.value);\n }\n }\n for (const attr of Array.from(target.attributes)) {\n if (!sourceAttrNames.has(attr.name)) {\n target.removeAttribute(attr.name);\n }\n }\n\n // Move freshly rendered children into the existing keyed node.\n target.replaceChildren(...Array.from(source.childNodes));\n}\n\n/**\n * Small-list reconciler: uses flat arrays + indexOf instead of Map/Set.\n * For < 32 items, linear scan is faster than hash computation overhead.\n */\nfunction reconcileSmall<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // Build flat arrays for old keys/nodes — better cache locality than Map\n const oldKeys: (string | number)[] = new Array(oldLen);\n for (let i = 0; i < oldLen; i++) {\n oldKeys[i] = keyFn(oldItems[i]!);\n }\n\n // Classify each new item: find matching old index via linear scan\n const oldIndices = new Array<number>(newLen);\n const oldUsed = new Uint8Array(oldLen); // 0 = unused, 1 = used\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n let found = -1;\n for (let j = 0; j < oldLen; j++) {\n if (!oldUsed[j] && oldKeys[j] === key) {\n found = j;\n oldUsed[j] = 1;\n break;\n }\n }\n oldIndices[i] = found;\n }\n\n // Remove old items not reused\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // Fast path: same keys, same order -> just update, 0 DOM moves\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // LIS for minimum moves (still needed even for small lists)\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = [];\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array as a bitmap instead of Set for small lists\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // Build result: walk right-to-left for stable insertBefore targets\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n/**\n * Reconcile a DOM parent's children to match a new array of items.\n * Uses keyed reconciliation with LIS for minimum DOM operations.\n *\n * For small lists (< 32 items), uses a flat array scan path that avoids\n * Map/Set hash overhead and provides better cache locality.\n *\n * @param parent - The container DOM element\n * @param oldItems - Previous array (from last reconciliation)\n * @param newItems - New array to render\n * @param oldNodes - Previous DOM nodes array\n * @param keyFn - Extracts a unique key from each item\n * @param createFn - Creates a new DOM node for an item\n * @param updateFn - Updates an existing DOM node with new item data\n * @param beforeNode - Optional boundary marker. When provided, new nodes are\n * inserted before this node instead of appended to parent.\n * This allows the reconciler to operate within a range\n * delimited by comment markers.\n * @returns Object with new nodes array and items array for next call\n */\nexport function reconcileList<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // --- Trivial: new is empty -> remove all ---\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n return { nodes: [], items: [] };\n }\n\n // --- Trivial: old is empty -> create all ---\n if (oldLen === 0) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = createFn(newItems[i]!);\n if (beforeNode) {\n parent.insertBefore(node, beforeNode);\n } else {\n parent.appendChild(node);\n }\n hooks?.onInsert?.(node);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n\n // --- Small list path: flat array scan, no Map/Set overhead ---\n if (oldLen < SMALL_LIST_THRESHOLD) {\n return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);\n }\n\n // --- Large list path: Map-based approach ---\n const oldKeyMap = new Map<string | number, number>();\n for (let i = 0; i < oldLen; i++) {\n oldKeyMap.set(keyFn(oldItems[i]!), i);\n }\n\n // --- Classify each new item: reuse or create ---\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const oldIndices = new Array<number>(newLen); // -1 means new item\n const oldUsed = new Uint8Array(oldLen);\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldIndices[i] = oldIdx;\n oldUsed[oldIdx] = 1;\n } else {\n oldIndices[i] = -1;\n }\n }\n\n // --- Remove old items not in new array ---\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // --- Fast path: same keys, same order -> just update, 0 DOM moves ---\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // --- Find LIS of old indices (reused items only) ---\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = []; // position in new array\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // --- Build result: walk right-to-left for stable insertBefore targets ---\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n // NEW: create and insert\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n // REUSE: update content\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n // LIS item: already in correct relative position, don't move\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n // Insert/move into position\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n// ---------------------------------------------------------------------------\n// createList — high-level reactive API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactively-bound list of DOM elements with keyed reconciliation.\n *\n * Returns a `DocumentFragment` containing two comment markers\n * (`<!--forma-list-start-->` and `<!--forma-list-end-->`) that delimit the\n * list's range in the DOM. All managed elements live between these markers.\n *\n * This avoids a wrapper `<div>` which would break `<table>`, `<ul>`,\n * `<select>` semantics and pollute the DOM.\n *\n * When the `items` signal changes, only the minimal set of DOM mutations is\n * performed using the LIS algorithm:\n * - New keys: create elements via `renderFn`\n * - Removed keys: remove elements from DOM\n * - Moved keys: reorder elements using minimum moves (n - LIS)\n * - Same keys: keep row nodes and update index signals\n * (or re-render row content when `updateOnItemChange: 'rerender'`)\n *\n * @param items Signal getter returning the current array of items.\n * @param keyFn Extracts a unique key from each item.\n * @param renderFn Renders a single item. Receives the item and a reactive index getter.\n * @returns A DocumentFragment to insert into the DOM. The fragment includes\n * start/end comment markers and any initial list items.\n *\n * ```ts\n * const frag = createList(\n * todos,\n * (t) => t.id,\n * (todo, index) => h('li', null, () => `${index() + 1}. ${todo.text}`),\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createList<T>(\n items: () => T[],\n keyFn: (item: T) => string | number,\n renderFn: (item: T, index: () => number) => HTMLElement,\n options?: CreateListOptions,\n): DocumentFragment {\n if (hydrating) {\n return { type: 'list', items, keyFn, renderFn, options } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-list-start');\n const endMarker = document.createComment('forma-list-end');\n\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Cache: key -> { element, item, setIndex }\n let cache = new Map<string | number, CachedItem<T>>();\n let currentNodes: Node[] = [];\n let currentItems: T[] = [];\n const updateOnItemChange = options?.updateOnItemChange ?? 'none';\n\n internalEffect(() => {\n const newItems = items();\n\n // The parent is discovered lazily: once the fragment has been inserted\n // into the live DOM the markers have a parentNode.\n const parent = startMarker.parentNode;\n if (!parent) {\n // Markers are not yet in the DOM — nothing to reconcile.\n // This can happen if the effect fires synchronously before mount.\n return;\n }\n\n // Edge case: non-array\n if (!Array.isArray(newItems)) {\n if (__DEV__) {\n console.warn('[forma] createList: value is not an array, treating as empty');\n }\n // Remove all nodes between the markers\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node);\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n return;\n }\n\n // Filter nullish items — avoid array allocation when no nulls found (common case)\n let cleanItems: T[] = newItems;\n for (let i = 0; i < newItems.length; i++) {\n if (newItems[i] == null) {\n cleanItems = newItems.filter(item => item != null);\n break;\n }\n }\n\n // Dev-mode duplicate key detection\n if (__DEV__) {\n const seen = new Set<string | number>();\n for (const item of cleanItems) {\n const key = keyFn(item);\n if (seen.has(key)) {\n console.warn('[forma] createList: duplicate key detected:', key);\n }\n seen.add(key);\n }\n }\n\n const updateRow = updateOnItemChange === 'rerender'\n ? (node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (!cached) return;\n if (cached.item === item) return;\n cached.item = item;\n\n if (!(node instanceof HTMLElement)) return;\n if ((node as any)[ABORT_SYM] || (node as any)[CACHE_SYM] || (node as any)[DYNAMIC_CHILD_SYM]) {\n return;\n }\n\n const next = untrack(() => renderFn(item, cached.getIndex));\n if (canPatchStaticElement(node, next)) {\n patchStaticElement(node, next);\n cached.element = node;\n }\n }\n : (_node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n };\n\n const oldCache = cache;\n\n const result = reconcileList<T>(\n parent,\n currentItems,\n cleanItems,\n currentNodes,\n keyFn,\n // createFn: create element + cache entry.\n // Each item is rendered inside createRoot + untrack so that inner\n // effects are owned by the item's root (not the parent), and are\n // disposed when the item is removed from the list.\n (item) => {\n const key = keyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n let itemDispose!: () => void;\n const element = createRoot((dispose) => {\n itemDispose = dispose;\n return untrack(() => renderFn(item, getIndex));\n });\n cache.set(key, { element, item, getIndex, setIndex, dispose: itemDispose });\n return element;\n },\n updateRow,\n // beforeNode: insert items before the end marker\n endMarker,\n );\n\n // Rebuild cache + update index signals in a single pass.\n // Avoids .map() array allocation + Set construction from the previous approach.\n const newCache = new Map<string | number, CachedItem<T>>();\n for (let i = 0; i < cleanItems.length; i++) {\n const key = keyFn(cleanItems[i]!);\n const cached = oldCache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n\n // Dispose removed items' reactive roots\n for (const [key, cached] of oldCache) {\n if (!newCache.has(key)) {\n cached.dispose();\n }\n }\n\n cache = newCache;\n\n currentNodes = result.nodes;\n currentItems = result.items;\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached item roots and clear references. Item roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const cached of cache.values()) {\n cached.dispose();\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n });\n\n return fragment;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/dom/element.ts","../src/dom/show.ts","../src/dom/hydrate.ts","../src/dom/list.ts"],"names":["fragment","ABORT_SYM","parent","CACHE_SYM","DYNAMIC_CHILD_SYM"],"mappings":"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","file":"chunk-MIOMT2CB.js","sourcesContent":["/**\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/**\n * Parse a CSS string (e.g. \"color: red; font-size: 14px\") into a style object.\n * Uses camelCase keys for CSSOM assignment via Object.assign(el.style, ...).\n * This avoids el.style.cssText which is blocked by strict CSP style-src policies.\n */\nfunction parseCssString(css: string): Record<string, string> {\n const obj: Record<string, string> = {};\n for (const decl of css.split(';')) {\n const colon = decl.indexOf(':');\n if (colon < 0) continue;\n const prop = decl.slice(0, colon).trim();\n const val = decl.slice(colon + 1).trim();\n if (prop && val) {\n // kebab-case → camelCase (e.g. \"font-size\" → \"fontSize\")\n const camel = prop.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n obj[camel] = val;\n }\n }\n return obj;\n}\n\n/** Apply a style object to an element via CSSOM (CSP-safe). */\nfunction applyStyleObj(el: Element, obj: Record<string, string>, prevKeys: string[]): string[] {\n const style = (el as HTMLElement | SVGElement).style;\n const nextKeys = Object.keys(obj);\n for (const k of prevKeys) {\n if (!(k in obj)) {\n style.removeProperty(k.replace(/[A-Z]/g, (c) => '-' + c.toLowerCase()));\n }\n }\n Object.assign(style, obj);\n return nextKeys;\n}\n\n/** Handle style prop. Reconciles styles via CSSOM (CSP-safe — never uses cssText). */\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 = applyStyleObj(el, parseCssString(v), prevKeys);\n } else if (v && typeof v === 'object') {\n prevKeys = applyStyleObj(el, v as Record<string, string>, prevKeys);\n }\n });\n } else if (typeof value === 'string') {\n const cache = getCache(el);\n if (cache['style'] === value) return;\n cache['style'] = value;\n applyStyleObj(el, parseCssString(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 if (el instanceof HTMLElement) {\n el.className = value as string;\n } else {\n el.setAttribute('class', value as string);\n }\n return;\n }\n\n if (key === 'style') {\n if (typeof value === 'string') {\n applyStyleObj(el, parseCssString(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 // - Array (from .map()) → wrap in DocumentFragment, append/replace\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 // Fragment children are tracked separately because DocumentFragment\n // empties itself on appendChild — we need to remove children manually.\n let currentFragChildren: Node[] | null = null;\n let warnedArray = false;\n const DEBUG = typeof (globalThis as any).__FORMA_DEBUG__ !== 'undefined';\n\n // Helper: remove all tracked fragment children or the single current node\n const clearCurrent = () => {\n if (currentFragChildren) {\n for (const c of currentFragChildren) {\n if (c.parentNode === parent) parent.removeChild(c);\n }\n currentFragChildren = null;\n }\n if (currentNode && currentNode.parentNode === parent) {\n parent.removeChild(currentNode);\n }\n currentNode = null;\n };\n\n internalEffect(() => {\n const v = (child as () => unknown)();\n\n // Array return (e.g. from .map()) → wrap in DocumentFragment\n let resolved: unknown = v;\n if (Array.isArray(v)) {\n const frag = document.createDocumentFragment();\n for (const item of v) {\n if (item instanceof Node) frag.appendChild(item);\n else if (Array.isArray(item)) {\n if (DEBUG) console.warn('[forma] Nested arrays in function children are not supported. Flatten the array or use createList().');\n } else if (item != null && item !== false && item !== true) {\n frag.appendChild(new Text(String(item)));\n }\n }\n // Empty array → treat as null (no DOM output)\n resolved = frag.childNodes.length > 0 ? frag : null;\n\n if (DEBUG && !warnedArray) {\n warnedArray = true;\n console.warn('[forma] Function child returned an array — auto-wrapped in DocumentFragment. Consider using createList() or wrapping in a container element for better performance.');\n }\n }\n\n if (resolved instanceof Node) {\n // Clear previous state (fragment children or single node)\n clearCurrent();\n\n // Track fragment children before appendChild empties the fragment\n const isNewFrag = resolved instanceof DocumentFragment;\n if (isNewFrag) {\n currentFragChildren = Array.from(resolved.childNodes);\n }\n\n // Insert the new node/fragment\n parent.appendChild(resolved);\n currentNode = isNewFrag ? null : (resolved as Node);\n } else if (resolved == null || resolved === false || resolved === true) {\n // Null/false/true/empty array — remove current content\n clearCurrent();\n } else {\n // Primitive value — bind as text\n // Clear fragment children if transitioning from array → primitive\n if (currentFragChildren) {\n for (const c of currentFragChildren) {\n if (c.parentNode === parent) parent.removeChild(c);\n }\n currentFragChildren = null;\n }\n const text = typeof resolved === 'symbol' ? String(resolved) : String(resolved ?? '');\n if (!currentNode) {\n currentNode = new Text(text);\n parent.appendChild(currentNode);\n } else if (currentNode.nodeType === 3) {\n // In-place text update — avoids DOM removal/insertion\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, registerDisposer } 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 | null = () => null,\n): DocumentFragment {\n if (hydrating) {\n const branch = when() ? thenFn() : elseFn();\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 // Defense-in-depth: when the parent root is disposed, explicitly null\n // closure references so GC can reclaim them. The branch root is already\n // auto-registered with the parent (Solid-style ownership), but the closure\n // variables currentDispose / currentNode still hold stale references.\n registerDisposer(() => {\n if (currentDispose) {\n currentDispose();\n currentDispose = null;\n }\n currentNode = null;\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, createRoot, registerDisposer, __DEV__ } from '../reactive';\nimport { hydrating } from './hydrate.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Return value from {@link reconcileList} — the new nodes and items arrays. */\nexport interface ReconcileResult<T> {\n /** The DOM nodes currently in the list, in order. */\n nodes: Node[];\n /** The items array corresponding to the current nodes. */\n items: T[];\n}\n\n/** Animation hooks for list transitions. */\nexport interface ListTransitionHooks {\n /** Called after a new node is inserted into the DOM. */\n onInsert?: (node: Node) => void;\n /** Called before a node is removed. Call `done()` when the exit animation finishes. */\n onBeforeRemove?: (node: Node, done: () => void) => void;\n}\n\ninterface CachedItem<T> {\n element: HTMLElement;\n item: T;\n getIndex: () => number;\n setIndex: (v: number) => void;\n dispose: () => void;\n}\n\nexport interface CreateListOptions {\n /**\n * How to handle same-key items whose object identity changed.\n * - 'none' (default): keep the existing row node for maximum throughput.\n * - 'rerender': re-render changed rows and patch static row DOM in place.\n */\n updateOnItemChange?: 'none' | 'rerender';\n}\n\n// ---------------------------------------------------------------------------\n// LIS — O(n log n) via patience sorting + binary search\n// ---------------------------------------------------------------------------\n\n/**\n * Find the longest increasing subsequence.\n * Returns indices into the input array.\n * O(n log n) time, O(n) space.\n */\nexport function longestIncreasingSubsequence(arr: number[]): number[] {\n const n = arr.length;\n if (n === 0) return [];\n\n // Pre-allocate typed arrays — avoids V8 array growth overhead on push\n const tails = new Int32Array(n);\n const tailIndices = new Int32Array(n);\n const predecessor = new Int32Array(n).fill(-1);\n let tailsLen = 0;\n\n for (let i = 0; i < n; i++) {\n const val = arr[i]!;\n\n // Binary search: leftmost tail >= val\n let lo = 0, hi = tailsLen;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (tails[mid]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n tails[lo] = val;\n tailIndices[lo] = i;\n if (lo > 0) predecessor[i] = tailIndices[lo - 1]!;\n if (lo >= tailsLen) tailsLen++;\n }\n\n // Reconstruct — return plain array since callers expect number[]\n const result = new Array<number>(tailsLen);\n let idx = tailIndices[tailsLen - 1]!;\n for (let i = tailsLen - 1; i >= 0; i--) {\n result[i] = idx;\n idx = predecessor[idx]!;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// reconcileList — low-level keyed reconciler\n// ---------------------------------------------------------------------------\n\n/** Below this threshold, use flat array scan instead of Map for better cache locality. */\nconst SMALL_LIST_THRESHOLD = 32;\nconst ABORT_SYM = Symbol.for('forma-abort');\nconst CACHE_SYM = Symbol.for('forma-attr-cache');\nconst DYNAMIC_CHILD_SYM = Symbol.for('forma-dynamic-child');\n\nfunction canPatchStaticElement(target: Node, source: Node): target is HTMLElement {\n return target instanceof HTMLElement\n && source instanceof HTMLElement\n && target.tagName === source.tagName\n && !(target as any)[ABORT_SYM]\n && !(target as any)[CACHE_SYM]\n && !(target as any)[DYNAMIC_CHILD_SYM]\n && !(source as any)[ABORT_SYM]\n && !(source as any)[CACHE_SYM]\n && !(source as any)[DYNAMIC_CHILD_SYM];\n}\n\nfunction patchStaticElement(target: HTMLElement, source: HTMLElement): void {\n // Sync attributes (events/reactive bindings are excluded by canPatchStaticElement).\n const sourceAttrNames = new Set<string>();\n for (const attr of Array.from(source.attributes)) {\n sourceAttrNames.add(attr.name);\n if (target.getAttribute(attr.name) !== attr.value) {\n target.setAttribute(attr.name, attr.value);\n }\n }\n for (const attr of Array.from(target.attributes)) {\n if (!sourceAttrNames.has(attr.name)) {\n target.removeAttribute(attr.name);\n }\n }\n\n // Move freshly rendered children into the existing keyed node.\n target.replaceChildren(...Array.from(source.childNodes));\n}\n\n/**\n * Small-list reconciler: uses flat arrays + indexOf instead of Map/Set.\n * For < 32 items, linear scan is faster than hash computation overhead.\n */\nfunction reconcileSmall<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // Build flat arrays for old keys/nodes — better cache locality than Map\n const oldKeys: (string | number)[] = new Array(oldLen);\n for (let i = 0; i < oldLen; i++) {\n oldKeys[i] = keyFn(oldItems[i]!);\n }\n\n // Classify each new item: find matching old index via linear scan\n const oldIndices = new Array<number>(newLen);\n const oldUsed = new Uint8Array(oldLen); // 0 = unused, 1 = used\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n let found = -1;\n for (let j = 0; j < oldLen; j++) {\n if (!oldUsed[j] && oldKeys[j] === key) {\n found = j;\n oldUsed[j] = 1;\n break;\n }\n }\n oldIndices[i] = found;\n }\n\n // Remove old items not reused\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // Fast path: same keys, same order -> just update, 0 DOM moves\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // LIS for minimum moves (still needed even for small lists)\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = [];\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array as a bitmap instead of Set for small lists\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // Build result: walk right-to-left for stable insertBefore targets\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n/**\n * Reconcile a DOM parent's children to match a new array of items.\n * Uses keyed reconciliation with LIS for minimum DOM operations.\n *\n * For small lists (< 32 items), uses a flat array scan path that avoids\n * Map/Set hash overhead and provides better cache locality.\n *\n * @param parent - The container DOM element\n * @param oldItems - Previous array (from last reconciliation)\n * @param newItems - New array to render\n * @param oldNodes - Previous DOM nodes array\n * @param keyFn - Extracts a unique key from each item\n * @param createFn - Creates a new DOM node for an item\n * @param updateFn - Updates an existing DOM node with new item data\n * @param beforeNode - Optional boundary marker. When provided, new nodes are\n * inserted before this node instead of appended to parent.\n * This allows the reconciler to operate within a range\n * delimited by comment markers.\n * @returns Object with new nodes array and items array for next call\n */\nexport function reconcileList<T>(\n parent: Node,\n oldItems: T[],\n newItems: T[],\n oldNodes: Node[],\n keyFn: (item: T) => string | number,\n createFn: (item: T) => Node,\n updateFn: (node: Node, item: T) => void,\n beforeNode?: Node | null,\n hooks?: ListTransitionHooks,\n): ReconcileResult<T> {\n const oldLen = oldItems.length;\n const newLen = newItems.length;\n\n // --- Trivial: new is empty -> remove all ---\n if (newLen === 0) {\n for (let i = 0; i < oldLen; i++) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n return { nodes: [], items: [] };\n }\n\n // --- Trivial: old is empty -> create all ---\n if (oldLen === 0) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = createFn(newItems[i]!);\n if (beforeNode) {\n parent.insertBefore(node, beforeNode);\n } else {\n parent.appendChild(node);\n }\n hooks?.onInsert?.(node);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n\n // --- Small list path: flat array scan, no Map/Set overhead ---\n if (oldLen < SMALL_LIST_THRESHOLD) {\n return reconcileSmall(parent, oldItems, newItems, oldNodes, keyFn, createFn, updateFn, beforeNode, hooks);\n }\n\n // --- Large list path: Map-based approach ---\n const oldKeyMap = new Map<string | number, number>();\n for (let i = 0; i < oldLen; i++) {\n oldKeyMap.set(keyFn(oldItems[i]!), i);\n }\n\n // --- Classify each new item: reuse or create ---\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const oldIndices = new Array<number>(newLen); // -1 means new item\n const oldUsed = new Uint8Array(oldLen);\n\n for (let i = 0; i < newLen; i++) {\n const key = keyFn(newItems[i]!);\n const oldIdx = oldKeyMap.get(key);\n if (oldIdx !== undefined) {\n oldIndices[i] = oldIdx;\n oldUsed[oldIdx] = 1;\n } else {\n oldIndices[i] = -1;\n }\n }\n\n // --- Remove old items not in new array ---\n for (let i = 0; i < oldLen; i++) {\n if (!oldUsed[i]) {\n if (hooks?.onBeforeRemove) {\n const node = oldNodes[i]!;\n hooks.onBeforeRemove(node, () => {\n if (node.parentNode) node.parentNode.removeChild(node);\n });\n } else {\n parent.removeChild(oldNodes[i]!);\n }\n }\n }\n\n // --- Fast path: same keys, same order -> just update, 0 DOM moves ---\n if (oldLen === newLen) {\n let allSameOrder = true;\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== i) {\n allSameOrder = false;\n break;\n }\n }\n if (allSameOrder) {\n const nodes = new Array<Node>(newLen);\n for (let i = 0; i < newLen; i++) {\n const node = oldNodes[i]!;\n updateFn(node, newItems[i]!);\n nodes[i] = node;\n }\n return { nodes, items: newItems };\n }\n }\n\n // --- Find LIS of old indices (reused items only) ---\n const reusedIndices: number[] = [];\n const reusedPositions: number[] = []; // position in new array\n for (let i = 0; i < newLen; i++) {\n if (oldIndices[i] !== -1) {\n reusedIndices.push(oldIndices[i]!);\n reusedPositions.push(i);\n }\n }\n\n const lisOfReused = longestIncreasingSubsequence(reusedIndices);\n // Use Uint8Array bitmap instead of Set for O(1) lookup without hash overhead\n const lisFlags = new Uint8Array(newLen);\n for (const li of lisOfReused) {\n lisFlags[reusedPositions[li]!] = 1;\n }\n\n // --- Build result: walk right-to-left for stable insertBefore targets ---\n const newNodes = new Array<Node>(newLen);\n let nextSibling: Node | null = beforeNode ?? null;\n\n for (let i = newLen - 1; i >= 0; i--) {\n let node: Node;\n let isNew = false;\n\n if (oldIndices[i] === -1) {\n // NEW: create and insert\n node = createFn(newItems[i]!);\n isNew = true;\n } else {\n // REUSE: update content\n node = oldNodes[oldIndices[i]!]!;\n updateFn(node, newItems[i]!);\n\n if (lisFlags[i]) {\n // LIS item: already in correct relative position, don't move\n newNodes[i] = node;\n nextSibling = node;\n continue;\n }\n }\n\n // Insert/move into position\n if (nextSibling) {\n parent.insertBefore(node, nextSibling);\n } else {\n parent.appendChild(node);\n }\n\n if (isNew) hooks?.onInsert?.(node);\n\n newNodes[i] = node;\n nextSibling = node;\n }\n\n return { nodes: newNodes, items: newItems };\n}\n\n// ---------------------------------------------------------------------------\n// createList — high-level reactive API\n// ---------------------------------------------------------------------------\n\n/**\n * Create a reactively-bound list of DOM elements with keyed reconciliation.\n *\n * Returns a `DocumentFragment` containing two comment markers\n * (`<!--forma-list-start-->` and `<!--forma-list-end-->`) that delimit the\n * list's range in the DOM. All managed elements live between these markers.\n *\n * This avoids a wrapper `<div>` which would break `<table>`, `<ul>`,\n * `<select>` semantics and pollute the DOM.\n *\n * When the `items` signal changes, only the minimal set of DOM mutations is\n * performed using the LIS algorithm:\n * - New keys: create elements via `renderFn`\n * - Removed keys: remove elements from DOM\n * - Moved keys: reorder elements using minimum moves (n - LIS)\n * - Same keys: keep row nodes and update index signals\n * (or re-render row content when `updateOnItemChange: 'rerender'`)\n *\n * @param items Signal getter returning the current array of items.\n * @param keyFn Extracts a unique key from each item.\n * @param renderFn Renders a single item. Receives the item and a reactive index getter.\n * @returns A DocumentFragment to insert into the DOM. The fragment includes\n * start/end comment markers and any initial list items.\n *\n * ```ts\n * const frag = createList(\n * todos,\n * (t) => t.id,\n * (todo, index) => h('li', null, () => `${index() + 1}. ${todo.text}`),\n * );\n * container.appendChild(frag);\n * ```\n */\nexport function createList<T>(\n items: () => T[],\n keyFn: (item: T) => string | number,\n renderFn: (item: T, index: () => number) => HTMLElement,\n options?: CreateListOptions,\n): DocumentFragment {\n if (hydrating) {\n return { type: 'list', items, keyFn, renderFn, options } as unknown as DocumentFragment;\n }\n\n const startMarker = document.createComment('forma-list-start');\n const endMarker = document.createComment('forma-list-end');\n\n const fragment = document.createDocumentFragment();\n fragment.appendChild(startMarker);\n fragment.appendChild(endMarker);\n\n // Cache: key -> { element, item, setIndex }\n let cache = new Map<string | number, CachedItem<T>>();\n let currentNodes: Node[] = [];\n let currentItems: T[] = [];\n const updateOnItemChange = options?.updateOnItemChange ?? 'none';\n\n internalEffect(() => {\n const newItems = items();\n\n // The parent is discovered lazily: once the fragment has been inserted\n // into the live DOM the markers have a parentNode.\n const parent = startMarker.parentNode;\n if (!parent) {\n // Markers are not yet in the DOM — nothing to reconcile.\n // This can happen if the effect fires synchronously before mount.\n return;\n }\n\n // Edge case: non-array\n if (!Array.isArray(newItems)) {\n if (__DEV__) {\n console.warn('[forma] createList: value is not an array, treating as empty');\n }\n // Remove all nodes between the markers\n for (const node of currentNodes) {\n if (node.parentNode === parent) parent.removeChild(node);\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n return;\n }\n\n // Filter nullish items — avoid array allocation when no nulls found (common case)\n let cleanItems: T[] = newItems;\n for (let i = 0; i < newItems.length; i++) {\n if (newItems[i] == null) {\n cleanItems = newItems.filter(item => item != null);\n break;\n }\n }\n\n // Dev-mode duplicate key detection\n if (__DEV__) {\n const seen = new Set<string | number>();\n for (const item of cleanItems) {\n const key = keyFn(item);\n if (seen.has(key)) {\n console.warn('[forma] createList: duplicate key detected:', key);\n }\n seen.add(key);\n }\n }\n\n const updateRow = updateOnItemChange === 'rerender'\n ? (node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (!cached) return;\n if (cached.item === item) return;\n cached.item = item;\n\n if (!(node instanceof HTMLElement)) return;\n if ((node as any)[ABORT_SYM] || (node as any)[CACHE_SYM] || (node as any)[DYNAMIC_CHILD_SYM]) {\n return;\n }\n\n const next = untrack(() => renderFn(item, cached.getIndex));\n if (canPatchStaticElement(node, next)) {\n patchStaticElement(node, next);\n cached.element = node;\n }\n }\n : (_node: Node, item: T): void => {\n const key = keyFn(item);\n const cached = cache.get(key);\n if (cached) cached.item = item;\n };\n\n const oldCache = cache;\n\n const result = reconcileList<T>(\n parent,\n currentItems,\n cleanItems,\n currentNodes,\n keyFn,\n // createFn: create element + cache entry.\n // Each item is rendered inside createRoot + untrack so that inner\n // effects are owned by the item's root (not the parent), and are\n // disposed when the item is removed from the list.\n (item) => {\n const key = keyFn(item);\n const [getIndex, setIndex] = createSignal(0);\n let itemDispose!: () => void;\n const element = createRoot((dispose) => {\n itemDispose = dispose;\n return untrack(() => renderFn(item, getIndex));\n });\n cache.set(key, { element, item, getIndex, setIndex, dispose: itemDispose });\n return element;\n },\n updateRow,\n // beforeNode: insert items before the end marker\n endMarker,\n );\n\n // Rebuild cache + update index signals in a single pass.\n // Avoids .map() array allocation + Set construction from the previous approach.\n const newCache = new Map<string | number, CachedItem<T>>();\n for (let i = 0; i < cleanItems.length; i++) {\n const key = keyFn(cleanItems[i]!);\n const cached = oldCache.get(key);\n if (cached) {\n cached.setIndex(i);\n newCache.set(key, cached);\n }\n }\n\n // Dispose removed items' reactive roots\n for (const [key, cached] of oldCache) {\n if (!newCache.has(key)) {\n cached.dispose();\n }\n }\n\n cache = newCache;\n\n currentNodes = result.nodes;\n currentItems = result.items;\n });\n\n // Defense-in-depth: when the parent root is disposed, explicitly dispose\n // all cached item roots and clear references. Item roots are already\n // auto-registered with the parent (Solid-style ownership), but the cache\n // Map still holds stale references that prevent GC.\n registerDisposer(() => {\n for (const cached of cache.values()) {\n cached.dispose();\n }\n cache = new Map();\n currentNodes = [];\n currentItems = [];\n });\n\n return fragment;\n}\n"]}
|