@fictjs/runtime 0.2.3 → 0.4.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.
Files changed (58) hide show
  1. package/dist/advanced.cjs +10 -8
  2. package/dist/advanced.cjs.map +1 -1
  3. package/dist/advanced.d.cts +8 -16
  4. package/dist/advanced.d.ts +8 -16
  5. package/dist/advanced.js +5 -3
  6. package/dist/advanced.js.map +1 -1
  7. package/dist/{chunk-2U6M3LKS.cjs → chunk-ID3WBWNO.cjs} +452 -219
  8. package/dist/chunk-ID3WBWNO.cjs.map +1 -0
  9. package/dist/{chunk-5YTFFAVU.cjs → chunk-L4DIV3RC.cjs} +7 -7
  10. package/dist/{chunk-5YTFFAVU.cjs.map → chunk-L4DIV3RC.cjs.map} +1 -1
  11. package/dist/{chunk-W525IQWC.cjs → chunk-M2TSXZ4C.cjs} +16 -16
  12. package/dist/{chunk-W525IQWC.cjs.map → chunk-M2TSXZ4C.cjs.map} +1 -1
  13. package/dist/{chunk-YVDWXY44.js → chunk-SO6X7G5S.js} +450 -217
  14. package/dist/chunk-SO6X7G5S.js.map +1 -0
  15. package/dist/{chunk-UHXUEGQH.js → chunk-TWELIZRY.js} +2 -2
  16. package/dist/{chunk-3WD7QD5G.js → chunk-XLIZJMMJ.js} +2 -2
  17. package/dist/{context-9gFXOdJl.d.cts → context-B25xyQrJ.d.cts} +36 -2
  18. package/dist/{context-4woHo7-L.d.ts → context-CGdP7_Jb.d.ts} +36 -2
  19. package/dist/{effect-ClARNUCc.d.cts → effect-D6kaLM2-.d.cts} +80 -1
  20. package/dist/{effect-ClARNUCc.d.ts → effect-D6kaLM2-.d.ts} +80 -1
  21. package/dist/index.cjs +40 -38
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +4 -4
  24. package/dist/index.d.ts +4 -4
  25. package/dist/index.dev.js +322 -145
  26. package/dist/index.dev.js.map +1 -1
  27. package/dist/index.js +4 -2
  28. package/dist/index.js.map +1 -1
  29. package/dist/internal.cjs +39 -35
  30. package/dist/internal.cjs.map +1 -1
  31. package/dist/internal.d.cts +8 -6
  32. package/dist/internal.d.ts +8 -6
  33. package/dist/internal.js +7 -3
  34. package/dist/internal.js.map +1 -1
  35. package/dist/{props-DAyeRPwH.d.ts → props-BEgIVMRx.d.ts} +8 -15
  36. package/dist/{props-CBwuh35e.d.cts → props-BIfromL0.d.cts} +8 -15
  37. package/dist/scope-Cx_3CjIZ.d.cts +18 -0
  38. package/dist/scope-CzNkn587.d.ts +18 -0
  39. package/package.json +3 -3
  40. package/src/advanced.ts +1 -0
  41. package/src/binding.ts +30 -4
  42. package/src/constants.ts +5 -0
  43. package/src/cycle-guard.ts +59 -7
  44. package/src/devtools.ts +22 -2
  45. package/src/dom.ts +84 -10
  46. package/src/hooks.ts +60 -13
  47. package/src/index.ts +3 -1
  48. package/src/internal.ts +2 -2
  49. package/src/lifecycle.ts +13 -5
  50. package/src/memo.ts +3 -4
  51. package/src/props.ts +16 -0
  52. package/src/signal.ts +204 -36
  53. package/dist/chunk-2U6M3LKS.cjs.map +0 -1
  54. package/dist/chunk-YVDWXY44.js.map +0 -1
  55. package/dist/scope-DvgMquEy.d.ts +0 -55
  56. package/dist/scope-xmdo6lVU.d.cts +0 -55
  57. /package/dist/{chunk-UHXUEGQH.js.map → chunk-TWELIZRY.js.map} +0 -0
  58. /package/dist/{chunk-3WD7QD5G.js.map → chunk-XLIZJMMJ.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/delegated-events.ts","../src/constants.ts","../src/devtools.ts","../src/cycle-guard.ts","../src/lifecycle.ts","../src/signal.ts","../src/effect.ts","../src/jsx.ts","../src/node-ops.ts","../src/transition.ts","../src/scheduler.ts","../src/binding.ts","../src/memo.ts","../src/hooks.ts","../src/props.ts","../src/dom.ts"],"sourcesContent":["export const DelegatedEventNames = [\n 'beforeinput',\n 'click',\n 'dblclick',\n 'contextmenu',\n 'focusin',\n 'focusout',\n 'input',\n 'keydown',\n 'keyup',\n 'mousedown',\n 'mousemove',\n 'mouseout',\n 'mouseover',\n 'mouseup',\n 'pointerdown',\n 'pointermove',\n 'pointerout',\n 'pointerover',\n 'pointerup',\n 'touchend',\n 'touchmove',\n 'touchstart',\n] as const\n","/**\n * Fict DOM Constants\n *\n * Property constants and configurations for DOM attribute handling.\n * Borrowed from dom-expressions for comprehensive DOM support.\n */\n\nimport { DelegatedEventNames } from './delegated-events'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Boolean Attributes\n// ============================================================================\n\n/**\n * Complete list of boolean attributes (lowercase)\n * These attributes are set as empty strings when true, removed when false\n */\nconst booleans = isDev\n ? [\n 'allowfullscreen',\n 'async',\n 'alpha', // HTMLInputElement\n 'autofocus', // HTMLElement prop\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'disabled',\n 'formnovalidate',\n 'hidden', // HTMLElement prop\n 'indeterminate',\n 'inert', // HTMLElement prop\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'seamless', // HTMLIframeElement - non-standard\n 'selected',\n // Experimental attributes\n 'adauctionheaders',\n 'browsingtopics',\n 'credentialless',\n 'defaultchecked',\n 'defaultmuted',\n 'defaultselected',\n 'defer',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'preservespitch',\n 'shadowrootclonable',\n 'shadowrootcustomelementregistry',\n 'shadowrootdelegatesfocus',\n 'shadowrootserializable',\n 'sharedstoragewritable',\n ]\n : []\n\nexport const BooleanAttributes = new Set<string>(booleans)\n\n// ============================================================================\n// Properties Set\n// ============================================================================\n\n/**\n * Properties that should be set via DOM property (not attribute)\n * Includes camelCase versions of boolean attributes\n */\nconst properties = isDev\n ? [\n // Core properties\n 'className',\n 'value',\n\n // CamelCase booleans\n 'readOnly',\n 'noValidate',\n 'formNoValidate',\n 'isMap',\n 'noModule',\n 'playsInline',\n\n // Experimental (camelCase)\n 'adAuctionHeaders',\n 'allowFullscreen',\n 'browsingTopics',\n 'defaultChecked',\n 'defaultMuted',\n 'defaultSelected',\n 'disablePictureInPicture',\n 'disableRemotePlayback',\n 'preservesPitch',\n 'shadowRootClonable',\n 'shadowRootCustomElementRegistry',\n 'shadowRootDelegatesFocus',\n 'shadowRootSerializable',\n 'sharedStorageWritable',\n\n // All lowercase booleans\n ...booleans,\n ]\n : []\n\nexport const Properties = new Set<string>(properties)\n\n// ============================================================================\n// Child Properties\n// ============================================================================\n\n/**\n * Properties that represent children/content\n */\nexport const ChildProperties = new Set<string>([\n 'innerHTML',\n 'textContent',\n 'innerText',\n 'children',\n])\n\n// ============================================================================\n// Property Aliases\n// ============================================================================\n\n/**\n * React compatibility aliases (className -> class)\n */\nexport const Aliases: Record<string, string> = {\n className: 'class',\n htmlFor: 'for',\n}\n\n/**\n * Element-specific property aliases\n * Maps lowercase attribute names to their camelCase property equivalents\n * Only for specific elements that have these properties\n */\nconst PropAliases: Record<string, string | { $: string; [tagName: string]: string | number }> =\n isDev\n ? {\n // Direct mapping\n class: 'className',\n\n // Element-specific mappings\n novalidate: {\n $: 'noValidate',\n FORM: 1,\n },\n formnovalidate: {\n $: 'formNoValidate',\n BUTTON: 1,\n INPUT: 1,\n },\n ismap: {\n $: 'isMap',\n IMG: 1,\n },\n nomodule: {\n $: 'noModule',\n SCRIPT: 1,\n },\n playsinline: {\n $: 'playsInline',\n VIDEO: 1,\n },\n readonly: {\n $: 'readOnly',\n INPUT: 1,\n TEXTAREA: 1,\n },\n\n // Experimental element-specific\n adauctionheaders: {\n $: 'adAuctionHeaders',\n IFRAME: 1,\n },\n allowfullscreen: {\n $: 'allowFullscreen',\n IFRAME: 1,\n },\n browsingtopics: {\n $: 'browsingTopics',\n IMG: 1,\n },\n defaultchecked: {\n $: 'defaultChecked',\n INPUT: 1,\n },\n defaultmuted: {\n $: 'defaultMuted',\n AUDIO: 1,\n VIDEO: 1,\n },\n defaultselected: {\n $: 'defaultSelected',\n OPTION: 1,\n },\n disablepictureinpicture: {\n $: 'disablePictureInPicture',\n VIDEO: 1,\n },\n disableremoteplayback: {\n $: 'disableRemotePlayback',\n AUDIO: 1,\n VIDEO: 1,\n },\n preservespitch: {\n $: 'preservesPitch',\n AUDIO: 1,\n VIDEO: 1,\n },\n shadowrootclonable: {\n $: 'shadowRootClonable',\n TEMPLATE: 1,\n },\n shadowrootdelegatesfocus: {\n $: 'shadowRootDelegatesFocus',\n TEMPLATE: 1,\n },\n shadowrootserializable: {\n $: 'shadowRootSerializable',\n TEMPLATE: 1,\n },\n sharedstoragewritable: {\n $: 'sharedStorageWritable',\n IFRAME: 1,\n IMG: 1,\n },\n }\n : {}\n\n/**\n * Get the property alias for a given attribute and tag name\n */\nexport function getPropAlias(prop: string, tagName: string): string | undefined {\n if (!isDev) return undefined\n const a = PropAliases[prop]\n if (typeof a === 'object') {\n return a[tagName] ? a['$'] : undefined\n }\n return a\n}\n\n// ============================================================================\n// Event Delegation\n// ============================================================================\n\n/**\n * Symbol for storing delegated events on the document\n */\nexport const $$EVENTS = '_$FICT_DELEGATE'\n\n/**\n * Events that should use event delegation for performance\n * These events bubble and are commonly used across many elements\n * Note: This must match the compiler's DelegatedEvents set\n */\nexport const DelegatedEvents = new Set<string>(DelegatedEventNames)\n\n// ============================================================================\n// SVG Support\n// ============================================================================\n\n/**\n * SVG element names (excluding common ones that overlap with HTML)\n */\nconst svgElements = isDev\n ? [\n 'altGlyph',\n 'altGlyphDef',\n 'altGlyphItem',\n 'animate',\n 'animateColor',\n 'animateMotion',\n 'animateTransform',\n 'circle',\n 'clipPath',\n 'color-profile',\n 'cursor',\n 'defs',\n 'desc',\n 'ellipse',\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n 'filter',\n 'font',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignObject',\n 'g',\n 'glyph',\n 'glyphRef',\n 'hkern',\n 'image',\n 'line',\n 'linearGradient',\n 'marker',\n 'mask',\n 'metadata',\n 'missing-glyph',\n 'mpath',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialGradient',\n 'rect',\n 'set',\n 'stop',\n 'svg',\n 'switch',\n 'symbol',\n 'text',\n 'textPath',\n 'tref',\n 'tspan',\n 'use',\n 'view',\n 'vkern',\n ]\n : []\n\nexport const SVGElements = new Set<string>(svgElements)\n\n/**\n * SVG attribute namespaces\n */\nexport const SVGNamespace: Record<string, string> = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace',\n}\n\n// ============================================================================\n// Unitless CSS Properties\n// ============================================================================\n\n/**\n * CSS properties that don't need a unit (like 'px')\n */\nconst unitlessList = isDev\n ? [\n 'animationIterationCount',\n 'animation-iteration-count',\n 'borderImageOutset',\n 'border-image-outset',\n 'borderImageSlice',\n 'border-image-slice',\n 'borderImageWidth',\n 'border-image-width',\n 'boxFlex',\n 'box-flex',\n 'boxFlexGroup',\n 'box-flex-group',\n 'boxOrdinalGroup',\n 'box-ordinal-group',\n 'columnCount',\n 'column-count',\n 'columns',\n 'flex',\n 'flexGrow',\n 'flex-grow',\n 'flexPositive',\n 'flex-positive',\n 'flexShrink',\n 'flex-shrink',\n 'flexNegative',\n 'flex-negative',\n 'flexOrder',\n 'flex-order',\n 'gridRow',\n 'grid-row',\n 'gridRowEnd',\n 'grid-row-end',\n 'gridRowSpan',\n 'grid-row-span',\n 'gridRowStart',\n 'grid-row-start',\n 'gridColumn',\n 'grid-column',\n 'gridColumnEnd',\n 'grid-column-end',\n 'gridColumnSpan',\n 'grid-column-span',\n 'gridColumnStart',\n 'grid-column-start',\n 'fontWeight',\n 'font-weight',\n 'lineClamp',\n 'line-clamp',\n 'lineHeight',\n 'line-height',\n 'opacity',\n 'order',\n 'orphans',\n 'tabSize',\n 'tab-size',\n 'widows',\n 'zIndex',\n 'z-index',\n 'zoom',\n 'fillOpacity',\n 'fill-opacity',\n 'floodOpacity',\n 'flood-opacity',\n 'stopOpacity',\n 'stop-opacity',\n 'strokeDasharray',\n 'stroke-dasharray',\n 'strokeDashoffset',\n 'stroke-dashoffset',\n 'strokeMiterlimit',\n 'stroke-miterlimit',\n 'strokeOpacity',\n 'stroke-opacity',\n 'strokeWidth',\n 'stroke-width',\n ]\n : ['opacity', 'zIndex']\n\nexport const UnitlessStyles = new Set<string>(unitlessList)\n","export interface FictDevtoolsHook {\n registerSignal: (id: number, value: unknown) => void\n updateSignal: (id: number, value: unknown) => void\n registerEffect: (id: number) => void\n effectRun: (id: number) => void\n cycleDetected?: (payload: { reason: string; detail?: Record<string, unknown> }) => void\n}\n\nfunction getGlobalHook(): FictDevtoolsHook | undefined {\n if (typeof globalThis === 'undefined') return undefined\n return (globalThis as typeof globalThis & { __FICT_DEVTOOLS_HOOK__?: FictDevtoolsHook })\n .__FICT_DEVTOOLS_HOOK__\n}\n\nexport function getDevtoolsHook(): FictDevtoolsHook | undefined {\n return getGlobalHook()\n}\n","import { getDevtoolsHook } from './devtools'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\nexport interface CycleProtectionOptions {\n /** Enable cycle protection guards (defaults to dev-only) */\n enabled?: boolean\n maxFlushCyclesPerMicrotask?: number\n maxEffectRunsPerFlush?: number\n windowSize?: number\n highUsageRatio?: number\n maxRootReentrantDepth?: number\n enableWindowWarning?: boolean\n devMode?: boolean\n}\n\ninterface CycleWindowEntry {\n used: number\n budget: number\n}\n\nlet setCycleProtectionOptions: (opts: CycleProtectionOptions) => void = () => {}\nlet resetCycleProtectionStateForTests: () => void = () => {}\nlet beginFlushGuard: () => void = () => {}\nlet beforeEffectRunGuard: () => boolean = () => true\nlet endFlushGuard: () => void = () => {}\nlet enterRootGuard: (root: object) => boolean = () => true\nlet exitRootGuard: (root: object) => void = () => {}\n\nconst defaultOptions = {\n enabled: isDev,\n maxFlushCyclesPerMicrotask: 10_000,\n maxEffectRunsPerFlush: 20_000,\n windowSize: 5,\n highUsageRatio: 0.8,\n maxRootReentrantDepth: 10,\n enableWindowWarning: true,\n devMode: false,\n}\n\nlet enabled = defaultOptions.enabled\nlet options: Required<CycleProtectionOptions> = {\n ...defaultOptions,\n} as Required<CycleProtectionOptions>\n\nlet effectRunsThisFlush = 0\nlet windowUsage: CycleWindowEntry[] = []\nlet rootDepth = new WeakMap<object, number>()\nlet flushWarned = false\nlet rootWarned = false\nlet windowWarned = false\n\nsetCycleProtectionOptions = opts => {\n if (typeof opts.enabled === 'boolean') {\n enabled = opts.enabled\n }\n options = { ...options, ...opts }\n}\n\nresetCycleProtectionStateForTests = () => {\n options = { ...defaultOptions } as Required<CycleProtectionOptions>\n enabled = defaultOptions.enabled\n effectRunsThisFlush = 0\n windowUsage = []\n rootDepth = new WeakMap<object, number>()\n flushWarned = false\n rootWarned = false\n windowWarned = false\n}\n\nbeginFlushGuard = () => {\n if (!enabled) return\n effectRunsThisFlush = 0\n flushWarned = false\n windowWarned = false\n}\n\nbeforeEffectRunGuard = () => {\n if (!enabled) return true\n const next = ++effectRunsThisFlush\n if (next > options.maxFlushCyclesPerMicrotask || next > options.maxEffectRunsPerFlush) {\n const message = `[fict] cycle protection triggered: flush-budget-exceeded`\n if (options.devMode) {\n throw new Error(message)\n }\n if (!flushWarned) {\n flushWarned = true\n console.warn(message, { effectRuns: next })\n }\n return false\n }\n return true\n}\n\nendFlushGuard = () => {\n if (!enabled) return\n recordWindowUsage(effectRunsThisFlush, options.maxFlushCyclesPerMicrotask)\n effectRunsThisFlush = 0\n}\n\nenterRootGuard = root => {\n if (!enabled) return true\n const depth = (rootDepth.get(root) ?? 0) + 1\n if (depth > options.maxRootReentrantDepth) {\n const message = `[fict] cycle protection triggered: root-reentry`\n if (options.devMode) {\n throw new Error(message)\n }\n if (!rootWarned) {\n rootWarned = true\n console.warn(message, { depth })\n }\n return false\n }\n rootDepth.set(root, depth)\n return true\n}\n\nexitRootGuard = root => {\n if (!enabled) return\n const depth = rootDepth.get(root)\n if (depth === undefined) return\n if (depth <= 1) {\n rootDepth.delete(root)\n } else {\n rootDepth.set(root, depth - 1)\n }\n}\n\nconst recordWindowUsage = (used: number, budget: number): void => {\n if (!options.enableWindowWarning) return\n const entry = { used, budget }\n windowUsage.push(entry)\n if (windowUsage.length > options.windowSize) {\n windowUsage.shift()\n }\n if (windowWarned) return\n if (\n windowUsage.length >= options.windowSize &&\n windowUsage.every(item => item.budget > 0 && item.used / item.budget >= options.highUsageRatio)\n ) {\n windowWarned = true\n reportCycle('high-usage-window', {\n windowSize: options.windowSize,\n ratio: options.highUsageRatio,\n })\n }\n}\n\nconst reportCycle = (\n reason: string,\n detail: Record<string, unknown> | undefined = undefined,\n): void => {\n const hook = getDevtoolsHook()\n hook?.cycleDetected?.(detail ? { reason, detail } : { reason })\n console.warn(`[fict] cycle protection triggered: ${reason}`, detail ?? '')\n}\n\nexport {\n setCycleProtectionOptions,\n resetCycleProtectionStateForTests,\n beginFlushGuard,\n beforeEffectRunGuard,\n endFlushGuard,\n enterRootGuard,\n exitRootGuard,\n}\n","import { enterRootGuard, exitRootGuard } from './cycle-guard'\nimport type { Cleanup, ErrorInfo, SuspenseToken } from './types'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\ntype LifecycleFn = () => void | Cleanup\n\nexport interface RootContext {\n parent?: RootContext | undefined\n onMountCallbacks?: LifecycleFn[]\n cleanups: Cleanup[]\n destroyCallbacks: Cleanup[]\n errorHandlers?: ErrorHandler[]\n suspenseHandlers?: SuspenseHandler[]\n suspended?: boolean\n}\n\nexport interface CreateRootOptions {\n inherit?: boolean\n}\n\ntype ErrorHandler = (err: unknown, info?: ErrorInfo) => boolean | void\ntype SuspenseHandler = (token: SuspenseToken | PromiseLike<unknown>) => boolean | void\n\nlet currentRoot: RootContext | undefined\nlet currentEffectCleanups: Cleanup[] | undefined\nconst globalErrorHandlers = new WeakMap<RootContext, ErrorHandler[]>()\nconst globalSuspenseHandlers = new WeakMap<RootContext, SuspenseHandler[]>()\n\nexport function createRootContext(parent?: RootContext): RootContext {\n return { parent, cleanups: [], destroyCallbacks: [], suspended: false }\n}\n\nexport function pushRoot(root: RootContext): RootContext | undefined {\n if (!enterRootGuard(root)) {\n return currentRoot\n }\n const prev = currentRoot\n currentRoot = root\n return prev\n}\n\nexport function getCurrentRoot(): RootContext | undefined {\n return currentRoot\n}\n\nexport function popRoot(prev: RootContext | undefined): void {\n if (currentRoot) {\n exitRootGuard(currentRoot)\n }\n currentRoot = prev\n}\n\nexport function onMount(fn: LifecycleFn): void {\n if (currentRoot) {\n ;(currentRoot.onMountCallbacks ||= []).push(fn)\n return\n }\n runLifecycle(fn)\n}\n\nexport function onDestroy(fn: LifecycleFn): void {\n if (currentRoot) {\n currentRoot.destroyCallbacks.push(() => runLifecycle(fn))\n return\n }\n runLifecycle(fn)\n}\n\nexport function onCleanup(fn: Cleanup): void {\n registerEffectCleanup(fn)\n}\n\nexport function flushOnMount(root: RootContext): void {\n const cbs = root.onMountCallbacks\n if (!cbs || cbs.length === 0) return\n for (let i = 0; i < cbs.length; i++) {\n const cleanup = cbs[i]!()\n if (typeof cleanup === 'function') {\n root.cleanups.push(cleanup)\n }\n }\n cbs.length = 0\n}\n\nexport function registerRootCleanup(fn: Cleanup): void {\n if (currentRoot) {\n currentRoot.cleanups.push(fn)\n }\n}\n\nexport function clearRoot(root: RootContext): void {\n runCleanupList(root.cleanups)\n if (root.onMountCallbacks) {\n root.onMountCallbacks.length = 0\n }\n}\n\nexport function destroyRoot(root: RootContext): void {\n clearRoot(root)\n runCleanupList(root.destroyCallbacks)\n if (root.errorHandlers) {\n root.errorHandlers.length = 0\n }\n if (globalErrorHandlers.has(root)) {\n globalErrorHandlers.delete(root)\n }\n if (root.suspenseHandlers) {\n root.suspenseHandlers.length = 0\n }\n if (globalSuspenseHandlers.has(root)) {\n globalSuspenseHandlers.delete(root)\n }\n}\n\nexport function createRoot<T>(\n fn: () => T,\n options?: CreateRootOptions,\n): { dispose: () => void; value: T } {\n const parent = options?.inherit ? currentRoot : undefined\n const root = createRootContext(parent)\n const prev = pushRoot(root)\n let value: T\n try {\n value = fn()\n } finally {\n popRoot(prev)\n }\n flushOnMount(root)\n return {\n dispose: () => destroyRoot(root),\n value,\n }\n}\n\nexport function withEffectCleanups<T>(bucket: Cleanup[], fn: () => T): T {\n const prev = currentEffectCleanups\n currentEffectCleanups = bucket\n try {\n return fn()\n } finally {\n currentEffectCleanups = prev\n }\n}\n\nexport function registerEffectCleanup(fn: Cleanup): void {\n if (currentEffectCleanups) {\n currentEffectCleanups.push(fn)\n } else {\n registerRootCleanup(fn)\n }\n}\n\nexport function runCleanupList(list: Cleanup[]): void {\n let error: unknown\n for (let i = list.length - 1; i >= 0; i--) {\n try {\n const cleanup = list[i]\n if (cleanup) cleanup()\n } catch (err) {\n if (error === undefined) {\n error = err\n }\n }\n }\n list.length = 0\n if (error !== undefined) {\n if (!handleError(error, { source: 'cleanup' })) {\n throw error\n }\n }\n}\n\nfunction runLifecycle(fn: LifecycleFn): void {\n const cleanup = fn()\n if (typeof cleanup === 'function') {\n cleanup()\n }\n}\n\nexport function registerErrorHandler(fn: ErrorHandler): void {\n if (!currentRoot) {\n const message = isDev\n ? 'registerErrorHandler must be called within a root'\n : 'FICT:E_ROOT_HANDLER'\n throw new Error(message)\n }\n if (!currentRoot.errorHandlers) {\n currentRoot.errorHandlers = []\n }\n currentRoot.errorHandlers.push(fn)\n const existing = globalErrorHandlers.get(currentRoot)\n if (existing) {\n existing.push(fn)\n } else {\n globalErrorHandlers.set(currentRoot, [fn])\n }\n}\n\nexport function registerSuspenseHandler(fn: SuspenseHandler): void {\n if (!currentRoot) {\n const message = isDev\n ? 'registerSuspenseHandler must be called within a root'\n : 'FICT:E_ROOT_SUSPENSE'\n throw new Error(message)\n }\n if (!currentRoot.suspenseHandlers) {\n currentRoot.suspenseHandlers = []\n }\n currentRoot.suspenseHandlers.push(fn)\n const existing = globalSuspenseHandlers.get(currentRoot)\n if (existing) {\n existing.push(fn)\n } else {\n globalSuspenseHandlers.set(currentRoot, [fn])\n }\n}\n\nexport function handleError(err: unknown, info?: ErrorInfo, startRoot?: RootContext): boolean {\n let root: RootContext | undefined = startRoot ?? currentRoot\n let error = err\n while (root) {\n const handlers = root.errorHandlers\n if (handlers && handlers.length) {\n for (let i = handlers.length - 1; i >= 0; i--) {\n const handler = handlers[i]!\n try {\n const handled = handler(error, info)\n if (handled !== false) {\n return true\n }\n } catch (nextErr) {\n error = nextErr\n }\n }\n }\n root = root.parent\n }\n const globalForRoot = startRoot\n ? globalErrorHandlers.get(startRoot)\n : currentRoot\n ? globalErrorHandlers.get(currentRoot)\n : undefined\n if (globalForRoot && globalForRoot.length) {\n for (let i = globalForRoot.length - 1; i >= 0; i--) {\n const handler = globalForRoot[i]!\n try {\n const handled = handler(error, info)\n if (handled !== false) {\n return true\n }\n } catch (nextErr) {\n error = nextErr\n }\n }\n }\n // The caller (e.g., runCleanupList) can decide whether to rethrow.\n // This makes the API consistent: handleError always returns a boolean\n // indicating whether the error was handled.\n return false\n}\n\nexport function handleSuspend(\n token: SuspenseToken | PromiseLike<unknown>,\n startRoot?: RootContext,\n): boolean {\n let root: RootContext | undefined = startRoot ?? currentRoot\n const originRoot = root // Preserve reference to set suspended flag on success\n while (root) {\n const handlers = root.suspenseHandlers\n if (handlers && handlers.length) {\n for (let i = handlers.length - 1; i >= 0; i--) {\n const handler = handlers[i]!\n const handled = handler(token)\n if (handled !== false) {\n // Only set suspended = true when a handler actually handles the token\n if (originRoot) originRoot.suspended = true\n return true\n }\n }\n }\n root = root.parent\n }\n const globalForRoot =\n startRoot && globalSuspenseHandlers.get(startRoot)\n ? globalSuspenseHandlers.get(startRoot)\n : currentRoot\n ? globalSuspenseHandlers.get(currentRoot)\n : undefined\n if (globalForRoot && globalForRoot.length) {\n for (let i = globalForRoot.length - 1; i >= 0; i--) {\n const handler = globalForRoot[i]!\n const handled = handler(token)\n if (handled !== false) {\n // Only set suspended = true when a handler actually handles the token\n if (originRoot) originRoot.suspended = true\n return true\n }\n }\n }\n return false\n}\n","import { beginFlushGuard, beforeEffectRunGuard, endFlushGuard } from './cycle-guard'\nimport { getDevtoolsHook } from './devtools'\nimport {\n getCurrentRoot,\n handleError,\n handleSuspend,\n registerRootCleanup,\n type RootContext,\n} from './lifecycle'\nimport type { SuspenseToken } from './types'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/**\n * Reactive node that can be either a signal, computed, effect, or effect scope\n */\nexport type ReactiveNode =\n | SignalNode<unknown>\n | ComputedNode<unknown>\n | EffectNode\n | EffectScopeNode\n | SubscriberNode\n\n/**\n * Link between a dependency and a subscriber in the reactive graph\n */\nexport interface Link {\n /** Version/cycle when this link was created */\n version: number\n /** The dependency being tracked */\n dep: ReactiveNode\n /** The subscriber tracking this dependency */\n sub: ReactiveNode\n /** Previous dependency link in the subscriber's dependency list */\n prevDep: Link | undefined\n /** Next dependency link in the subscriber's dependency list */\n nextDep: Link | undefined\n /** Previous subscriber link in the dependency's subscriber list */\n prevSub: Link | undefined\n /** Next subscriber link in the dependency's subscriber list */\n nextSub: Link | undefined\n}\n\n/**\n * Stack frame for traversing the reactive graph\n */\nexport interface StackFrame {\n /** The link value at this stack level */\n value: Link | undefined\n /** Previous stack frame */\n prev: StackFrame | undefined\n}\n\n/**\n * Base interface for all reactive nodes\n */\nexport interface BaseNode {\n /** First subscriber link */\n subs: Link | undefined\n /** Last subscriber link */\n subsTail: Link | undefined\n /** Reactive flags (Mutable, Watching, Running, etc.) */\n flags: number\n}\n\n/**\n * Signal node - mutable reactive value\n */\nexport interface SignalNode<T = unknown> extends BaseNode {\n /** Current committed value */\n currentValue: T\n /** Pending value to be committed */\n pendingValue: T\n /** Signals don't have dependencies */\n deps?: undefined\n depsTail?: undefined\n getter?: undefined\n}\n\n/**\n * Computed node - derived reactive value\n */\nexport interface ComputedNode<T = unknown> extends BaseNode {\n /** Current computed value */\n value: T\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Getter function to compute the value */\n getter: (oldValue: T | undefined) => T\n}\n\n/**\n * Effect node - side effect that runs when dependencies change\n */\nexport interface EffectNode extends BaseNode {\n /** Effect function to execute */\n fn: () => void\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Optional cleanup runner to be called before checkDirty */\n runCleanup?: () => void\n /** Root context for error/suspense handling */\n root?: RootContext\n /** Devtools ID */\n __id?: number | undefined\n}\n\n/**\n * Effect scope node - manages multiple effects\n */\nexport interface EffectScopeNode extends BaseNode {\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n}\n\n/**\n * Subscriber node used in trigger\n */\nexport interface SubscriberNode {\n /** First dependency link */\n deps: Link | undefined\n /** Last dependency link */\n depsTail: Link | undefined\n /** Reactive flags */\n flags: number\n subs?: undefined\n subsTail?: undefined\n}\n\n/**\n * Signal accessor - function to get/set signal value\n */\nexport interface SignalAccessor<T> {\n (): T\n (value: T): void\n}\n\n/**\n * Computed accessor - function to get computed value\n */\nexport type ComputedAccessor<T> = () => T\n\n/**\n * Effect disposer - function to dispose an effect\n */\nexport type EffectDisposer = () => void\n\n/**\n * Effect scope disposer - function to dispose an effect scope\n */\nexport type EffectScopeDisposer = () => void\n\n/**\n * Options for creating a custom reactive system\n */\nexport interface ReactiveSystemOptions {\n /** Update function for reactive nodes */\n update: (node: ReactiveNode) => boolean\n /** Notify function when a subscriber needs to be notified */\n notify: (sub: ReactiveNode) => void\n /** Callback when a dependency becomes unwatched */\n unwatched: (dep: ReactiveNode) => void\n}\n\n/**\n * Custom reactive system methods\n */\nexport interface ReactiveSystem {\n /** Link a dependency to a subscriber */\n link: typeof link\n /** Unlink a dependency from a subscriber */\n unlink: (lnk: Link, sub?: ReactiveNode) => Link | undefined\n /** Propagate changes through the reactive graph */\n propagate: (firstLink: Link) => void\n /** Check if a node is dirty */\n checkDirty: (firstLink: Link, sub: ReactiveNode) => boolean\n /** Shallow propagate changes */\n shallowPropagate: (firstLink: Link) => void\n}\n\n// ============================================================================\n// Flags\n// ============================================================================\nconst Mutable = 1\nconst Watching = 2\nconst Running = 4\nconst Recursed = 8\nconst Dirty = 16\nconst Pending = 32\n// Pre-computed combinations\nconst MutableDirty = 17\nconst MutablePending = 33\nconst MutableRunning = 5\nconst WatchingRunning = 6\n// Global state\nlet cycle = 0\nlet batchDepth = 0\nlet activeSub: ReactiveNode | undefined\nlet flushScheduled = false\n// Dual-priority queue for scheduler\nconst highPriorityQueue: EffectNode[] = []\nconst lowPriorityQueue: EffectNode[] = []\nlet isInTransition = false\nconst enqueueMicrotask =\n typeof queueMicrotask === 'function'\n ? queueMicrotask\n : (fn: () => void) => {\n Promise.resolve().then(fn)\n }\n// Flag to indicate cleanup is running - signal reads should return currentValue without updating\nlet inCleanup = false\n// This ensures type detection works correctly even after minification\nconst SIGNAL_MARKER = Symbol.for('fict:signal')\nconst COMPUTED_MARKER = Symbol.for('fict:computed')\nconst EFFECT_MARKER = Symbol.for('fict:effect')\nconst EFFECT_SCOPE_MARKER = Symbol.for('fict:effectScope')\nexport const ReactiveFlags = {\n None: 0,\n Mutable,\n Watching,\n RecursedCheck: Running,\n Recursed,\n Dirty,\n Pending,\n}\n// ============================================================================\n// createReactiveSystem - Support for custom systems\n// ============================================================================\n/**\n * Create a custom reactive system with custom update, notify, and unwatched handlers\n * @param options - Reactive system options\n * @returns Custom reactive system methods\n */\nexport function createReactiveSystem({\n update,\n notify: notifyFn,\n unwatched: unwatchedFn,\n}: ReactiveSystemOptions): ReactiveSystem {\n function customPropagate(firstLink: Link): void {\n let link = firstLink\n let next = link.nextSub\n let stack: StackFrame | undefined\n\n top: for (;;) {\n const sub = link.sub\n let flags = sub.flags\n\n if (!(flags & 60)) {\n sub.flags = flags | Pending\n } else if (!(flags & 12)) {\n flags = 0\n } else if (!(flags & Running)) {\n sub.flags = (flags & ~Recursed) | Pending\n } else if (!(flags & 48)) {\n let vlink = sub.depsTail\n let valid = false\n while (vlink !== undefined) {\n if (vlink === link) {\n valid = true\n break\n }\n vlink = vlink.prevDep\n }\n if (valid) {\n sub.flags = flags | 40\n flags &= Mutable\n } else {\n flags = 0\n }\n } else {\n flags = 0\n }\n\n if (flags & Watching) notifyFn(sub)\n\n if (flags & Mutable) {\n const subSubs = sub.subs\n if (subSubs !== undefined) {\n const nextSub = subSubs.nextSub\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack }\n next = nextSub\n }\n link = subSubs\n continue\n }\n }\n\n if (next !== undefined) {\n link = next\n next = link.nextSub\n continue\n }\n\n while (stack !== undefined) {\n link = stack.value!\n stack = stack.prev\n if (link !== undefined) {\n next = link.nextSub\n continue top\n }\n }\n break\n }\n }\n function customCheckDirty(firstLink: Link, sub: ReactiveNode): boolean {\n let link = firstLink\n let stack: StackFrame | undefined\n let checkDepth = 0\n let dirty = false\n\n top: for (;;) {\n const dep = link.dep\n const depFlags = dep.flags\n\n if (sub.flags & Dirty) {\n dirty = true\n } else if ((depFlags & MutableDirty) === MutableDirty) {\n if (update(dep)) {\n const subs = dep.subs\n if (subs !== undefined && subs.nextSub !== undefined) {\n customShallowPropagate(subs)\n }\n dirty = true\n }\n } else if ((depFlags & MutablePending) === MutablePending) {\n if (!dep.deps) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n } else {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack }\n }\n link = dep.deps\n sub = dep\n ++checkDepth\n continue\n }\n }\n\n if (!dirty) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth-- > 0) {\n const firstSub = sub.subs!\n const hasMultipleSubs = firstSub.nextSub !== undefined\n\n if (hasMultipleSubs) {\n link = stack!.value!\n stack = stack!.prev\n } else link = firstSub\n\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) customShallowPropagate(firstSub)\n sub = link.sub\n continue\n }\n dirty = false\n } else {\n sub.flags &= ~Pending\n }\n\n sub = link.sub\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue top\n }\n }\n\n return dirty\n }\n }\n function customShallowPropagate(firstLink: Link): void {\n let link: Link | undefined = firstLink\n do {\n const sub = link.sub\n const flags = sub.flags\n if ((flags & 48) === Pending) {\n sub.flags = flags | Dirty\n if ((flags & 6) === Watching) notifyFn(sub)\n }\n link = link.nextSub\n } while (link !== undefined)\n }\n function customUnlink(lnk: Link, sub: ReactiveNode = lnk.sub): Link | undefined {\n const dep = lnk.dep\n const prevDep = lnk.prevDep\n const nextDep = lnk.nextDep\n const nextSub = lnk.nextSub\n const prevSub = lnk.prevSub\n\n if (nextDep !== undefined) nextDep.prevDep = prevDep\n else sub.depsTail = prevDep\n if (prevDep !== undefined) prevDep.nextDep = nextDep\n else sub.deps = nextDep\n\n if (nextSub !== undefined) nextSub.prevSub = prevSub\n else dep.subsTail = prevSub\n if (prevSub !== undefined) prevSub.nextSub = nextSub\n else if ((dep.subs = nextSub) === undefined) unwatchedFn(dep)\n\n return nextDep\n }\n return {\n link,\n unlink: customUnlink,\n propagate: customPropagate,\n checkDirty: customCheckDirty,\n shallowPropagate: customShallowPropagate,\n }\n}\n// ============================================================================\n// Core functions\n// ============================================================================\n/**\n * Create a link between a dependency and a subscriber\n * @param dep - The dependency node\n * @param sub - The subscriber node\n * @param version - The cycle version\n */\nfunction link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n const prevDep = sub.depsTail\n if (prevDep !== undefined && prevDep.dep === dep) return\n\n const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n if (nextDep !== undefined && nextDep.dep === dep) {\n nextDep.version = version\n sub.depsTail = nextDep\n return\n }\n\n const prevSub = dep.subsTail\n if (prevSub !== undefined && prevSub.version === version && prevSub.sub === sub) return\n\n const newLink = { version, dep, sub, prevDep, nextDep, prevSub, nextSub: undefined }\n sub.depsTail = newLink\n dep.subsTail = newLink\n\n if (nextDep !== undefined) nextDep.prevDep = newLink\n if (prevDep !== undefined) prevDep.nextDep = newLink\n else sub.deps = newLink\n if (prevSub !== undefined) prevSub.nextSub = newLink\n else dep.subs = newLink\n}\n/**\n * Remove a link between a dependency and a subscriber\n * @param lnk - The link to remove\n * @param sub - The subscriber node (defaults to lnk.sub)\n * @returns The next dependency link\n */\nfunction unlink(lnk: Link, sub: ReactiveNode = lnk.sub): Link | undefined {\n const dep = lnk.dep\n const prevDep = lnk.prevDep\n const nextDep = lnk.nextDep\n const nextSub = lnk.nextSub\n const prevSub = lnk.prevSub\n\n if (nextDep !== undefined) nextDep.prevDep = prevDep\n else sub.depsTail = prevDep\n if (prevDep !== undefined) prevDep.nextDep = nextDep\n else sub.deps = nextDep\n\n if (nextSub !== undefined) nextSub.prevSub = prevSub\n else dep.subsTail = prevSub\n if (prevSub !== undefined) prevSub.nextSub = nextSub\n else if ((dep.subs = nextSub) === undefined) unwatched(dep)\n\n return nextDep\n}\n/**\n * Handle when a dependency becomes unwatched\n * @param dep - The dependency node\n */\nfunction unwatched(dep: ReactiveNode): void {\n if (!(dep.flags & Mutable)) {\n disposeNode(dep)\n } else if ('getter' in dep && dep.getter !== undefined) {\n dep.depsTail = undefined\n dep.flags = MutableDirty\n purgeDeps(dep)\n }\n}\n/**\n * Propagate changes through the reactive graph\n * @param firstLink - The first link to propagate from\n */\nfunction propagate(firstLink: Link): void {\n let link = firstLink\n let next = link.nextSub\n let stack: StackFrame | undefined\n\n top: for (;;) {\n const sub = link.sub\n let flags = sub.flags\n\n if (!(flags & 60)) {\n sub.flags = flags | Pending\n } else if (!(flags & 12)) {\n flags = 0\n } else if (!(flags & Running)) {\n sub.flags = (flags & ~Recursed) | Pending\n } else if (!(flags & 48)) {\n let vlink = sub.depsTail\n let valid = false\n while (vlink !== undefined) {\n if (vlink === link) {\n valid = true\n break\n }\n vlink = vlink.prevDep\n }\n if (valid) {\n sub.flags = flags | 40\n flags &= Mutable\n } else {\n flags = 0\n }\n } else {\n flags = 0\n }\n\n if (flags & Watching) notify(sub)\n\n if (flags & Mutable) {\n const subSubs = sub.subs\n if (subSubs !== undefined) {\n const nextSub = subSubs.nextSub\n if (nextSub !== undefined) {\n stack = { value: next, prev: stack }\n next = nextSub\n }\n link = subSubs\n continue\n }\n }\n\n if (next !== undefined) {\n link = next\n next = link.nextSub\n continue\n }\n\n while (stack !== undefined) {\n link = stack.value!\n stack = stack.prev\n if (link !== undefined) {\n next = link.nextSub\n continue top\n }\n }\n break\n }\n}\n/**\n * Check if a node is dirty by traversing its dependencies\n * @param firstLink - The first link to check\n * @param sub - The subscriber node\n * @returns True if the node is dirty\n */\nfunction checkDirty(firstLink: Link, sub: ReactiveNode): boolean {\n let link = firstLink\n let stack: StackFrame | undefined\n let checkDepth = 0\n let dirty = false\n\n top: for (;;) {\n const dep = link.dep\n const depFlags = dep.flags\n\n if (sub.flags & Dirty) {\n dirty = true\n } else if ((depFlags & MutableDirty) === MutableDirty) {\n if (update(dep)) {\n const subs = dep.subs\n if (subs !== undefined && subs.nextSub !== undefined) shallowPropagate(subs)\n dirty = true\n }\n } else if ((depFlags & MutablePending) === MutablePending) {\n if (!dep.deps) {\n // No dependencies to check, skip this node\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n } else {\n if (link.nextSub !== undefined || link.prevSub !== undefined) {\n stack = { value: link, prev: stack }\n }\n link = dep.deps\n sub = dep\n ++checkDepth\n continue\n }\n }\n\n if (!dirty) {\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue\n }\n }\n\n while (checkDepth-- > 0) {\n const firstSub = sub.subs!\n const hasMultipleSubs = firstSub.nextSub !== undefined\n\n if (hasMultipleSubs) {\n link = stack!.value!\n stack = stack!.prev\n } else {\n link = firstSub\n }\n\n if (dirty) {\n if (update(sub)) {\n if (hasMultipleSubs) shallowPropagate(firstSub)\n sub = link.sub\n continue\n }\n dirty = false\n } else {\n sub.flags &= ~Pending\n }\n\n sub = link.sub\n const nextDep = link.nextDep\n if (nextDep !== undefined) {\n link = nextDep\n continue top\n }\n }\n\n return dirty\n }\n}\n/**\n * Shallow propagate changes without traversing deeply\n * @param firstLink - The first link to propagate from\n */\nfunction shallowPropagate(firstLink: Link): void {\n let link: Link | undefined = firstLink\n do {\n const sub = link.sub\n const flags = sub.flags\n if ((flags & 48) === Pending) {\n sub.flags = flags | Dirty\n if ((flags & 6) === Watching) notify(sub)\n }\n link = link.nextSub\n } while (link !== undefined)\n}\n/**\n * Update a reactive node (signal or computed)\n * @param node - The node to update\n * @returns True if the value changed\n */\nfunction update(node: ReactiveNode): boolean {\n return 'getter' in node && node.getter !== undefined\n ? updateComputed(node as ComputedNode)\n : updateSignal(node as SignalNode)\n}\n/**\n * Notify an effect and add it to the queue\n * @param effect - The effect to notify\n */\nfunction notify(effect: ReactiveNode): void {\n effect.flags &= ~Watching\n const effects: EffectNode[] = []\n\n for (;;) {\n effects.push(effect as EffectNode)\n const nextLink = effect.subs\n if (nextLink === undefined) break\n effect = nextLink.sub\n if (effect === undefined || !(effect.flags & Watching)) break\n effect.flags &= ~Watching\n }\n\n // Route effects to appropriate queue based on transition context\n const targetQueue = isInTransition ? lowPriorityQueue : highPriorityQueue\n for (let i = effects.length - 1; i >= 0; i--) {\n targetQueue.push(effects[i]!)\n }\n}\n/**\n * Purge all dependencies from a subscriber\n * @param sub - The subscriber node\n */\nfunction purgeDeps(sub: ReactiveNode): void {\n const depsTail = sub.depsTail\n let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps\n while (dep !== undefined) dep = unlink(dep, sub)\n}\n/**\n * Dispose a reactive node\n * @param node - The node to dispose\n */\nfunction disposeNode(node: ReactiveNode): void {\n node.depsTail = undefined\n node.flags = 0\n purgeDeps(node)\n let sub = node.subs\n while (sub !== undefined) {\n const next = sub.nextSub\n unlink(sub)\n sub = next\n }\n}\n/**\n * Update a signal node\n * @param s - The signal node\n * @returns True if the value changed\n */\nfunction updateSignal(s: SignalNode): boolean {\n s.flags = Mutable\n const current = s.currentValue\n const pending = s.pendingValue\n if (current !== pending) {\n s.currentValue = pending\n return true\n }\n return false\n}\n/**\n * Update a computed node\n * @param c - The computed node\n * @returns True if the value changed\n */\nfunction updateComputed<T>(c: ComputedNode<T>): boolean {\n ++cycle\n const oldValue = c.value\n c.depsTail = undefined\n c.flags = MutableRunning\n const prevSub = activeSub\n activeSub = c\n\n try {\n const newValue = c.getter(oldValue)\n activeSub = prevSub\n c.flags &= ~Running\n purgeDeps(c)\n if (oldValue !== newValue) {\n c.value = newValue\n return true\n }\n return false\n } catch (e) {\n activeSub = prevSub\n c.flags &= ~Running\n throw e\n }\n}\n/**\n * Run an effect\n * @param e - The effect node\n */\nfunction runEffect(e: EffectNode): void {\n const flags = e.flags\n // Run cleanup BEFORE checkDirty so cleanup sees previous signal values\n if (flags & Dirty) {\n if (e.runCleanup) {\n inCleanup = true\n try {\n e.runCleanup()\n } finally {\n inCleanup = false\n }\n }\n ++cycle\n effectRunDevtools(e)\n e.depsTail = undefined\n e.flags = WatchingRunning\n const prevSub = activeSub\n activeSub = e\n try {\n e.fn()\n activeSub = prevSub\n e.flags = Watching\n purgeDeps(e)\n } catch (err) {\n activeSub = prevSub\n e.flags = Watching\n throw err\n }\n } else if (flags & Pending && e.deps) {\n // Run cleanup before checkDirty which commits signal values\n if (e.runCleanup) {\n inCleanup = true\n try {\n e.runCleanup()\n } finally {\n inCleanup = false\n }\n }\n let isDirty = false\n try {\n isDirty = checkDirty(e.deps, e)\n } catch (err) {\n if (handleSuspend(err as SuspenseToken, e.root)) {\n if (e.flags !== 0) {\n e.flags = Watching\n }\n return\n }\n if (handleError(err, { source: 'effect' }, e.root)) {\n if (e.flags !== 0) {\n e.flags = Watching\n }\n return\n }\n throw err\n }\n if (isDirty) {\n ++cycle\n effectRunDevtools(e)\n e.depsTail = undefined\n e.flags = WatchingRunning\n const prevSub = activeSub\n activeSub = e\n try {\n e.fn()\n activeSub = prevSub\n e.flags = Watching\n purgeDeps(e)\n } catch (err) {\n activeSub = prevSub\n e.flags = Watching\n throw err\n }\n } else {\n e.flags = Watching\n }\n } else {\n e.flags = Watching\n }\n}\n/**\n * Schedule a flush in a microtask to coalesce synchronous writes\n */\nexport function scheduleFlush(): void {\n const hasWork = highPriorityQueue.length > 0 || lowPriorityQueue.length > 0\n if (flushScheduled || !hasWork) return\n if (batchDepth > 0) return\n flushScheduled = true\n enqueueMicrotask(() => {\n flush()\n })\n}\n/**\n * Flush all queued effects with priority-based scheduling\n * High priority effects execute first; low priority can be interrupted\n */\nfunction flush(): void {\n beginFlushGuard()\n if (batchDepth > 0) {\n // If batching is active, defer until the batch completes\n scheduleFlush()\n endFlushGuard()\n return\n }\n const hasWork = highPriorityQueue.length > 0 || lowPriorityQueue.length > 0\n if (!hasWork) {\n flushScheduled = false\n endFlushGuard()\n return\n }\n flushScheduled = false\n\n // 1. Process all high-priority effects first\n let highIndex = 0\n while (highIndex < highPriorityQueue.length) {\n const e = highPriorityQueue[highIndex]!\n if (!beforeEffectRunGuard()) {\n if (highIndex > 0) {\n highPriorityQueue.copyWithin(0, highIndex)\n highPriorityQueue.length -= highIndex\n }\n endFlushGuard()\n return\n }\n highIndex++\n runEffect(e)\n }\n highPriorityQueue.length = 0\n\n // 2. Process low-priority effects, interruptible by high priority\n let lowIndex = 0\n while (lowIndex < lowPriorityQueue.length) {\n // Check if high priority work arrived during low priority execution\n if (highPriorityQueue.length > 0) {\n if (lowIndex > 0) {\n lowPriorityQueue.copyWithin(0, lowIndex)\n lowPriorityQueue.length -= lowIndex\n }\n scheduleFlush()\n endFlushGuard()\n return\n }\n const e = lowPriorityQueue[lowIndex]!\n if (!beforeEffectRunGuard()) {\n if (lowIndex > 0) {\n lowPriorityQueue.copyWithin(0, lowIndex)\n lowPriorityQueue.length -= lowIndex\n }\n endFlushGuard()\n return\n }\n lowIndex++\n runEffect(e)\n }\n lowPriorityQueue.length = 0\n\n endFlushGuard()\n}\n// ============================================================================\n// Signal - Inline optimized version\n// ============================================================================\n/**\n * Create a reactive signal\n * @param initialValue - The initial value\n * @returns A signal accessor function\n */\nexport function signal<T>(initialValue: T): SignalAccessor<T> {\n const s = {\n currentValue: initialValue,\n pendingValue: initialValue,\n subs: undefined,\n subsTail: undefined,\n flags: Mutable,\n __id: undefined as number | undefined,\n }\n registerSignalDevtools(initialValue, s)\n const accessor = signalOper.bind(s) as SignalAccessor<T> & Record<symbol, boolean>\n accessor[SIGNAL_MARKER] = true\n return accessor as SignalAccessor<T>\n}\nfunction signalOper<T>(this: SignalNode<T>, value?: T): T | void {\n if (arguments.length > 0) {\n if (this.pendingValue !== value) {\n this.pendingValue = value as T\n this.flags = MutableDirty\n updateSignalDevtools(this, value)\n const subs = this.subs\n if (subs !== undefined) {\n propagate(subs)\n if (!batchDepth) scheduleFlush()\n }\n }\n return\n }\n\n const flags = this.flags\n // During cleanup, don't update signal - return currentValue as-is\n if (flags & Dirty && !inCleanup) {\n if (updateSignal(this)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n }\n\n let sub = activeSub\n while (sub !== undefined) {\n if (sub.flags & 3) {\n link(this, sub, cycle)\n break\n }\n const subSubs = sub.subs\n sub = subSubs !== undefined ? subSubs.sub : undefined\n }\n\n return this.currentValue\n}\n// ============================================================================\n// Computed\n// ============================================================================\n/**\n * Create a computed reactive value\n * @param getter - The getter function\n * @returns A computed accessor function\n */\nexport function computed<T>(getter: (oldValue?: T) => T): ComputedAccessor<T> {\n const c: ComputedNode<T> = {\n value: undefined as unknown as T,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: 0,\n getter,\n }\n const bound = (computedOper as (this: ComputedNode<T>) => T).bind(c) as ComputedAccessor<T> &\n Record<symbol, boolean>\n bound[COMPUTED_MARKER] = true\n return bound as ComputedAccessor<T>\n}\nfunction computedOper<T>(this: ComputedNode<T>): T {\n const flags = this.flags\n\n if (flags & Dirty) {\n if (updateComputed(this)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n } else if (flags & Pending) {\n if (this.deps && checkDirty(this.deps, this)) {\n if (updateComputed(this)) {\n const subs = this.subs\n if (subs !== undefined) shallowPropagate(subs)\n }\n } else {\n this.flags = flags & ~Pending\n }\n } else if (!flags) {\n this.flags = MutableRunning\n const prevSub = setActiveSub(this)\n try {\n this.value = this.getter(undefined)\n } finally {\n setActiveSub(prevSub)\n this.flags &= ~Running\n }\n }\n\n if (activeSub !== undefined) link(this, activeSub, cycle)\n return this.value\n}\n// ============================================================================\n// Effect\n// ============================================================================\n/**\n * Create a reactive effect\n * @param fn - The effect function\n * @returns An effect disposer function\n */\nexport function effect(fn: () => void): EffectDisposer {\n const e: EffectNode = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: WatchingRunning,\n __id: undefined as number | undefined,\n }\n const root = getCurrentRoot()\n if (root) {\n e.root = root\n }\n\n registerEffectDevtools(e)\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n effectRunDevtools(e)\n fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~Running\n }\n\n const disposer = effectOper.bind(e) as EffectDisposer & Record<symbol, boolean>\n disposer[EFFECT_MARKER] = true\n return disposer as EffectDisposer\n}\n\n/**\n * Create a reactive effect with a custom cleanup runner\n * The cleanup runner is called BEFORE signal values are committed, allowing\n * cleanup functions to access the previous values of signals.\n * @param fn - The effect function\n * @param cleanupRunner - Function to run cleanups before signal value commit\n * @param root - Root context for error/suspense handling (defaults to current root)\n * @returns An effect disposer function\n */\nexport function effectWithCleanup(\n fn: () => void,\n cleanupRunner: () => void,\n root?: RootContext,\n): EffectDisposer {\n const e: EffectNode = {\n fn,\n subs: undefined,\n subsTail: undefined,\n deps: undefined,\n depsTail: undefined,\n flags: WatchingRunning,\n runCleanup: cleanupRunner,\n __id: undefined as number | undefined,\n }\n const resolvedRoot = root ?? getCurrentRoot()\n if (resolvedRoot) {\n e.root = resolvedRoot\n }\n\n registerEffectDevtools(e)\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n effectRunDevtools(e)\n fn()\n } finally {\n activeSub = prevSub\n e.flags &= ~Running\n }\n\n const disposer = effectOper.bind(e) as EffectDisposer & Record<symbol, boolean>\n disposer[EFFECT_MARKER] = true\n return disposer as EffectDisposer\n}\n\nfunction effectOper(this: EffectNode): void {\n disposeNode(this)\n}\n// ============================================================================\n// Effect Scope\n// ============================================================================\n/**\n * Create a reactive effect scope\n * @param fn - The scope function\n * @returns An effect scope disposer function\n */\nexport function effectScope(fn: () => void): EffectScopeDisposer {\n const e = { deps: undefined, depsTail: undefined, subs: undefined, subsTail: undefined, flags: 0 }\n\n const prevSub = activeSub\n if (prevSub !== undefined) link(e, prevSub, 0)\n activeSub = e\n\n try {\n fn()\n } finally {\n activeSub = prevSub\n }\n\n const disposer = effectScopeOper.bind(e) as EffectScopeDisposer & Record<symbol, boolean>\n disposer[EFFECT_SCOPE_MARKER] = true\n return disposer as EffectScopeDisposer\n}\nfunction effectScopeOper(this: EffectScopeNode): void {\n disposeNode(this)\n}\n// ============================================================================\n// Trigger\n// ============================================================================\n/**\n * Trigger a reactive computation without creating a persistent subscription\n * @param fn - The function to run\n */\nexport function trigger(fn: () => void): void {\n const sub: SubscriberNode = { deps: undefined, depsTail: undefined, flags: Watching }\n const prevSub = activeSub\n activeSub = sub as ReactiveNode\n\n try {\n fn()\n } finally {\n activeSub = prevSub\n let lnk = sub.deps\n while (lnk !== undefined) {\n const dep = lnk.dep\n lnk = unlink(lnk, sub)\n const subs = dep.subs\n if (subs !== undefined) {\n sub.flags = 0\n propagate(subs)\n shallowPropagate(subs)\n }\n }\n if (!batchDepth) scheduleFlush()\n }\n}\n// ============================================================================\n// Batch processing & Utility API\n// ============================================================================\n/**\n * Start a batch of updates\n */\nexport function startBatch(): void {\n ++batchDepth\n}\n/**\n * End a batch of updates and flush effects\n */\nexport function endBatch(): void {\n if (--batchDepth === 0) flush()\n}\n/**\n * Execute a function in a batch\n * @param fn - The function to execute\n * @returns The return value of the function\n */\nexport function batch<T>(fn: () => T): T {\n ++batchDepth\n let result!: T\n let error: unknown\n try {\n result = fn()\n } catch (e) {\n error = e\n } finally {\n --batchDepth\n if (batchDepth === 0) {\n try {\n flush()\n } catch (flushErr) {\n if (error === undefined) {\n error = flushErr\n }\n }\n }\n }\n if (error !== undefined) {\n throw error\n }\n return result\n}\n/**\n * Get the current active subscriber\n * @returns The active subscriber or undefined\n */\nexport function getActiveSub(): ReactiveNode | undefined {\n return activeSub\n}\n/**\n * Set the active subscriber\n * @param sub - The new active subscriber\n * @returns The previous active subscriber\n */\nexport function setActiveSub(sub: ReactiveNode | undefined): ReactiveNode | undefined {\n const prev = activeSub\n activeSub = sub\n return prev\n}\n/**\n * Get the current batch depth\n * @returns The current batch depth\n */\nexport function getBatchDepth(): number {\n return batchDepth\n}\n/**\n * Execute a function without tracking dependencies\n * @param fn - The function to execute\n * @returns The return value of the function\n */\nexport function untrack<T>(fn: () => T): T {\n const prev = activeSub\n activeSub = undefined\n try {\n return fn()\n } finally {\n activeSub = prev\n }\n}\n/**\n * Peek at a reactive value without tracking it as a dependency\n * @param accessor - The accessor function\n * @returns The value\n */\nexport function peek<T>(accessor: () => T): T {\n return untrack(accessor)\n}\n// This ensures correct detection even after minification\n/**\n * Check if a function is a signal accessor\n * @param fn - The function to check\n * @returns True if the function is a signal accessor\n */\nexport function isSignal(fn: unknown): fn is SignalAccessor<unknown> {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[SIGNAL_MARKER] === true\n )\n}\n/**\n * Check if a function is a computed accessor\n * @param fn - The function to check\n * @returns True if the function is a computed accessor\n */\nexport function isComputed(fn: unknown): fn is ComputedAccessor<unknown> {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[COMPUTED_MARKER] === true\n )\n}\n/**\n * Check if a function is an effect disposer\n * @param fn - The function to check\n * @returns True if the function is an effect disposer\n */\nexport function isEffect(fn: unknown): fn is EffectDisposer {\n return (\n typeof fn === 'function' && (fn as unknown as Record<symbol, boolean>)[EFFECT_MARKER] === true\n )\n}\n/**\n * Check if a function is an effect scope disposer\n * @param fn - The function to check\n * @returns True if the function is an effect scope disposer\n */\nexport function isEffectScope(fn: unknown): fn is EffectScopeDisposer {\n return (\n typeof fn === 'function' &&\n (fn as unknown as Record<symbol, boolean>)[EFFECT_SCOPE_MARKER] === true\n )\n}\n// ============================================================================\n// Transition Context (for priority scheduling)\n// ============================================================================\n/**\n * Set the transition context\n * @param value - Whether we're inside a transition\n * @returns The previous transition context value\n */\nexport function setTransitionContext(value: boolean): boolean {\n const prev = isInTransition\n isInTransition = value\n return prev\n}\n/**\n * Get the current transition context\n * @returns True if currently inside a transition\n */\nexport function getTransitionContext(): boolean {\n return isInTransition\n}\n// Export aliases for API compatibility\nexport { signal as createSignal }\nexport type { SignalAccessor as Signal }\n\nexport { flush, link, unlink, propagate, checkDirty, shallowPropagate }\nexport default {\n signal,\n computed,\n effect,\n effectScope,\n trigger,\n batch,\n startBatch,\n endBatch,\n flush,\n untrack,\n peek,\n isSignal,\n isComputed,\n isEffect,\n isEffectScope,\n getActiveSub,\n setActiveSub,\n getBatchDepth,\n link,\n unlink,\n propagate,\n checkDirty,\n shallowPropagate,\n createReactiveSystem,\n ReactiveFlags,\n}\nexport const $state = signal as <T>(value: T) => T\n\ninterface DevtoolsIdentifiable {\n __id?: number\n}\n\nlet registerSignalDevtools: (value: unknown, node: SignalNode) => number | undefined = () =>\n undefined\nlet updateSignalDevtools: (node: SignalNode, value: unknown) => void = () => {}\nlet registerEffectDevtools: (node: EffectNode) => number | undefined = () => undefined\nlet effectRunDevtools: (node: EffectNode) => void = () => {}\n\nif (isDev) {\n let devtoolsSignalId = 0\n let devtoolsEffectId = 0\n\n registerSignalDevtools = (value, node) => {\n const hook = getDevtoolsHook()\n if (!hook) return undefined\n const id = ++devtoolsSignalId\n hook.registerSignal(id, value)\n ;(node as SignalNode & DevtoolsIdentifiable).__id = id\n return id\n }\n\n updateSignalDevtools = (node, value) => {\n const hook = getDevtoolsHook()\n if (!hook) return\n const id = (node as SignalNode & DevtoolsIdentifiable).__id\n if (id) hook.updateSignal(id, value)\n }\n\n registerEffectDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return undefined\n const id = ++devtoolsEffectId\n hook.registerEffect(id)\n ;(node as EffectNode & DevtoolsIdentifiable).__id = id\n return id\n }\n\n effectRunDevtools = node => {\n const hook = getDevtoolsHook()\n if (!hook) return\n const id = (node as EffectNode & DevtoolsIdentifiable).__id\n if (id) hook.effectRun(id)\n }\n}\n\n// ============================================================================\n// Selector\n// ============================================================================\n/**\n * Create a selector signal that efficiently updates only when the selected key matches.\n * Useful for large lists where only one item is selected.\n *\n * @param source - The source signal returning the current key\n * @param equalityFn - Optional equality function\n * @returns A selector function that takes a key and returns a boolean signal accessor\n */\nexport function createSelector<T>(\n source: () => T,\n equalityFn: (a: T, b: T) => boolean = (a, b) => a === b,\n): (key: T) => boolean {\n let current = source()\n const observers = new Map<T, SignalAccessor<boolean>>()\n\n const dispose = effect(() => {\n const next = source()\n if (equalityFn(current, next)) return\n\n const prevSig = observers.get(current)\n if (prevSig) prevSig(false)\n\n const nextSig = observers.get(next)\n if (nextSig) nextSig(true)\n\n current = next\n })\n registerRootCleanup(() => {\n dispose()\n observers.clear()\n })\n\n return (key: T) => {\n let sig = observers.get(key)\n if (!sig) {\n sig = signal(equalityFn(key, current))\n observers.set(key, sig)\n registerRootCleanup(() => observers.delete(key))\n }\n return sig()\n }\n}\n","import {\n getCurrentRoot,\n handleError,\n handleSuspend,\n registerRootCleanup,\n runCleanupList,\n withEffectCleanups,\n} from './lifecycle'\nimport { effectWithCleanup } from './signal'\nimport type { Cleanup } from './types'\n\n/**\n * Effect callback run synchronously; async callbacks are not tracked after the first await.\n * TypeScript will reject `async () => {}` here—split async work or read signals before awaiting.\n */\nexport type Effect = () => void | Cleanup\n\nexport function createEffect(fn: Effect): () => void {\n let cleanups: Cleanup[] = []\n const rootForError = getCurrentRoot()\n\n // Cleanup runner - called by runEffect BEFORE signal values are committed\n const doCleanup = () => {\n runCleanupList(cleanups)\n cleanups = []\n }\n\n const run = () => {\n // Note: cleanups are now run by signal.ts runEffect before this function is called\n const bucket: Cleanup[] = []\n withEffectCleanups(bucket, () => {\n try {\n const maybeCleanup = fn()\n if (typeof maybeCleanup === 'function') {\n bucket.push(maybeCleanup)\n }\n } catch (err) {\n if (handleSuspend(err as any, rootForError)) {\n return\n }\n if (handleError(err, { source: 'effect' }, rootForError)) {\n return\n }\n throw err\n }\n })\n cleanups = bucket\n }\n\n const disposeEffect = effectWithCleanup(run, doCleanup, rootForError)\n const teardown = () => {\n runCleanupList(cleanups)\n disposeEffect()\n }\n\n registerRootCleanup(teardown)\n\n return teardown\n}\n\nexport const $effect = createEffect\n\nexport function createRenderEffect(fn: Effect): () => void {\n let cleanup: Cleanup | undefined\n const rootForError = getCurrentRoot()\n\n // Cleanup runner - called by runEffect BEFORE signal values are committed\n const doCleanup = () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n }\n\n const run = () => {\n // Note: cleanups are now run by signal.ts runEffect before this function is called\n try {\n const maybeCleanup = fn()\n if (typeof maybeCleanup === 'function') {\n cleanup = maybeCleanup\n }\n } catch (err) {\n if (handleSuspend(err as any, rootForError)) {\n return\n }\n const handled = handleError(err, { source: 'effect' }, rootForError)\n if (handled) {\n return\n }\n throw err\n }\n }\n\n const disposeEffect = effectWithCleanup(run, doCleanup, rootForError)\n const teardown = () => {\n if (cleanup) {\n cleanup()\n cleanup = undefined\n }\n disposeEffect()\n }\n\n registerRootCleanup(teardown)\n\n return teardown\n}\n","import type { FictNode } from './types'\n\nexport const Fragment = Symbol('Fragment')\n\nexport function jsx(\n type: string | typeof Fragment | ((props: Record<string, unknown>) => FictNode),\n props: Record<string, unknown>,\n key?: string,\n): FictNode {\n return { type, props, key }\n}\n\nexport const jsxs = jsx\nexport const jsxDEV = jsx\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace JSX {\n export type Element = FictNode\n\n export interface IntrinsicElements {\n // Document structure\n html: HTMLAttributes<HTMLHtmlElement>\n head: HTMLAttributes<HTMLHeadElement>\n body: HTMLAttributes<HTMLBodyElement>\n title: HTMLAttributes<HTMLTitleElement>\n meta: MetaHTMLAttributes<HTMLMetaElement>\n link: LinkHTMLAttributes<HTMLLinkElement>\n style: StyleHTMLAttributes<HTMLStyleElement>\n script: ScriptHTMLAttributes<HTMLScriptElement>\n noscript: HTMLAttributes<HTMLElement>\n\n // Layout & Semantic\n div: HTMLAttributes<HTMLDivElement>\n span: HTMLAttributes<HTMLSpanElement>\n main: HTMLAttributes<HTMLElement>\n header: HTMLAttributes<HTMLElement>\n footer: HTMLAttributes<HTMLElement>\n section: HTMLAttributes<HTMLElement>\n article: HTMLAttributes<HTMLElement>\n aside: HTMLAttributes<HTMLElement>\n nav: HTMLAttributes<HTMLElement>\n address: HTMLAttributes<HTMLElement>\n\n // Headings\n h1: HTMLAttributes<HTMLHeadingElement>\n h2: HTMLAttributes<HTMLHeadingElement>\n h3: HTMLAttributes<HTMLHeadingElement>\n h4: HTMLAttributes<HTMLHeadingElement>\n h5: HTMLAttributes<HTMLHeadingElement>\n h6: HTMLAttributes<HTMLHeadingElement>\n hgroup: HTMLAttributes<HTMLElement>\n\n // Text content\n p: HTMLAttributes<HTMLParagraphElement>\n blockquote: BlockquoteHTMLAttributes<HTMLQuoteElement>\n pre: HTMLAttributes<HTMLPreElement>\n figure: HTMLAttributes<HTMLElement>\n figcaption: HTMLAttributes<HTMLElement>\n hr: HTMLAttributes<HTMLHRElement>\n br: HTMLAttributes<HTMLBRElement>\n wbr: HTMLAttributes<HTMLElement>\n\n // Inline text semantics\n a: AnchorHTMLAttributes<HTMLAnchorElement>\n abbr: HTMLAttributes<HTMLElement>\n b: HTMLAttributes<HTMLElement>\n bdi: HTMLAttributes<HTMLElement>\n bdo: HTMLAttributes<HTMLElement>\n cite: HTMLAttributes<HTMLElement>\n code: HTMLAttributes<HTMLElement>\n data: DataHTMLAttributes<HTMLDataElement>\n dfn: HTMLAttributes<HTMLElement>\n em: HTMLAttributes<HTMLElement>\n i: HTMLAttributes<HTMLElement>\n kbd: HTMLAttributes<HTMLElement>\n mark: HTMLAttributes<HTMLElement>\n q: QuoteHTMLAttributes<HTMLQuoteElement>\n rp: HTMLAttributes<HTMLElement>\n rt: HTMLAttributes<HTMLElement>\n ruby: HTMLAttributes<HTMLElement>\n s: HTMLAttributes<HTMLElement>\n samp: HTMLAttributes<HTMLElement>\n small: HTMLAttributes<HTMLElement>\n strong: HTMLAttributes<HTMLElement>\n sub: HTMLAttributes<HTMLElement>\n sup: HTMLAttributes<HTMLElement>\n time: TimeHTMLAttributes<HTMLTimeElement>\n u: HTMLAttributes<HTMLElement>\n var: HTMLAttributes<HTMLElement>\n\n // Lists\n ul: HTMLAttributes<HTMLUListElement>\n ol: OlHTMLAttributes<HTMLOListElement>\n li: LiHTMLAttributes<HTMLLIElement>\n dl: HTMLAttributes<HTMLDListElement>\n dt: HTMLAttributes<HTMLElement>\n dd: HTMLAttributes<HTMLElement>\n menu: HTMLAttributes<HTMLMenuElement>\n\n // Tables\n table: TableHTMLAttributes<HTMLTableElement>\n caption: HTMLAttributes<HTMLTableCaptionElement>\n colgroup: ColgroupHTMLAttributes<HTMLTableColElement>\n col: ColHTMLAttributes<HTMLTableColElement>\n thead: HTMLAttributes<HTMLTableSectionElement>\n tbody: HTMLAttributes<HTMLTableSectionElement>\n tfoot: HTMLAttributes<HTMLTableSectionElement>\n tr: HTMLAttributes<HTMLTableRowElement>\n th: ThHTMLAttributes<HTMLTableCellElement>\n td: TdHTMLAttributes<HTMLTableCellElement>\n\n // Forms\n form: FormHTMLAttributes<HTMLFormElement>\n fieldset: FieldsetHTMLAttributes<HTMLFieldSetElement>\n legend: HTMLAttributes<HTMLLegendElement>\n label: LabelHTMLAttributes<HTMLLabelElement>\n input: InputHTMLAttributes<HTMLInputElement>\n button: ButtonHTMLAttributes<HTMLButtonElement>\n select: SelectHTMLAttributes<HTMLSelectElement>\n datalist: HTMLAttributes<HTMLDataListElement>\n optgroup: OptgroupHTMLAttributes<HTMLOptGroupElement>\n option: OptionHTMLAttributes<HTMLOptionElement>\n textarea: TextareaHTMLAttributes<HTMLTextAreaElement>\n output: OutputHTMLAttributes<HTMLOutputElement>\n progress: ProgressHTMLAttributes<HTMLProgressElement>\n meter: MeterHTMLAttributes<HTMLMeterElement>\n\n // Interactive\n details: DetailsHTMLAttributes<HTMLDetailsElement>\n summary: HTMLAttributes<HTMLElement>\n dialog: DialogHTMLAttributes<HTMLDialogElement>\n\n // Media\n img: ImgHTMLAttributes<HTMLImageElement>\n picture: HTMLAttributes<HTMLPictureElement>\n source: SourceHTMLAttributes<HTMLSourceElement>\n audio: AudioVideoHTMLAttributes<HTMLAudioElement>\n video: AudioVideoHTMLAttributes<HTMLVideoElement>\n track: TrackHTMLAttributes<HTMLTrackElement>\n map: MapHTMLAttributes<HTMLMapElement>\n area: AreaHTMLAttributes<HTMLAreaElement>\n\n // Embedded content\n iframe: IframeHTMLAttributes<HTMLIFrameElement>\n embed: EmbedHTMLAttributes<HTMLEmbedElement>\n object: ObjectHTMLAttributes<HTMLObjectElement>\n param: ParamHTMLAttributes<HTMLParamElement>\n canvas: CanvasHTMLAttributes<HTMLCanvasElement>\n\n // SVG (basic support)\n svg: SVGAttributes<SVGSVGElement>\n path: SVGAttributes<SVGPathElement>\n circle: SVGAttributes<SVGCircleElement>\n rect: SVGAttributes<SVGRectElement>\n line: SVGAttributes<SVGLineElement>\n polyline: SVGAttributes<SVGPolylineElement>\n polygon: SVGAttributes<SVGPolygonElement>\n ellipse: SVGAttributes<SVGEllipseElement>\n g: SVGAttributes<SVGGElement>\n defs: SVGAttributes<SVGDefsElement>\n use: SVGAttributes<SVGUseElement>\n text: SVGAttributes<SVGTextElement>\n tspan: SVGAttributes<SVGTSpanElement>\n\n // Web components / other\n template: HTMLAttributes<HTMLTemplateElement>\n slot: SlotHTMLAttributes<HTMLSlotElement>\n portal: HTMLAttributes<HTMLElement>\n }\n\n export interface ElementChildrenAttribute {\n children: unknown\n }\n}\n\n// ============================================================================\n// Base HTML Attributes\n// ============================================================================\n\ninterface HTMLAttributes<T> {\n // Children\n children?: FictNode | FictNode[]\n\n // JSX special attributes\n key?: string | number\n\n // Core attributes\n id?: string\n class?: string\n style?: string | Record<string, string | number>\n title?: string\n lang?: string\n dir?: 'ltr' | 'rtl' | 'auto'\n hidden?: boolean | 'hidden' | 'until-found'\n tabIndex?: number\n draggable?: boolean | 'true' | 'false'\n contentEditable?: boolean | 'true' | 'false' | 'inherit'\n spellCheck?: boolean | 'true' | 'false'\n translate?: 'yes' | 'no'\n inert?: boolean\n popover?: 'auto' | 'manual'\n\n // Experimental / newer\n autofocus?: boolean\n slot?: string\n accessKey?: string\n\n // Event handlers\n onClick?: (e: MouseEvent) => void\n onDblClick?: (e: MouseEvent) => void\n onMouseDown?: (e: MouseEvent) => void\n onMouseUp?: (e: MouseEvent) => void\n onMouseMove?: (e: MouseEvent) => void\n onMouseEnter?: (e: MouseEvent) => void\n onMouseLeave?: (e: MouseEvent) => void\n onMouseOver?: (e: MouseEvent) => void\n onMouseOut?: (e: MouseEvent) => void\n onContextMenu?: (e: MouseEvent) => void\n onInput?: (e: InputEvent) => void\n onChange?: (e: Event) => void\n onSubmit?: (e: SubmitEvent) => void\n onReset?: (e: Event) => void\n onKeyDown?: (e: KeyboardEvent) => void\n onKeyUp?: (e: KeyboardEvent) => void\n onKeyPress?: (e: KeyboardEvent) => void\n onFocus?: (e: FocusEvent) => void\n onBlur?: (e: FocusEvent) => void\n onScroll?: (e: Event) => void\n onWheel?: (e: WheelEvent) => void\n onLoad?: (e: Event) => void\n onError?: (e: Event) => void\n\n // Drag events\n onDrag?: (e: DragEvent) => void\n onDragStart?: (e: DragEvent) => void\n onDragEnd?: (e: DragEvent) => void\n onDragEnter?: (e: DragEvent) => void\n onDragLeave?: (e: DragEvent) => void\n onDragOver?: (e: DragEvent) => void\n onDrop?: (e: DragEvent) => void\n\n // Touch events\n onTouchStart?: (e: TouchEvent) => void\n onTouchMove?: (e: TouchEvent) => void\n onTouchEnd?: (e: TouchEvent) => void\n onTouchCancel?: (e: TouchEvent) => void\n\n // Animation events\n onAnimationStart?: (e: AnimationEvent) => void\n onAnimationEnd?: (e: AnimationEvent) => void\n onAnimationIteration?: (e: AnimationEvent) => void\n onTransitionEnd?: (e: TransitionEvent) => void\n\n // Pointer events\n onPointerDown?: (e: PointerEvent) => void\n onPointerUp?: (e: PointerEvent) => void\n onPointerMove?: (e: PointerEvent) => void\n onPointerEnter?: (e: PointerEvent) => void\n onPointerLeave?: (e: PointerEvent) => void\n onPointerOver?: (e: PointerEvent) => void\n onPointerOut?: (e: PointerEvent) => void\n onPointerCancel?: (e: PointerEvent) => void\n\n // Ref\n ref?: ((el: T | null) => void) | { current: T | null }\n\n // ARIA attributes (common ones)\n role?: string\n 'aria-hidden'?: boolean | 'true' | 'false'\n 'aria-label'?: string\n 'aria-labelledby'?: string\n 'aria-describedby'?: string\n 'aria-live'?: 'off' | 'polite' | 'assertive'\n 'aria-atomic'?: boolean | 'true' | 'false'\n 'aria-busy'?: boolean | 'true' | 'false'\n 'aria-current'?: boolean | 'true' | 'false' | 'page' | 'step' | 'location' | 'date' | 'time'\n 'aria-disabled'?: boolean | 'true' | 'false'\n 'aria-expanded'?: boolean | 'true' | 'false'\n 'aria-haspopup'?: boolean | 'true' | 'false' | 'menu' | 'listbox' | 'tree' | 'grid' | 'dialog'\n 'aria-pressed'?: boolean | 'true' | 'false' | 'mixed'\n 'aria-selected'?: boolean | 'true' | 'false'\n 'aria-checked'?: boolean | 'true' | 'false' | 'mixed'\n 'aria-controls'?: string\n 'aria-owns'?: string\n 'aria-activedescendant'?: string\n 'aria-valuemin'?: number\n 'aria-valuemax'?: number\n 'aria-valuenow'?: number\n 'aria-valuetext'?: string\n 'aria-orientation'?: 'horizontal' | 'vertical'\n 'aria-readonly'?: boolean | 'true' | 'false'\n 'aria-required'?: boolean | 'true' | 'false'\n 'aria-invalid'?: boolean | 'true' | 'false' | 'grammar' | 'spelling'\n 'aria-errormessage'?: string\n 'aria-modal'?: boolean | 'true' | 'false'\n 'aria-placeholder'?: string\n 'aria-sort'?: 'none' | 'ascending' | 'descending' | 'other'\n 'aria-colcount'?: number\n 'aria-colindex'?: number\n 'aria-colspan'?: number\n 'aria-rowcount'?: number\n 'aria-rowindex'?: number\n 'aria-rowspan'?: number\n 'aria-setsize'?: number\n 'aria-posinset'?: number\n 'aria-level'?: number\n 'aria-multiselectable'?: boolean | 'true' | 'false'\n 'aria-autocomplete'?: 'none' | 'inline' | 'list' | 'both'\n 'aria-details'?: string\n 'aria-keyshortcuts'?: string\n 'aria-roledescription'?: string\n\n // Data attributes via index signature\n [key: `data-${string}`]: string | number | boolean | undefined\n}\n\n// ============================================================================\n// Specialized Attribute Interfaces\n// ============================================================================\n\ninterface AnchorHTMLAttributes<T> extends HTMLAttributes<T> {\n href?: string\n target?: '_self' | '_blank' | '_parent' | '_top' | string\n rel?: string\n download?: boolean | string\n hreflang?: string\n type?: string\n referrerPolicy?: ReferrerPolicy\n ping?: string\n}\n\ninterface ButtonHTMLAttributes<T> extends HTMLAttributes<T> {\n type?: 'button' | 'submit' | 'reset'\n disabled?: boolean\n name?: string\n value?: string\n form?: string\n formAction?: string\n formEncType?: string\n formMethod?: string\n formNoValidate?: boolean\n formTarget?: string\n popovertarget?: string\n popovertargetaction?: 'show' | 'hide' | 'toggle'\n}\n\ninterface InputHTMLAttributes<T> extends HTMLAttributes<T> {\n type?: string\n value?: string | number | readonly string[]\n defaultValue?: string | number | readonly string[]\n checked?: boolean\n defaultChecked?: boolean\n disabled?: boolean\n placeholder?: string\n name?: string\n form?: string\n required?: boolean\n readonly?: boolean\n multiple?: boolean\n min?: number | string\n max?: number | string\n minLength?: number\n maxLength?: number\n step?: number | string\n pattern?: string\n size?: number\n accept?: string\n capture?: boolean | 'user' | 'environment'\n list?: string\n autoComplete?: string\n autoCapitalize?: string\n inputMode?: 'none' | 'text' | 'decimal' | 'numeric' | 'tel' | 'search' | 'email' | 'url'\n enterKeyHint?: 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | 'send'\n height?: number | string\n width?: number | string\n alt?: string\n src?: string\n formAction?: string\n formEncType?: string\n formMethod?: string\n formNoValidate?: boolean\n formTarget?: string\n}\n\ninterface FormHTMLAttributes<T> extends HTMLAttributes<T> {\n action?: string\n method?: 'get' | 'post' | 'dialog'\n encType?: string\n target?: string\n name?: string\n noValidate?: boolean\n autoComplete?: 'on' | 'off'\n acceptCharset?: string\n}\n\ninterface ImgHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n alt?: string\n width?: number | string\n height?: number | string\n srcSet?: string\n sizes?: string\n loading?: 'eager' | 'lazy'\n decoding?: 'async' | 'auto' | 'sync'\n crossOrigin?: 'anonymous' | 'use-credentials'\n referrerPolicy?: ReferrerPolicy\n useMap?: string\n isMap?: boolean\n fetchPriority?: 'auto' | 'high' | 'low'\n}\n\ninterface TextareaHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: string | number\n defaultValue?: string\n disabled?: boolean\n placeholder?: string\n name?: string\n form?: string\n required?: boolean\n readonly?: boolean\n rows?: number\n cols?: number\n minLength?: number\n maxLength?: number\n wrap?: 'hard' | 'soft' | 'off'\n autoComplete?: string\n}\n\ninterface SelectHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: string | number | readonly string[]\n defaultValue?: string | number | readonly string[]\n disabled?: boolean\n name?: string\n form?: string\n required?: boolean\n multiple?: boolean\n size?: number\n autoComplete?: string\n}\n\ninterface OptionHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: string | number\n disabled?: boolean\n selected?: boolean\n label?: string\n}\n\ninterface OptgroupHTMLAttributes<T> extends HTMLAttributes<T> {\n disabled?: boolean\n label?: string\n}\n\ninterface LabelHTMLAttributes<T> extends HTMLAttributes<T> {\n for?: string\n htmlFor?: string\n form?: string\n}\n\ninterface FieldsetHTMLAttributes<T> extends HTMLAttributes<T> {\n disabled?: boolean\n name?: string\n form?: string\n}\n\ninterface OutputHTMLAttributes<T> extends HTMLAttributes<T> {\n for?: string\n htmlFor?: string\n form?: string\n name?: string\n}\n\ninterface ProgressHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: number | string\n max?: number | string\n}\n\ninterface MeterHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: number | string\n min?: number | string\n max?: number | string\n low?: number | string\n high?: number | string\n optimum?: number | string\n}\n\n// Table elements\ninterface TableHTMLAttributes<T> extends HTMLAttributes<T> {\n cellPadding?: number | string\n cellSpacing?: number | string\n border?: number | string\n}\n\ninterface ThHTMLAttributes<T> extends HTMLAttributes<T> {\n colSpan?: number\n rowSpan?: number\n scope?: 'row' | 'col' | 'rowgroup' | 'colgroup'\n abbr?: string\n headers?: string\n}\n\ninterface TdHTMLAttributes<T> extends HTMLAttributes<T> {\n colSpan?: number\n rowSpan?: number\n headers?: string\n}\n\ninterface ColHTMLAttributes<T> extends HTMLAttributes<T> {\n span?: number\n}\n\ninterface ColgroupHTMLAttributes<T> extends HTMLAttributes<T> {\n span?: number\n}\n\n// List elements\ninterface OlHTMLAttributes<T> extends HTMLAttributes<T> {\n start?: number\n reversed?: boolean\n type?: '1' | 'a' | 'A' | 'i' | 'I'\n}\n\ninterface LiHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: number\n}\n\n// Media elements\ninterface AudioVideoHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n controls?: boolean\n autoPlay?: boolean\n loop?: boolean\n muted?: boolean\n preload?: 'none' | 'metadata' | 'auto'\n crossOrigin?: 'anonymous' | 'use-credentials'\n poster?: string // video only\n width?: number | string // video only\n height?: number | string // video only\n playsInline?: boolean\n disableRemotePlayback?: boolean\n onPlay?: (e: Event) => void\n onPause?: (e: Event) => void\n onEnded?: (e: Event) => void\n onTimeUpdate?: (e: Event) => void\n onVolumeChange?: (e: Event) => void\n onSeeking?: (e: Event) => void\n onSeeked?: (e: Event) => void\n onLoadedData?: (e: Event) => void\n onLoadedMetadata?: (e: Event) => void\n onCanPlay?: (e: Event) => void\n onCanPlayThrough?: (e: Event) => void\n onWaiting?: (e: Event) => void\n onPlaying?: (e: Event) => void\n onProgress?: (e: Event) => void\n onDurationChange?: (e: Event) => void\n onRateChange?: (e: Event) => void\n onStalled?: (e: Event) => void\n onSuspend?: (e: Event) => void\n onEmptied?: (e: Event) => void\n}\n\ninterface SourceHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n srcSet?: string\n sizes?: string\n type?: string\n media?: string\n width?: number | string\n height?: number | string\n}\n\ninterface TrackHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n srcLang?: string\n label?: string\n kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata'\n default?: boolean\n}\n\n// Embedded content\ninterface IframeHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n srcDoc?: string\n name?: string\n width?: number | string\n height?: number | string\n allow?: string\n allowFullScreen?: boolean\n sandbox?: string\n loading?: 'eager' | 'lazy'\n referrerPolicy?: ReferrerPolicy\n}\n\ninterface EmbedHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n type?: string\n width?: number | string\n height?: number | string\n}\n\ninterface ObjectHTMLAttributes<T> extends HTMLAttributes<T> {\n data?: string\n type?: string\n name?: string\n width?: number | string\n height?: number | string\n form?: string\n useMap?: string\n}\n\ninterface ParamHTMLAttributes<T> extends HTMLAttributes<T> {\n name?: string\n value?: string\n}\n\ninterface CanvasHTMLAttributes<T> extends HTMLAttributes<T> {\n width?: number | string\n height?: number | string\n}\n\ninterface MapHTMLAttributes<T> extends HTMLAttributes<T> {\n name?: string\n}\n\ninterface AreaHTMLAttributes<T> extends HTMLAttributes<T> {\n alt?: string\n coords?: string\n href?: string\n hreflang?: string\n download?: boolean | string\n rel?: string\n shape?: 'rect' | 'circle' | 'poly' | 'default'\n target?: string\n referrerPolicy?: ReferrerPolicy\n ping?: string\n}\n\n// Interactive elements\ninterface DetailsHTMLAttributes<T> extends HTMLAttributes<T> {\n open?: boolean\n onToggle?: (e: Event) => void\n}\n\ninterface DialogHTMLAttributes<T> extends HTMLAttributes<T> {\n open?: boolean\n onClose?: (e: Event) => void\n onCancel?: (e: Event) => void\n}\n\n// Other elements\ninterface BlockquoteHTMLAttributes<T> extends HTMLAttributes<T> {\n cite?: string\n}\n\ninterface QuoteHTMLAttributes<T> extends HTMLAttributes<T> {\n cite?: string\n}\n\ninterface TimeHTMLAttributes<T> extends HTMLAttributes<T> {\n dateTime?: string\n}\n\ninterface DataHTMLAttributes<T> extends HTMLAttributes<T> {\n value?: string\n}\n\ninterface MetaHTMLAttributes<T> extends HTMLAttributes<T> {\n name?: string\n content?: string\n httpEquiv?: string\n charSet?: string\n property?: string\n}\n\ninterface LinkHTMLAttributes<T> extends HTMLAttributes<T> {\n href?: string\n rel?: string\n type?: string\n media?: string\n as?: string\n crossOrigin?: 'anonymous' | 'use-credentials'\n referrerPolicy?: ReferrerPolicy\n sizes?: string\n hreflang?: string\n integrity?: string\n fetchPriority?: 'auto' | 'high' | 'low'\n disabled?: boolean\n}\n\ninterface StyleHTMLAttributes<T> extends HTMLAttributes<T> {\n media?: string\n nonce?: string\n blocking?: string\n}\n\ninterface ScriptHTMLAttributes<T> extends HTMLAttributes<T> {\n src?: string\n type?: string\n async?: boolean\n defer?: boolean\n crossOrigin?: 'anonymous' | 'use-credentials'\n integrity?: string\n noModule?: boolean\n nonce?: string\n referrerPolicy?: ReferrerPolicy\n fetchPriority?: 'auto' | 'high' | 'low'\n blocking?: string\n}\n\ninterface SlotHTMLAttributes<T> extends HTMLAttributes<T> {\n name?: string\n onSlotchange?: (e: Event) => void\n}\n\n// SVG Attributes (basic support)\ninterface SVGAttributes<T> extends HTMLAttributes<T> {\n // Core SVG attributes\n viewBox?: string\n xmlns?: string\n xmlnsXlink?: string\n fill?: string\n stroke?: string\n strokeWidth?: string | number\n strokeLinecap?: 'butt' | 'round' | 'square'\n strokeLinejoin?: 'miter' | 'round' | 'bevel'\n strokeDasharray?: string\n strokeDashoffset?: string | number\n strokeOpacity?: string | number\n fillOpacity?: string | number\n opacity?: string | number\n transform?: string\n transformOrigin?: string\n clipPath?: string\n mask?: string\n filter?: string\n\n // Shape attributes\n d?: string\n cx?: string | number\n cy?: string | number\n r?: string | number\n rx?: string | number\n ry?: string | number\n x?: string | number\n y?: string | number\n x1?: string | number\n y1?: string | number\n x2?: string | number\n y2?: string | number\n width?: string | number\n height?: string | number\n points?: string\n pathLength?: string | number\n\n // Text attributes\n textAnchor?: 'start' | 'middle' | 'end'\n dominantBaseline?: string\n dx?: string | number\n dy?: string | number\n fontSize?: string | number\n fontFamily?: string\n fontWeight?: string | number\n\n // Use element\n href?: string\n xlinkHref?: string\n\n // Gradient/pattern\n gradientUnits?: 'userSpaceOnUse' | 'objectBoundingBox'\n gradientTransform?: string\n spreadMethod?: 'pad' | 'reflect' | 'repeat'\n offset?: string | number\n stopColor?: string\n stopOpacity?: string | number\n\n // Clip/mask\n clipPathUnits?: 'userSpaceOnUse' | 'objectBoundingBox'\n maskUnits?: 'userSpaceOnUse' | 'objectBoundingBox'\n maskContentUnits?: 'userSpaceOnUse' | 'objectBoundingBox'\n\n // Other\n preserveAspectRatio?: string\n markerStart?: string\n markerMid?: string\n markerEnd?: string\n vectorEffect?: string\n}\n","/**\n * Low-level DOM node helpers shared across runtime modules.\n * Keep this file dependency-free to avoid module cycles.\n */\n\n/**\n * Convert a value to a flat array of DOM nodes.\n * Defensively handles proxies and non-DOM values.\n */\nexport function toNodeArray(node: Node | Node[] | unknown): Node[] {\n try {\n if (Array.isArray(node)) {\n // Preserve original array reference when it's already a flat Node array\n let allNodes = true\n for (const item of node) {\n let isItemNode = false\n try {\n isItemNode = item instanceof Node\n } catch {\n isItemNode = false\n }\n if (!isItemNode) {\n allNodes = false\n break\n }\n }\n if (allNodes) {\n return node as Node[]\n }\n const result: Node[] = []\n for (const item of node) {\n result.push(...toNodeArray(item))\n }\n return result\n }\n if (node === null || node === undefined || node === false) {\n return []\n }\n } catch {\n return []\n }\n\n let isNode = false\n try {\n isNode = node instanceof Node\n } catch {\n // If safe check fails, treat as primitive string\n isNode = false\n }\n\n if (isNode) {\n try {\n if (node instanceof DocumentFragment) {\n return Array.from(node.childNodes)\n }\n } catch {\n // Ignore fragment check error\n }\n return [node as Node]\n }\n\n try {\n // Duck-type BindingHandle-like values\n if (typeof node === 'object' && node !== null && 'marker' in node) {\n return toNodeArray((node as { marker: unknown }).marker)\n }\n } catch {\n // Ignore property check error\n }\n\n // Primitive fallback\n try {\n return [document.createTextNode(String(node))]\n } catch {\n return [document.createTextNode('')]\n }\n}\n\n/**\n * Insert nodes before an anchor node, preserving order.\n * Uses DocumentFragment for batch insertion when inserting multiple nodes.\n */\nexport function insertNodesBefore(\n parent: ParentNode & Node,\n nodes: Node[],\n anchor: Node | null,\n): void {\n if (nodes.length === 0) return\n\n // Single node optimization - direct insertion\n if (nodes.length === 1) {\n const node = nodes[0]!\n if (node === undefined || node === null) return\n if (node.ownerDocument !== parent.ownerDocument && parent.ownerDocument) {\n parent.ownerDocument.adoptNode(node)\n }\n try {\n parent.insertBefore(node, anchor)\n } catch (e: unknown) {\n if (parent.ownerDocument) {\n try {\n const clone = parent.ownerDocument.importNode(node, true)\n parent.insertBefore(clone, anchor)\n return\n } catch {\n // Clone fallback failed\n }\n }\n throw e\n }\n return\n }\n\n // Batch insertion using DocumentFragment for multiple nodes\n const doc = parent.ownerDocument\n if (doc) {\n const frag = doc.createDocumentFragment()\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n if (node === undefined || node === null) continue\n // Handle DocumentFragment - append children\n if (node.nodeType === 11) {\n const childrenArr = Array.from(node.childNodes)\n for (let j = 0; j < childrenArr.length; j++) {\n frag.appendChild(childrenArr[j]!)\n }\n } else {\n if (node.ownerDocument !== doc) {\n doc.adoptNode(node)\n }\n frag.appendChild(node)\n }\n }\n parent.insertBefore(frag, anchor)\n return\n }\n\n // Fallback for non-document contexts (rare)\n const insertSingle = (nodeToInsert: Node, anchorNode: Node | null): Node => {\n if (nodeToInsert.ownerDocument !== parent.ownerDocument && parent.ownerDocument) {\n parent.ownerDocument.adoptNode(nodeToInsert)\n }\n try {\n parent.insertBefore(nodeToInsert, anchorNode)\n return nodeToInsert\n } catch (e: unknown) {\n if (parent.ownerDocument) {\n try {\n const clone = parent.ownerDocument.importNode(nodeToInsert, true)\n parent.insertBefore(clone, anchorNode)\n return clone\n } catch {\n // Clone fallback failed\n }\n }\n throw e\n }\n }\n\n for (let i = nodes.length - 1; i >= 0; i--) {\n const node = nodes[i]!\n if (node === undefined || node === null) continue\n\n // Handle DocumentFragment - insert children in reverse order\n const isFrag = node.nodeType === 11\n if (isFrag) {\n const childrenArr = Array.from(node.childNodes)\n for (let j = childrenArr.length - 1; j >= 0; j--) {\n const child = childrenArr[j]!\n anchor = insertSingle(child, anchor)\n }\n } else {\n anchor = insertSingle(node, anchor)\n }\n }\n}\n\n/**\n * Remove an array of nodes from the DOM.\n */\nexport function removeNodes(nodes: Node[]): void {\n for (const node of nodes) {\n node.parentNode?.removeChild(node)\n }\n}\n","import { createEffect } from './effect'\nimport { setTransitionContext, signal, scheduleFlush, untrack } from './signal'\n\n// ============================================================================\n// startTransition - Mark updates as low priority\n// ============================================================================\n\n/**\n * Execute a function with low-priority scheduling.\n * Updates triggered inside the callback will be processed after any high-priority updates.\n * This keeps the UI responsive during expensive operations.\n *\n * @param fn - The function to execute in transition context\n *\n * @example\n * ```tsx\n * const handleInput = (e) => {\n * query = e.target.value // High priority: immediate\n * startTransition(() => {\n * // Low priority: processed after high priority updates\n * filteredItems = allItems.filter(x => x.includes(query))\n * })\n * }\n * ```\n */\nexport function startTransition(fn: () => void): void {\n const prev = setTransitionContext(true)\n try {\n fn()\n } finally {\n setTransitionContext(prev)\n scheduleFlush()\n }\n}\n\n// ============================================================================\n// useTransition - Hook for managing transition state\n// ============================================================================\n\n/**\n * React-style useTransition hook.\n * Returns a pending signal and a startTransition function.\n *\n * @returns A tuple of [isPending accessor, startTransition function]\n *\n * @example\n * ```tsx\n * function SearchComponent() {\n * let query = $state('')\n * const [isPending, start] = useTransition()\n *\n * const handleChange = (e) => {\n * query = e.target.value\n * start(() => {\n * // Expensive filtering happens in low priority\n * filteredResults = expensiveFilter(allData, query)\n * })\n * }\n *\n * return (\n * <>\n * <input value={query} onInput={handleChange} />\n * {isPending() && <Spinner />}\n * <Results items={filteredResults} />\n * </>\n * )\n * }\n * ```\n */\nexport function useTransition(): [() => boolean, (fn: () => void) => void] {\n const pending = signal(false)\n\n const start = (fn: () => void) => {\n // Both pending(true) and pending(false) are now low-priority updates,\n // preventing the race condition where isPending() could be inconsistent\n // with the actual transition execution state.\n startTransition(() => {\n pending(true)\n try {\n fn()\n } finally {\n pending(false)\n }\n })\n }\n\n return [() => pending(), start]\n}\n\n// ============================================================================\n// useDeferredValue - Defer value updates to low priority\n// ============================================================================\n\n/**\n * Creates a deferred version of a value that updates with low priority.\n * The returned accessor will lag behind the source value during rapid updates,\n * allowing high-priority work to complete first.\n *\n * @param getValue - Accessor function that returns the source value\n * @returns Accessor function that returns the deferred value\n *\n * @example\n * ```tsx\n * function SearchResults({ query }) {\n * const deferredQuery = useDeferredValue(() => query)\n *\n * // deferredQuery lags behind query during rapid typing\n * const results = expensiveSearch(deferredQuery())\n *\n * return <ResultList items={results} />\n * }\n * ```\n */\nexport function useDeferredValue<T>(getValue: () => T): () => T {\n const deferredValue = signal(getValue())\n\n // Track source value changes and update deferred value in transition\n createEffect(() => {\n const newValue = getValue()\n // Use untrack to read current deferred value without creating a dependency\n // This prevents the effect from re-running when deferredValue changes\n const currentDeferred = untrack(() => deferredValue())\n if (currentDeferred !== newValue) {\n startTransition(() => {\n deferredValue(newValue)\n })\n }\n })\n\n return () => deferredValue()\n}\n","import { batch as baseBatch, untrack as baseUntrack } from './signal'\n\nexport function batch<T>(fn: () => T): T {\n return baseBatch(fn)\n}\n\nexport function untrack<T>(fn: () => T): T {\n return baseUntrack(fn)\n}\n\n// Transition APIs for priority scheduling\nexport { startTransition, useTransition, useDeferredValue } from './transition'\n","/**\n * Fict Reactive DOM Binding System\n *\n * This module provides the core mechanisms for reactive DOM updates.\n * It bridges the gap between Fict's reactive system (signals, effects)\n * and the DOM, enabling fine-grained updates without a virtual DOM.\n *\n * Design Philosophy:\n * - Values wrapped in functions `() => T` are treated as reactive\n * - Static values are applied once without tracking\n * - The compiler transforms JSX expressions to use these primitives\n */\n\nimport {\n $$EVENTS,\n DelegatedEvents,\n UnitlessStyles,\n Properties,\n ChildProperties,\n getPropAlias,\n SVGNamespace,\n} from './constants'\nimport { createRenderEffect } from './effect'\nimport { Fragment } from './jsx'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n getCurrentRoot,\n handleError,\n handleSuspend,\n pushRoot,\n popRoot,\n registerRootCleanup,\n type RootContext,\n} from './lifecycle'\nimport { toNodeArray, removeNodes, insertNodesBefore } from './node-ops'\nimport { batch } from './scheduler'\nimport { computed, untrack, isSignal, isComputed, isEffect, isEffectScope } from './signal'\nimport type { Cleanup, FictNode } from './types'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\n/** A reactive value that can be either static or a getter function */\nexport type MaybeReactive<T> = T | (() => T)\n\n/** Internal type for createElement function reference */\nexport type CreateElementFn = (node: FictNode) => Node\n\n/** Handle returned by conditional/list bindings for cleanup */\nexport interface BindingHandle {\n /** Marker node(s) used for positioning */\n marker: Comment | DocumentFragment\n /** Flush pending content - call after markers are inserted into DOM */\n flush?: () => void\n /** Dispose function to clean up the binding */\n dispose: Cleanup\n}\n\n/** Managed child node with its dispose function */\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a value is reactive (a getter function that returns a value).\n *\n * A value is considered reactive if:\n * 1. It's a signal or computed value created by the runtime (marked with Symbol)\n * 2. It's a zero-argument function (getter pattern used by the compiler)\n *\n * NOT considered reactive:\n * - Event handlers (functions that take arguments)\n * - Effect disposers (zero-arg but for cleanup, not value access)\n * - Effect scopes (zero-arg but for scope management)\n *\n * @param value - The value to check\n * @returns true if the value is a reactive getter\n *\n * @example\n * ```ts\n * const [count, setCount] = createSignal(0)\n * isReactive(count) // true - signal accessor\n * isReactive(() => 42) // true - getter pattern\n * isReactive((x) => x) // false - takes argument\n * isReactive('hello') // false - not a function\n * isReactive(effectDisposer) // false - effect cleanup function\n * ```\n */\nexport function isReactive(value: unknown): value is () => unknown {\n if (typeof value !== 'function') return false\n\n // Check for runtime-created signals/computed (most reliable)\n if (isSignal(value) || isComputed(value)) return true\n\n // Exclude effect disposers and effect scopes - they are zero-arg\n // functions but not reactive getters\n if (isEffect(value) || isEffectScope(value)) return false\n\n // Fall back to length check for compiler-generated getters\n // Zero-argument functions are treated as reactive getters\n return value.length === 0\n}\n\n/**\n * Unwrap a potentially reactive value to get the actual value\n */\nexport function unwrap<T>(value: MaybeReactive<T>): T {\n return isReactive(value) ? (value as () => T)() : value\n}\n\n/**\n * Invoke an event handler or handler accessor in a safe way.\n * Supports handlers that return another handler and handlers that expect an\n * optional data payload followed by the event.\n */\nexport function callEventHandler(\n handler: EventListenerOrEventListenerObject | null | undefined,\n event: Event,\n node?: EventTarget | null,\n data?: unknown,\n): void {\n if (!handler) return\n\n const context = (node ?? event.currentTarget ?? undefined) as EventTarget | undefined\n const invoke = (fn: EventListenerOrEventListenerObject | null | undefined): void => {\n if (typeof fn === 'function') {\n const result =\n data === undefined\n ? (fn as EventListener).call(context, event)\n : (fn as (data: unknown, e: Event) => unknown).call(context, data, event)\n\n if (typeof result === 'function' && result !== fn) {\n if (data === undefined) {\n ;(result as EventListener).call(context, event)\n } else {\n ;(result as (data: unknown, e: Event) => unknown).call(context, data, event)\n }\n } else if (result && typeof (result as EventListenerObject).handleEvent === 'function') {\n ;(result as EventListenerObject).handleEvent.call(result as EventListenerObject, event)\n }\n } else if (fn && typeof fn.handleEvent === 'function') {\n fn.handleEvent.call(fn, event)\n }\n }\n\n invoke(handler)\n}\n\n// ============================================================================\n// Text Binding\n// ============================================================================\n\n/**\n * Create a text node that reactively updates when the value changes.\n *\n * @example\n * ```ts\n * // Static text\n * createTextBinding(\"Hello\")\n *\n * // Reactive text (compiler output)\n * createTextBinding(() => $count())\n * ```\n */\nexport function createTextBinding(value: MaybeReactive<unknown>): Text {\n const text = document.createTextNode('')\n\n if (isReactive(value)) {\n // Reactive: create effect to update text when value changes\n createRenderEffect(() => {\n const v = (value as () => unknown)()\n const fmt = formatTextValue(v)\n if (text.data !== fmt) {\n text.data = fmt\n }\n })\n } else {\n // Static: set once\n text.data = formatTextValue(value)\n }\n\n return text\n}\n\n/**\n * Bind a reactive value to an existing text node.\n * This is a convenience function for binding to existing DOM nodes.\n */\nexport function bindText(textNode: Text, getValue: () => unknown): Cleanup {\n return createRenderEffect(() => {\n const value = formatTextValue(getValue())\n if (textNode.data !== value) {\n textNode.data = value\n }\n })\n}\n\n/**\n * Format a value for text content\n */\nfunction formatTextValue(value: unknown): string {\n if (value == null || value === false) {\n return ''\n }\n return String(value)\n}\n\n// ============================================================================\n// Attribute Binding\n// ============================================================================\n\n/** Attribute setter function type */\nexport type AttributeSetter = (el: Element, key: string, value: unknown) => void\n\n/**\n * Create a reactive attribute binding on an element.\n *\n * @example\n * ```ts\n * // Static attribute\n * createAttributeBinding(button, 'disabled', false, setAttribute)\n *\n * // Reactive attribute (compiler output)\n * createAttributeBinding(button, 'disabled', () => !$isValid(), setAttribute)\n * ```\n */\nexport function createAttributeBinding(\n el: Element,\n key: string,\n value: MaybeReactive<unknown>,\n setter: AttributeSetter,\n): void {\n if (isReactive(value)) {\n // Reactive: create effect to update attribute when value changes\n createRenderEffect(() => {\n setter(el, key, (value as () => unknown)())\n })\n } else {\n // Static: set once\n setter(el, key, value)\n }\n}\n\n/**\n * Bind a reactive value to an element's attribute.\n */\nexport function bindAttribute(el: Element, key: string, getValue: () => unknown): Cleanup {\n let prevValue: unknown = undefined\n return createRenderEffect(() => {\n const value = getValue()\n if (value === prevValue) return\n prevValue = value\n\n if (value === undefined || value === null || value === false) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n el.setAttribute(key, String(value))\n }\n })\n}\n\n/**\n * Bind a reactive value to an element's property.\n */\nexport function bindProperty(el: Element, key: string, getValue: () => unknown): Cleanup {\n // Keep behavior aligned with the legacy createElement+applyProps path in `dom.ts`,\n // where certain keys must behave like DOM properties and nullish clears should\n // reset to sensible defaults (e.g. value -> '', checked -> false).\n const PROPERTY_BINDING_KEYS = new Set([\n 'value',\n 'checked',\n 'selected',\n 'disabled',\n 'readOnly',\n 'multiple',\n 'muted',\n ])\n\n let prevValue: unknown = undefined\n return createRenderEffect(() => {\n const next = getValue()\n if (next === prevValue) return\n prevValue = next\n\n if (PROPERTY_BINDING_KEYS.has(key) && (next === undefined || next === null)) {\n const fallback = key === 'checked' || key === 'selected' ? false : ''\n ;(el as unknown as Record<string, unknown>)[key] = fallback\n return\n }\n ;(el as unknown as Record<string, unknown>)[key] = next\n })\n}\n\n// ============================================================================\n// Style Binding\n// ============================================================================\n\n/**\n * Apply styles to an element, supporting reactive style objects/strings.\n */\nexport function createStyleBinding(\n el: Element,\n value: MaybeReactive<string | Record<string, string | number> | null | undefined>,\n): void {\n const target = el as Element & { style: CSSStyleDeclaration }\n if (isReactive(value)) {\n let prev: unknown\n createRenderEffect(() => {\n const next = (value as () => unknown)()\n applyStyle(target, next, prev)\n prev = next\n })\n } else {\n applyStyle(target, value, undefined)\n }\n}\n\n/**\n * Bind a reactive style value to an existing element.\n */\nexport function bindStyle(\n el: Element,\n getValue: () => string | Record<string, string | number> | null | undefined,\n): Cleanup {\n const target = el as Element & { style: CSSStyleDeclaration }\n let prev: unknown\n return createRenderEffect(() => {\n const next = getValue()\n applyStyle(target, next, prev)\n prev = next\n })\n}\n\n/**\n * Apply a style value to an element\n */\nfunction applyStyle(\n el: Element & { style: CSSStyleDeclaration },\n value: unknown,\n prev: unknown,\n): void {\n if (typeof value === 'string') {\n el.style.cssText = value\n } else if (value && typeof value === 'object') {\n const styles = value as Record<string, string | number>\n\n // If we previously set styles via string, clear before applying object map\n if (typeof prev === 'string') {\n el.style.cssText = ''\n }\n\n // Remove styles that were present in prev but not in current\n if (prev && typeof prev === 'object') {\n const prevStyles = prev as Record<string, string | number>\n for (const key of Object.keys(prevStyles)) {\n if (!(key in styles)) {\n const cssProperty = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n el.style.removeProperty(cssProperty)\n }\n }\n }\n\n for (const [prop, v] of Object.entries(styles)) {\n if (v != null) {\n // Handle camelCase to kebab-case conversion\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\n const unitless = isUnitlessStyleProperty(prop) || isUnitlessStyleProperty(cssProperty)\n const valueStr = typeof v === 'number' && !unitless ? `${v}px` : String(v)\n el.style.setProperty(cssProperty, valueStr)\n } else {\n const cssProperty = prop.replace(/([A-Z])/g, '-$1').toLowerCase()\n el.style.removeProperty(cssProperty) // Handle null/undefined values by removing\n }\n }\n } else {\n // If value is null/undefined, we might want to clear styles set by PREVIOUS binding?\n // But blindly clearing cssText is dangerous.\n // Ideally we remove keys from prev.\n if (prev && typeof prev === 'object') {\n const prevStyles = prev as Record<string, string | number>\n for (const key of Object.keys(prevStyles)) {\n const cssProperty = key.replace(/([A-Z])/g, '-$1').toLowerCase()\n el.style.removeProperty(cssProperty)\n }\n } else if (typeof prev === 'string') {\n el.style.cssText = ''\n }\n }\n}\n\nconst isUnitlessStyleProperty = isDev\n ? (prop: string): boolean => UnitlessStyles.has(prop)\n : (prop: string): boolean => prop === 'opacity' || prop === 'zIndex'\n\n// ============================================================================\n// Class Binding\n// ============================================================================\n\n/**\n * Apply class to an element, supporting reactive class values.\n */\nexport function createClassBinding(\n el: Element,\n value: MaybeReactive<string | Record<string, boolean> | null | undefined>,\n): void {\n if (isReactive(value)) {\n let prev: Record<string, boolean> = {}\n createRenderEffect(() => {\n const next = (value as () => unknown)()\n prev = applyClass(el, next, prev)\n })\n } else {\n applyClass(el, value, {})\n }\n}\n\n/**\n * Bind a reactive class value to an existing element.\n */\nexport function bindClass(\n el: Element,\n getValue: () => string | Record<string, boolean> | null | undefined,\n): Cleanup {\n let prev: Record<string, boolean> = {}\n let prevString: string | undefined\n return createRenderEffect(() => {\n const next = getValue()\n // P2-1: Short-circuit for string values to avoid DOM writes when unchanged\n if (typeof next === 'string') {\n if (next === prevString) return\n prevString = next\n el.className = next\n prev = {}\n return\n }\n prevString = undefined\n prev = applyClass(el, next, prev)\n })\n}\n\n/**\n * Toggle a class key (supports space-separated class names)\n */\nfunction toggleClassKey(node: Element, key: string, value: boolean): void {\n const classNames = key.trim().split(/\\s+/)\n for (let i = 0, len = classNames.length; i < len; i++) {\n node.classList.toggle(classNames[i]!, value)\n }\n}\n\n/**\n * Apply a class value to an element using classList.toggle for efficient updates.\n * Returns the new prev state for tracking.\n */\nfunction applyClass(el: Element, value: unknown, prev: unknown): Record<string, boolean> {\n const prevState = (prev && typeof prev === 'object' ? prev : {}) as Record<string, boolean>\n\n // Handle string value - full replacement\n if (typeof value === 'string') {\n el.className = value\n // Clear prev state since we're doing full replacement\n return {}\n }\n\n // Handle object value - incremental updates\n if (value && typeof value === 'object') {\n const classes = value as Record<string, boolean>\n const classKeys = Object.keys(classes)\n const prevKeys = Object.keys(prevState)\n\n // Remove classes that were true but are now false or missing\n for (let i = 0, len = prevKeys.length; i < len; i++) {\n const key = prevKeys[i]!\n if (!key || key === 'undefined' || classes[key]) continue\n toggleClassKey(el, key, false)\n delete prevState[key]\n }\n\n // Add classes that are now true\n for (let i = 0, len = classKeys.length; i < len; i++) {\n const key = classKeys[i]!\n const classValue = !!classes[key]\n if (!key || key === 'undefined' || prevState[key] === classValue || !classValue) continue\n toggleClassKey(el, key, true)\n prevState[key] = classValue\n }\n\n return prevState\n }\n\n // Handle null/undefined - clear all tracked classes\n if (!value) {\n for (const key of Object.keys(prevState)) {\n if (key && key !== 'undefined') {\n toggleClassKey(el, key, false)\n }\n }\n return {}\n }\n\n return prevState\n}\n\n/**\n * Exported classList function for direct use (compatible with dom-expressions)\n */\nexport function classList(\n node: Element,\n value: Record<string, boolean> | null | undefined,\n prev: Record<string, boolean> = {},\n): Record<string, boolean> {\n return applyClass(node, value, prev)\n}\n\n// ============================================================================\n// Child/Insert Binding (Dynamic Children)\n// ============================================================================\n\n/**\n * Insert reactive content into a parent element.\n * This is a simpler API than createChildBinding for basic cases.\n *\n * @param parent - The parent element to insert into\n * @param getValue - Function that returns the value to render\n * @param markerOrCreateElement - Optional marker node to insert before, or createElementFn\n * @param createElementFn - Optional function to create DOM elements (when marker is provided)\n */\nexport function insert(\n parent: ParentNode & Node,\n getValue: () => FictNode,\n markerOrCreateElement?: Node | CreateElementFn,\n createElementFn?: CreateElementFn,\n): Cleanup {\n const hostRoot = getCurrentRoot()\n let marker: Node\n let ownsMarker = false\n let createFn: CreateElementFn | undefined = createElementFn\n\n if (markerOrCreateElement instanceof Node) {\n marker = markerOrCreateElement\n createFn = createElementFn\n } else {\n marker = document.createComment('fict:insert')\n parent.appendChild(marker)\n createFn = markerOrCreateElement as CreateElementFn | undefined\n ownsMarker = true\n }\n\n let currentNodes: Node[] = []\n let currentText: Text | null = null\n let currentRoot: RootContext | null = null\n\n const clearCurrentNodes = () => {\n if (currentNodes.length > 0) {\n removeNodes(currentNodes)\n currentNodes = []\n }\n }\n\n const setTextNode = (textValue: string, shouldInsert: boolean, parentNode: ParentNode & Node) => {\n if (!currentText) {\n currentText = document.createTextNode(textValue)\n } else if (currentText.data !== textValue) {\n currentText.data = textValue\n }\n\n if (!shouldInsert) {\n clearCurrentNodes()\n return\n }\n\n if (currentNodes.length === 1 && currentNodes[0] === currentText) {\n return\n }\n\n clearCurrentNodes()\n insertNodesBefore(parentNode, [currentText], marker)\n currentNodes = [currentText]\n }\n\n const dispose = createRenderEffect(() => {\n const value = getValue()\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n const isPrimitive =\n value == null ||\n value === false ||\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'\n\n if (isPrimitive) {\n if (currentRoot) {\n destroyRoot(currentRoot)\n currentRoot = null\n }\n if (!parentNode) {\n clearCurrentNodes()\n return\n }\n const textValue = value == null || value === false ? '' : String(value)\n const shouldInsert = value != null && value !== false\n setTextNode(textValue, shouldInsert, parentNode)\n return\n }\n\n if (currentRoot) {\n destroyRoot(currentRoot)\n currentRoot = null\n }\n clearCurrentNodes()\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n let handledError = false\n try {\n let newNode: Node | Node[]\n\n if (value instanceof Node) {\n newNode = value\n } else if (Array.isArray(value)) {\n if (value.every(v => v instanceof Node)) {\n newNode = value as Node[]\n } else {\n if (createFn) {\n const mapped: Node[] = []\n for (const item of value) {\n mapped.push(...toNodeArray(createFn(item as any)))\n }\n newNode = mapped\n } else {\n newNode = document.createTextNode(String(value))\n }\n }\n } else {\n newNode = createFn ? createFn(value) : document.createTextNode(String(value))\n }\n\n nodes = toNodeArray(newNode)\n if (root.suspended) {\n handledError = true\n destroyRoot(root)\n return\n }\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n } catch (err) {\n if (handleSuspend(err as any, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n if (handleError(err, { source: 'renderChild' }, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n throw err\n } finally {\n popRoot(prev)\n if (!handledError) {\n flushOnMount(root)\n }\n }\n\n // If we reach here, no error was handled (handledError blocks return early)\n currentRoot = root\n currentNodes = nodes\n })\n\n return () => {\n dispose()\n if (currentRoot) {\n destroyRoot(currentRoot)\n currentRoot = null\n }\n clearCurrentNodes()\n if (ownsMarker) {\n marker.parentNode?.removeChild(marker)\n }\n }\n}\n\n/**\n * Create a reactive child binding that updates when the child value changes.\n * This is used for dynamic expressions like `{show && <Modal />}` or `{items.map(...)}`.\n *\n * @example\n * ```ts\n * // Reactive child (compiler output for {count})\n * createChildBinding(parent, () => $count(), createElement)\n *\n * // Reactive conditional (compiler output for {show && <Modal />})\n * createChildBinding(parent, () => $show() && jsx(Modal, {}), createElement)\n * ```\n */\nexport function createChildBinding(\n parent: ParentNode & Node,\n getValue: () => FictNode,\n createElementFn: CreateElementFn,\n): BindingHandle {\n const marker = document.createComment('fict:child')\n parent.appendChild(marker)\n const hostRoot = getCurrentRoot()\n\n const dispose = createRenderEffect(() => {\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let nodes: Node[] = []\n let handledError = false\n try {\n const value = getValue()\n\n // Skip if value is null/undefined/false\n if (value == null || value === false) {\n return\n }\n\n const output = createElementFn(value)\n nodes = toNodeArray(output)\n const parentNode = marker.parentNode as (ParentNode & Node) | null\n if (parentNode) {\n insertNodesBefore(parentNode, nodes, marker)\n }\n return () => {\n destroyRoot(root)\n removeNodes(nodes)\n }\n } catch (err) {\n if (handleSuspend(err as any, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n if (handleError(err, { source: 'renderChild' }, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n throw err\n } finally {\n popRoot(prev)\n if (!handledError) {\n flushOnMount(root)\n }\n }\n })\n\n return {\n marker,\n dispose: () => {\n dispose()\n marker.parentNode?.removeChild(marker)\n },\n }\n}\n\n// ============================================================================\n// Event Delegation System\n// ============================================================================\n\n// Extend Element/Document type to support event delegation\ndeclare global {\n interface Element {\n _$host?: Element\n [key: `$$${string}`]: EventListener | [EventListener, unknown] | undefined\n [key: `$$${string}Data`]: unknown\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface Document extends Record<string, unknown> {}\n}\n\n/**\n * Initialize event delegation for a set of event names.\n * Events will be handled at the document level and dispatched to the appropriate handlers.\n *\n * @param eventNames - Array of event names to delegate\n * @param doc - The document to attach handlers to (default: window.document)\n *\n * @example\n * ```ts\n * // Called automatically by the compiler for delegated events\n * delegateEvents(['click', 'input', 'keydown'])\n * ```\n */\nexport function delegateEvents(eventNames: string[], doc: Document = window.document): void {\n const e = (doc[$$EVENTS] as Set<string>) || (doc[$$EVENTS] = new Set<string>())\n for (let i = 0, l = eventNames.length; i < l; i++) {\n const name = eventNames[i]!\n if (!e.has(name)) {\n e.add(name)\n doc.addEventListener(name, globalEventHandler)\n }\n }\n}\n\n/**\n * Clear all delegated event handlers from a document.\n *\n * @param doc - The document to clear handlers from (default: window.document)\n */\nexport function clearDelegatedEvents(doc: Document = window.document): void {\n const e = doc[$$EVENTS] as Set<string> | undefined\n if (e) {\n for (const name of e.keys()) {\n doc.removeEventListener(name, globalEventHandler)\n }\n delete doc[$$EVENTS]\n }\n}\n\n/**\n * Global event handler for delegated events.\n * Walks up the DOM tree to find and call handlers stored as $$eventName properties.\n */\nfunction globalEventHandler(e: Event): void {\n const asNode = (value: unknown): Node | null =>\n value && typeof (value as Node).nodeType === 'number' ? (value as Node) : null\n const asElement = (value: unknown): Element | null => {\n const n = asNode(value)\n if (!n) return null\n if (n.nodeType === 1) return n as Element\n return (n as ChildNode).parentElement\n }\n\n let node = asElement(e.target)\n const key = `$$${e.type}` as const\n const dataKey = `${key}Data` as `$$${string}Data`\n const oriTarget = e.target\n const oriCurrentTarget = e.currentTarget\n let lastHandled: Element | null = null\n\n // Retarget helper for shadow DOM and portals\n const retarget = (value: EventTarget) =>\n Object.defineProperty(e, 'target', {\n configurable: true,\n value,\n })\n\n // Handler for each node in the bubble path\n const handleNode = (): boolean => {\n if (!node) return false\n const handler = node[key]\n if (handler && !(node as HTMLButtonElement).disabled) {\n const resolveData = (value: unknown): unknown => {\n if (typeof value === 'function') {\n try {\n const fn = value as (event?: Event) => unknown\n return fn.length > 0 ? fn(e) : fn()\n } catch {\n return (value as () => unknown)()\n }\n }\n return value\n }\n\n const rawData = (node as any)[dataKey] as unknown\n const hasData = rawData !== undefined\n const resolvedNodeData = hasData ? resolveData(rawData) : undefined\n // P2-3: Wrap event handler calls in batch for synchronous flush & reduced microtasks\n batch(() => {\n if (typeof handler === 'function') {\n callEventHandler(handler, e, node, hasData ? resolvedNodeData : undefined)\n } else if (Array.isArray(handler)) {\n const tupleData = resolveData(handler[1])\n callEventHandler(handler[0], e, node, tupleData)\n }\n })\n if (e.cancelBubble) return false\n }\n // Handle shadow DOM host retargeting\n const shadowHost = (node as unknown as ShadowRoot).host\n if (\n shadowHost &&\n typeof shadowHost !== 'string' &&\n !(shadowHost as Element)._$host &&\n (() => {\n const targetNode = asNode(e.target)\n return targetNode ? node.contains(targetNode) : false\n })()\n ) {\n retarget(shadowHost as EventTarget)\n }\n return true\n }\n\n // Walk up tree helper\n const walkUpTree = (): void => {\n while (handleNode() && node) {\n node = asElement(node._$host || node.parentNode || (node as unknown as ShadowRoot).host)\n }\n }\n\n // Simulate currentTarget\n Object.defineProperty(e, 'currentTarget', {\n configurable: true,\n get() {\n return node || document\n },\n })\n\n // Use composedPath for shadow DOM support\n if (e.composedPath) {\n const path = e.composedPath()\n retarget(path[0] as EventTarget)\n for (let i = 0; i < path.length - 2; i++) {\n const nextNode = asElement(path[i] as EventTarget)\n if (!nextNode || nextNode === lastHandled) continue\n node = nextNode\n if (!handleNode()) break\n lastHandled = node\n // Handle portal event bubbling\n if (node._$host) {\n node = node._$host\n walkUpTree()\n break\n }\n // Don't bubble above root of event delegation\n if (node.parentNode === oriCurrentTarget) {\n break\n }\n }\n } else {\n // Fallback for browsers without composedPath\n walkUpTree()\n }\n\n // Reset target\n retarget(oriTarget as EventTarget)\n}\n\n/**\n * Add an event listener to an element.\n * If the event is in DelegatedEvents, it uses event delegation for better performance.\n *\n * @param node - The element to add the listener to\n * @param name - The event name (lowercase)\n * @param handler - The event handler or [handler, data] tuple\n * @param delegate - Whether to use delegation (auto-detected based on event name)\n */\nexport function addEventListener(\n node: Element,\n name: string,\n handler: EventListener | [EventListener, unknown] | null | undefined,\n delegate?: boolean,\n): void {\n if (handler == null) return\n\n if (delegate) {\n // Event delegation: store handler on element\n if (Array.isArray(handler)) {\n ;(node as unknown as Record<string, unknown>)[`$$${name}`] = handler[0]\n ;(node as unknown as Record<string, unknown>)[`$$${name}Data`] = handler[1]\n } else {\n ;(node as unknown as Record<string, unknown>)[`$$${name}`] = handler\n }\n } else if (Array.isArray(handler)) {\n // Non-delegated with data binding\n const handlerFn = handler[0] as (data: unknown, e: Event) => void\n node.addEventListener(name, (e: Event) => handlerFn.call(node, handler[1], e))\n } else {\n // Regular event listener\n node.addEventListener(name, handler as EventListener)\n }\n}\n\n// ============================================================================\n// Event Binding\n// ============================================================================\n\n/**\n * Bind an event listener to an element.\n * Uses event delegation for better performance when applicable.\n *\n * @example\n * ```ts\n * // Static event\n * bindEvent(button, 'click', handleClick)\n *\n * // Reactive event (compiler output)\n * bindEvent(button, 'click', () => $handler())\n *\n * // With modifiers\n * bindEvent(button, 'click', handler, { capture: true, passive: true, once: true })\n * ```\n */\nexport function bindEvent(\n el: Element,\n eventName: string,\n handler: EventListenerOrEventListenerObject | null | undefined,\n options?: boolean | AddEventListenerOptions,\n): Cleanup {\n if (handler == null) return () => {}\n const rootRef = getCurrentRoot()\n\n // Optimization: Global Event Delegation\n // If the event is delegatable and no options were provided,\n // we attach the handler to the element property and rely on the global listener.\n const shouldDelegate = options == null && DelegatedEvents.has(eventName)\n if (shouldDelegate) {\n const key = `$$${eventName}`\n\n // Ensure global delegation is active for this event\n delegateEvents([eventName])\n\n const resolveHandler = isReactive(handler)\n ? (handler as () => EventListenerOrEventListenerObject | null | undefined)\n : () => handler\n\n // Cache a single wrapper that resolves the latest handler when invoked\n // @ts-expect-error - using dynamic property for delegation\n el[key] = function (this: any, ...args: any[]) {\n try {\n const fn = resolveHandler()\n callEventHandler(fn as EventListenerOrEventListenerObject, args[0] as Event, el)\n } catch (err) {\n if (!handleError(err, { source: 'event', eventName }, rootRef)) {\n throw err\n }\n }\n }\n\n // Cleanup: remove property (no effect needed for static or reactive)\n return () => {\n // @ts-expect-error - using dynamic property for delegation\n el[key] = undefined\n }\n }\n\n // Fallback: Native addEventListener\n // Used for non-delegated events or when options are present\n const getHandler = isReactive(handler) ? (handler as () => unknown) : () => handler\n\n // Create wrapped handler that resolves reactive handlers\n const wrapped: EventListener = event => {\n try {\n const resolved = getHandler()\n callEventHandler(resolved as EventListenerOrEventListenerObject, event, el)\n } catch (err) {\n if (handleError(err, { source: 'event', eventName }, rootRef)) {\n return\n }\n throw err\n }\n }\n\n el.addEventListener(eventName, wrapped, options)\n const cleanup = () => el.removeEventListener(eventName, wrapped, options)\n registerRootCleanup(cleanup)\n return cleanup\n}\n\n// ============================================================================\n// Ref Binding\n// ============================================================================\n\n/**\n * Bind a ref to an element.\n * Supports both callback refs and ref objects.\n *\n * @param el - The element to bind the ref to\n * @param ref - Either a callback function, a ref object, or a reactive getter\n * @returns Cleanup function\n *\n * @example\n * ```ts\n * // Callback ref\n * bindRef(el, (element) => { store.input = element })\n *\n * // Ref object\n * const inputRef = createRef()\n * bindRef(el, inputRef)\n *\n * // Reactive ref (compiler output)\n * bindRef(el, () => props.ref)\n * ```\n */\nexport function bindRef(el: Element, ref: unknown): Cleanup {\n if (ref == null) return () => {}\n\n // Handle reactive refs (getters)\n const getRef = isReactive(ref) ? (ref as () => unknown) : () => ref\n\n const applyRef = (refValue: unknown) => {\n if (refValue == null) return\n\n if (typeof refValue === 'function') {\n // Callback ref: call with element\n ;(refValue as (el: Element) => void)(el)\n } else if (typeof refValue === 'object' && 'current' in refValue) {\n // Ref object: set current property\n ;(refValue as { current: Element | null }).current = el\n }\n }\n\n // Apply ref initially\n const initialRef = getRef()\n applyRef(initialRef)\n\n // For reactive refs, track changes\n if (isReactive(ref)) {\n const cleanup = createRenderEffect(() => {\n const currentRef = getRef()\n applyRef(currentRef)\n })\n registerRootCleanup(cleanup)\n\n // On cleanup, null out the ref\n const nullifyCleanup = () => {\n const currentRef = getRef()\n if (currentRef && typeof currentRef === 'object' && 'current' in currentRef) {\n ;(currentRef as { current: Element | null }).current = null\n }\n }\n registerRootCleanup(nullifyCleanup)\n\n return () => {\n cleanup()\n nullifyCleanup()\n }\n }\n\n // For static refs, register cleanup to null out on unmount\n const cleanup = () => {\n const refValue = getRef()\n if (refValue && typeof refValue === 'object' && 'current' in refValue) {\n ;(refValue as { current: Element | null }).current = null\n }\n }\n registerRootCleanup(cleanup)\n\n return cleanup\n}\n\n// ============================================================================\n// Spread Props\n// ============================================================================\n\n/**\n * Apply spread props to an element with reactive updates.\n * This handles dynamic spread like `<div {...props}>`.\n *\n * @param node - The element to apply props to\n * @param props - The props object (may have reactive getters)\n * @param isSVG - Whether this is an SVG element\n * @param skipChildren - Whether to skip children handling\n * @returns The previous props for tracking changes\n *\n * @example\n * ```ts\n * // Compiler output for <div {...props} />\n * spread(el, props, false, false)\n * ```\n */\nexport function spread(\n node: Element,\n props: Record<string, unknown> = {},\n isSVG = false,\n skipChildren = false,\n): Record<string, unknown> {\n const prevProps: Record<string, unknown> = {}\n\n // Handle children if not skipped\n if (!skipChildren && 'children' in props) {\n createRenderEffect(() => {\n prevProps.children = props.children\n })\n }\n\n // Handle ref\n createRenderEffect(() => {\n if (typeof props.ref === 'function') {\n ;(props.ref as (el: Element) => void)(node)\n }\n })\n\n // Handle all other props\n createRenderEffect(() => {\n assign(node, props, isSVG, true, prevProps, true)\n })\n\n return prevProps\n}\n\n/**\n * Assign props to a node, tracking previous values for efficient updates.\n * This is the core prop assignment logic used by spread.\n *\n * @param node - The element to assign props to\n * @param props - New props object\n * @param isSVG - Whether this is an SVG element\n * @param skipChildren - Whether to skip children handling\n * @param prevProps - Previous props for comparison\n * @param skipRef - Whether to skip ref handling\n */\nexport function assign(\n node: Element,\n props: Record<string, unknown>,\n isSVG = false,\n skipChildren = false,\n prevProps: Record<string, unknown> = {},\n skipRef = false,\n): void {\n props = props || {}\n\n // Remove props that are no longer present\n for (const prop in prevProps) {\n if (!(prop in props)) {\n if (prop === 'children') continue\n prevProps[prop] = assignProp(node, prop, null, prevProps[prop], isSVG, skipRef, props)\n }\n }\n\n // Set or update props\n for (const prop in props) {\n if (prop === 'children') {\n if (!skipChildren) {\n // Handle children insertion\n prevProps.children = props.children\n }\n continue\n }\n const value = props[prop]\n prevProps[prop] = assignProp(node, prop, value, prevProps[prop], isSVG, skipRef, props)\n }\n}\n\n/**\n * Assign a single prop to a node.\n */\nfunction assignProp(\n node: Element,\n prop: string,\n value: unknown,\n prev: unknown,\n isSVG: boolean,\n skipRef: boolean,\n props: Record<string, unknown>,\n): unknown {\n // Style handling\n if (prop === 'style') {\n applyStyle(node as Element & { style: CSSStyleDeclaration }, value, prev)\n return value\n }\n\n // classList handling\n if (prop === 'classList') {\n return applyClass(node, value, prev)\n }\n\n // Skip if value unchanged\n if (value === prev) return prev\n\n // Ref handling\n if (prop === 'ref') {\n if (!skipRef && typeof value === 'function') {\n ;(value as (el: Element) => void)(node)\n }\n return value\n }\n\n // Event handling: on:eventname\n if (prop.slice(0, 3) === 'on:') {\n const eventName = prop.slice(3)\n if (prev) node.removeEventListener(eventName, prev as EventListener)\n if (value) node.addEventListener(eventName, value as EventListener)\n return value\n }\n\n // Capture event handling: oncapture:eventname\n if (prop.slice(0, 10) === 'oncapture:') {\n const eventName = prop.slice(10)\n if (prev) node.removeEventListener(eventName, prev as EventListener, true)\n if (value) node.addEventListener(eventName, value as EventListener, true)\n return value\n }\n\n // Standard event handling: onClick, onInput, etc.\n if (prop.slice(0, 2) === 'on') {\n const eventName = prop.slice(2).toLowerCase()\n const shouldDelegate = DelegatedEvents.has(eventName)\n if (!shouldDelegate && prev) {\n const handler = Array.isArray(prev) ? prev[0] : prev\n node.removeEventListener(eventName, handler as EventListener)\n }\n if (shouldDelegate || value) {\n addEventListener(node, eventName, value as EventListener, shouldDelegate)\n if (shouldDelegate) delegateEvents([eventName])\n }\n return value\n }\n\n // Explicit attribute: attr:name\n if (prop.slice(0, 5) === 'attr:') {\n if (value == null) node.removeAttribute(prop.slice(5))\n else node.setAttribute(prop.slice(5), String(value))\n return value\n }\n\n // Explicit boolean attribute: bool:name\n if (prop.slice(0, 5) === 'bool:') {\n if (value) node.setAttribute(prop.slice(5), '')\n else node.removeAttribute(prop.slice(5))\n return value\n }\n\n // Explicit property: prop:name\n if (prop.slice(0, 5) === 'prop:') {\n ;(node as unknown as Record<string, unknown>)[prop.slice(5)] = value\n return value\n }\n\n // Class/className handling\n if (prop === 'class' || prop === 'className') {\n if (value == null) node.removeAttribute('class')\n else node.className = String(value)\n return value\n }\n\n // Check if custom element\n const isCE = node.nodeName.includes('-') || 'is' in props\n\n // Property handling (for non-SVG elements)\n if (!isSVG) {\n const propAlias = isDev ? getPropAlias(prop, node.tagName) : undefined\n const isProperty = isDev\n ? Properties.has(prop)\n : prop in (node as unknown as Record<string, unknown>)\n const isChildProp = isDev\n ? ChildProperties.has(prop)\n : prop === 'innerHTML' ||\n prop === 'textContent' ||\n prop === 'innerText' ||\n prop === 'children'\n\n if (propAlias || isProperty || isChildProp || isCE) {\n const propName = propAlias || prop\n if (isCE && !isProperty && !isChildProp && !propAlias) {\n ;(node as unknown as Record<string, unknown>)[toPropertyName(propName)] = value\n } else {\n ;(node as unknown as Record<string, unknown>)[propName] = value\n }\n return value\n }\n }\n\n // SVG namespace handling\n if (isSVG && prop.indexOf(':') > -1) {\n const [prefix, name] = prop.split(':')\n const ns = SVGNamespace[prefix!]\n if (ns) {\n if (value == null) node.removeAttributeNS(ns, name!)\n else node.setAttributeNS(ns, name!, String(value))\n return value\n }\n }\n\n // Default: set as attribute\n const attrName = prop === 'htmlFor' ? 'for' : prop\n if (value == null) node.removeAttribute(attrName)\n else node.setAttribute(attrName, String(value))\n return value\n}\n\n/**\n * Convert kebab-case to camelCase for property names\n */\nfunction toPropertyName(name: string): string {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase())\n}\n\n// ============================================================================\n// Conditional Rendering\n// ============================================================================\n\n/**\n * Create a conditional rendering binding.\n * Efficiently renders one of two branches based on a condition.\n *\n * This is an optimized version for `{condition ? <A /> : <B />}` patterns\n * where both branches are known statically.\n *\n * @example\n * ```ts\n * // Compiler output for {show ? <A /> : <B />}\n * createConditional(\n * () => $show(),\n * () => jsx(A, {}),\n * () => jsx(B, {}),\n * createElement\n * )\n * ```\n */\nexport function createConditional(\n condition: () => boolean,\n renderTrue: () => FictNode,\n createElementFn: CreateElementFn,\n renderFalse?: () => FictNode,\n): BindingHandle {\n const startMarker = document.createComment('fict:cond:start')\n const endMarker = document.createComment('fict:cond:end')\n const fragment = document.createDocumentFragment()\n fragment.append(startMarker, endMarker)\n const hostRoot = getCurrentRoot()\n\n let currentNodes: Node[] = []\n let currentRoot: RootContext | null = null\n let lastCondition: boolean | undefined = undefined\n let pendingRender = false\n\n // Use computed to memoize condition value - this prevents the effect from\n // re-running when condition dependencies change but the boolean result stays same.\n // This is critical because re-running the effect would purge child effect deps\n // (like bindText) even if we early-return, breaking fine-grained reactivity.\n const conditionMemo = computed(condition)\n\n const runConditional = () => {\n const cond = conditionMemo()\n const parent = startMarker.parentNode as (ParentNode & Node) | null\n if (!parent) {\n pendingRender = true\n return\n }\n pendingRender = false\n\n if (lastCondition === cond && currentNodes.length > 0) {\n return\n }\n if (lastCondition === cond && lastCondition === false && renderFalse === undefined) {\n return\n }\n lastCondition = cond\n\n if (currentRoot) {\n destroyRoot(currentRoot)\n currentRoot = null\n }\n removeNodes(currentNodes)\n currentNodes = []\n\n const render = cond ? renderTrue : renderFalse\n if (!render) {\n return\n }\n\n const root = createRootContext(hostRoot)\n const prev = pushRoot(root)\n let handledError = false\n try {\n // Use untrack to prevent render function's signal accesses from being\n // tracked by createConditional's effect. This ensures that signals used\n // inside the render function (e.g., nested if conditions) don't cause\n // createConditional to re-run, which would purge child effect deps.\n const output = untrack(render)\n if (output == null || output === false) {\n return\n }\n const el = createElementFn(output)\n const nodes = toNodeArray(el)\n insertNodesBefore(parent, nodes, endMarker)\n currentNodes = nodes\n } catch (err) {\n if (handleSuspend(err as any, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n if (handleError(err, { source: 'renderChild' }, root)) {\n handledError = true\n destroyRoot(root)\n return\n }\n throw err\n } finally {\n popRoot(prev)\n if (!handledError) {\n flushOnMount(root)\n currentRoot = root\n } else {\n currentRoot = null\n }\n }\n }\n\n const dispose = createRenderEffect(runConditional)\n\n return {\n marker: fragment,\n flush: () => {\n if (pendingRender) {\n runConditional()\n }\n },\n dispose: () => {\n dispose()\n if (currentRoot) {\n destroyRoot(currentRoot)\n }\n removeNodes(currentNodes)\n currentNodes = []\n startMarker.parentNode?.removeChild(startMarker)\n endMarker.parentNode?.removeChild(endMarker)\n },\n }\n}\n\n// ============================================================================\n// Show/Hide Helper\n// ==========================================================================\n\n/**\n * Create a show/hide binding that uses CSS display instead of DOM manipulation.\n * More efficient than conditional when the content is expensive to create.\n *\n * @example\n * ```ts\n * createShow(container, () => $visible())\n * ```\n */\nexport function createShow(\n el: Element & { style: CSSStyleDeclaration },\n condition: () => boolean,\n displayValue?: string,\n): void {\n const originalDisplay = displayValue ?? el.style.display\n createRenderEffect(() => {\n el.style.display = condition() ? originalDisplay : 'none'\n })\n}\n\n// ============================================================================\n// Portal\n// ============================================================================\n\n/**\n * Create a portal that renders content into a different DOM container.\n *\n * @example\n * ```ts\n * createPortal(\n * document.body,\n * () => jsx(Modal, { children: 'Hello' }),\n * createElement\n * )\n * ```\n */\nexport function createPortal(\n container: ParentNode & Node,\n render: () => FictNode,\n createElementFn: CreateElementFn,\n): BindingHandle {\n // Capture the parent root BEFORE any effects run\n // This is needed because createRenderEffect will push/pop its own root context\n const parentRoot = getCurrentRoot()\n\n const marker = document.createComment('fict:portal')\n container.appendChild(marker)\n\n let currentNodes: Node[] = []\n let currentRoot: RootContext | null = null\n\n const dispose = createRenderEffect(() => {\n // Clean up previous\n if (currentRoot) {\n destroyRoot(currentRoot)\n currentRoot = null\n }\n if (currentNodes.length > 0) {\n removeNodes(currentNodes)\n currentNodes = []\n }\n\n // Create new content\n const root = createRootContext(parentRoot)\n const prev = pushRoot(root)\n let handledError = false\n try {\n const output = render()\n if (output != null && output !== false) {\n const el = createElementFn(output)\n const nodes = toNodeArray(el)\n if (marker.parentNode) {\n insertNodesBefore(marker.parentNode as ParentNode & Node, nodes, marker)\n }\n currentNodes = nodes\n }\n } catch (err) {\n if (handleSuspend(err as any, root)) {\n handledError = true\n destroyRoot(root)\n currentNodes = []\n return\n }\n if (handleError(err, { source: 'renderChild' }, root)) {\n handledError = true\n destroyRoot(root)\n currentNodes = []\n return\n }\n throw err\n } finally {\n popRoot(prev)\n if (!handledError) {\n flushOnMount(root)\n currentRoot = root\n } else {\n currentRoot = null\n }\n }\n })\n\n // The portal's dispose function must be named so we can register it for cleanup\n const portalDispose = () => {\n dispose()\n if (currentRoot) {\n destroyRoot(currentRoot)\n }\n if (currentNodes.length > 0) {\n removeNodes(currentNodes)\n }\n marker.parentNode?.removeChild(marker)\n }\n\n // Register the portal's cleanup with the parent component's root context\n // This ensures the portal is cleaned up when the parent unmounts\n // We use parentRoot (captured before createRenderEffect) to avoid registering\n // with the portal's internal root which would be destroyed separately\n if (parentRoot) {\n parentRoot.destroyCallbacks.push(portalDispose)\n }\n\n return {\n marker,\n dispose: portalDispose,\n }\n}\n\nfunction patchElement(el: Element, output: FictNode): boolean {\n if (\n output === null ||\n output === undefined ||\n output === false ||\n typeof output === 'string' ||\n typeof output === 'number'\n ) {\n el.textContent =\n output === null || output === undefined || output === false ? '' : String(output)\n return true\n }\n\n if (output instanceof Text) {\n el.textContent = output.data\n return true\n }\n\n if (output && typeof output === 'object' && !(output instanceof Node)) {\n const vnode = output as { type?: unknown; props?: Record<string, unknown> }\n if (typeof vnode.type === 'string' && vnode.type.toLowerCase() === el.tagName.toLowerCase()) {\n const children = vnode.props?.children\n const props = vnode.props ?? {}\n\n // Update props (except children and key)\n for (const [key, value] of Object.entries(props)) {\n if (key === 'children' || key === 'key') continue\n if (\n typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null ||\n value === undefined\n ) {\n if (key === 'class' || key === 'className') {\n el.setAttribute('class', value === false || value === null ? '' : String(value))\n } else if (key === 'style' && typeof value === 'string') {\n ;(el as Element & { style: CSSStyleDeclaration }).style.cssText = value\n } else if (value === false || value === null || value === undefined) {\n el.removeAttribute(key)\n } else if (value === true) {\n el.setAttribute(key, '')\n } else {\n el.setAttribute(key, String(value))\n }\n }\n }\n\n // Handle primitive children\n if (\n typeof children === 'string' ||\n typeof children === 'number' ||\n children === null ||\n children === undefined ||\n children === false\n ) {\n el.textContent =\n children === null || children === undefined || children === false ? '' : String(children)\n return true\n }\n\n // Handle single nested VNode child - recursively patch\n if (\n children &&\n typeof children === 'object' &&\n !Array.isArray(children) &&\n !(children instanceof Node)\n ) {\n const childVNode = children as { type?: unknown; props?: Record<string, unknown> }\n if (typeof childVNode.type === 'string') {\n // Find matching child element in the DOM\n const childEl = el.querySelector(childVNode.type)\n if (childEl && patchElement(childEl, children as FictNode)) {\n return true\n }\n }\n }\n\n return false\n }\n }\n\n if (output instanceof Node) {\n if (output.nodeType === Node.ELEMENT_NODE) {\n const nextEl = output as Element\n if (nextEl.tagName.toLowerCase() === el.tagName.toLowerCase()) {\n el.textContent = nextEl.textContent\n return true\n }\n } else if (output.nodeType === Node.TEXT_NODE) {\n el.textContent = (output as Text).data\n return true\n }\n }\n\n return false\n}\n\nfunction patchNode(currentNode: Node | null, nextOutput: FictNode): boolean {\n if (!currentNode) return false\n\n if (\n currentNode instanceof Text &&\n (nextOutput === null ||\n nextOutput === undefined ||\n nextOutput === false ||\n typeof nextOutput === 'string' ||\n typeof nextOutput === 'number' ||\n nextOutput instanceof Text)\n ) {\n const nextText =\n nextOutput instanceof Text\n ? nextOutput.data\n : nextOutput === null || nextOutput === undefined || nextOutput === false\n ? ''\n : String(nextOutput)\n currentNode.data = nextText\n return true\n }\n\n if (currentNode instanceof Element && patchElement(currentNode, nextOutput)) {\n return true\n }\n\n if (nextOutput instanceof Node && currentNode === nextOutput) {\n return true\n }\n\n return false\n}\n\nfunction _isFragmentVNode(\n value: unknown,\n): value is { type: typeof Fragment; props?: { children?: FictNode | FictNode[] } } {\n return (\n value != null &&\n typeof value === 'object' &&\n !(value instanceof Node) &&\n (value as { type?: unknown }).type === Fragment\n )\n}\n\nfunction normalizeChildren(\n children: FictNode | FictNode[] | undefined,\n result: FictNode[] = [],\n): FictNode[] {\n if (children === undefined) {\n return result\n }\n if (Array.isArray(children)) {\n for (const child of children) {\n normalizeChildren(child, result)\n }\n return result\n }\n if (children === null || children === false) {\n return result\n }\n result.push(children)\n return result\n}\n\nfunction _patchFragmentChildren(\n nodes: Node[],\n children: FictNode | FictNode[] | undefined,\n): boolean {\n const normalized = normalizeChildren(children)\n if (normalized.length !== nodes.length) {\n return false\n }\n for (let i = 0; i < normalized.length; i++) {\n if (!patchNode(nodes[i]!, normalized[i]!)) {\n return false\n }\n }\n return true\n}\n\n// DOM utility functions are imported from './node-ops' to avoid duplication\n","import { computed } from './signal'\nimport type { Signal } from './signal'\n\nexport type Memo<T> = () => T\n\nexport function createMemo<T>(fn: () => T): Memo<T> {\n return computed(fn)\n}\n\nexport function fromSignal<T>(signal: Signal<T>): Memo<T> {\n return () => signal()\n}\n\nexport const $memo = createMemo\n","import { createEffect } from './effect'\nimport { createMemo } from './memo'\nimport { createSignal, type SignalAccessor, type ComputedAccessor } from './signal'\n\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\ninterface HookContext {\n slots: unknown[]\n cursor: number\n rendering?: boolean\n}\n\nconst ctxStack: HookContext[] = []\n\nfunction assertRenderContext(ctx: HookContext, hookName: string): void {\n if (!ctx.rendering) {\n const message = isDev\n ? `${hookName} can only be used during render execution`\n : 'FICT:E_HOOK_RENDER'\n throw new Error(message)\n }\n}\n\nexport function __fictUseContext(): HookContext {\n if (ctxStack.length === 0) {\n const ctx: HookContext = { slots: [], cursor: 0, rendering: true }\n ctxStack.push(ctx)\n return ctx\n }\n const ctx = ctxStack[ctxStack.length - 1]!\n ctx.cursor = 0\n ctx.rendering = true\n return ctx\n}\n\nexport function __fictPushContext(): HookContext {\n const ctx: HookContext = { slots: [], cursor: 0 }\n ctxStack.push(ctx)\n return ctx\n}\n\nexport function __fictPopContext(): void {\n ctxStack.pop()\n}\n\nexport function __fictResetContext(): void {\n ctxStack.length = 0\n}\n\nexport function __fictUseSignal<T>(ctx: HookContext, initial: T, slot?: number): SignalAccessor<T> {\n assertRenderContext(ctx, '__fictUseSignal')\n const index = slot ?? ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createSignal(initial)\n }\n return ctx.slots[index] as SignalAccessor<T>\n}\n\nexport function __fictUseMemo<T>(\n ctx: HookContext,\n fn: () => T,\n slot?: number,\n): ComputedAccessor<T> {\n assertRenderContext(ctx, '__fictUseMemo')\n const index = slot ?? ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createMemo(fn)\n }\n return ctx.slots[index] as ComputedAccessor<T>\n}\n\nexport function __fictUseEffect(ctx: HookContext, fn: () => void, slot?: number): void {\n assertRenderContext(ctx, '__fictUseEffect')\n const index = slot ?? ctx.cursor++\n if (!ctx.slots[index]) {\n ctx.slots[index] = createEffect(fn)\n }\n}\n\nexport function __fictRender<T>(ctx: HookContext, fn: () => T): T {\n ctxStack.push(ctx)\n ctx.cursor = 0\n ctx.rendering = true\n try {\n return fn()\n } finally {\n ctx.rendering = false\n ctxStack.pop()\n }\n}\n","import { createMemo } from './memo'\n\nconst PROP_GETTER_MARKER = Symbol.for('fict:prop-getter')\nconst propGetters = new WeakSet<(...args: unknown[]) => unknown>()\nconst rawToProxy = new WeakMap<object, object>()\nconst proxyToRaw = new WeakMap<object, object>()\n\n/**\n * @internal\n * Marks a zero-arg getter so props proxy can lazily evaluate it.\n * Users normally never call this directly; the compiler injects it.\n */\nexport function __fictProp<T>(getter: () => T): () => T {\n if (typeof getter === 'function' && getter.length === 0) {\n propGetters.add(getter)\n if (Object.isExtensible(getter)) {\n try {\n ;(getter as (() => T) & { [PROP_GETTER_MARKER]?: boolean })[PROP_GETTER_MARKER] = true\n } catch {\n // Ignore marker failures on non-standard function objects.\n }\n }\n }\n return getter\n}\n\nfunction isPropGetter(value: unknown): value is () => unknown {\n if (typeof value !== 'function') return false\n const fn = value as (() => unknown) & { [PROP_GETTER_MARKER]?: boolean }\n return propGetters.has(fn as (...args: unknown[]) => unknown) || fn[PROP_GETTER_MARKER] === true\n}\n\nexport function createPropsProxy<T extends Record<string, unknown>>(props: T): T {\n if (!props || typeof props !== 'object') {\n return props\n }\n\n if (proxyToRaw.has(props)) {\n return props\n }\n\n const cached = rawToProxy.get(props)\n if (cached) {\n return cached as T\n }\n\n const proxy = new Proxy(props, {\n get(target, prop, receiver) {\n const value = Reflect.get(target, prop, receiver)\n if (isPropGetter(value)) {\n return value()\n }\n return value\n },\n set(target, prop, value, receiver) {\n return Reflect.set(target, prop, value, receiver)\n },\n has(target, prop) {\n return prop in target\n },\n ownKeys(target) {\n return Reflect.ownKeys(target)\n },\n getOwnPropertyDescriptor(target, prop) {\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n })\n\n rawToProxy.set(props, proxy)\n proxyToRaw.set(proxy, props)\n\n return proxy as T\n}\n\nexport function unwrapProps<T extends Record<string, unknown>>(props: T): T {\n if (!props || typeof props !== 'object') {\n return props\n }\n return (proxyToRaw.get(props) as T | undefined) ?? props\n}\n\n/**\n * Create a rest-like props object while preserving prop getters.\n * Excludes the specified keys from the returned object.\n */\nexport function __fictPropsRest<T extends Record<string, unknown>>(\n props: T,\n exclude: (string | number | symbol)[],\n): Record<string, unknown> {\n const raw = unwrapProps(props)\n const out: Record<string, unknown> = {}\n const excludeSet = new Set(exclude)\n\n for (const key of Reflect.ownKeys(raw)) {\n if (excludeSet.has(key)) continue\n out[key as string] = (raw as Record<string | symbol, unknown>)[key]\n }\n\n // Wrap in props proxy so getters remain lazy when accessed via rest\n return createPropsProxy(out)\n}\n\n/**\n * Merge multiple props-like objects while preserving lazy getters.\n * Later sources override earlier ones.\n *\n * Uses lazy lookup strategy - properties are only accessed when read,\n * avoiding upfront iteration of all keys.\n */\ntype MergeSource<T extends Record<string, unknown>> = T | (() => T)\n\nexport function mergeProps<T extends Record<string, unknown>>(\n ...sources: (MergeSource<T> | null | undefined)[]\n): Record<string, unknown> {\n // Filter out null/undefined sources upfront and store as concrete type\n const validSources: MergeSource<T>[] = sources.filter(\n (s): s is MergeSource<T> => s != null && (typeof s === 'object' || typeof s === 'function'),\n )\n\n if (validSources.length === 0) {\n return {}\n }\n\n if (validSources.length === 1 && typeof validSources[0] === 'object') {\n // Return source directly to preserve getter behavior (consistent with multi-source)\n return validSources[0]!\n }\n\n const resolveSource = (src: MergeSource<T>): T | undefined => {\n const value = typeof src === 'function' ? src() : src\n if (!value || typeof value !== 'object') return undefined\n return unwrapProps(value as T)\n }\n\n const hasProp = (prop: string | symbol) => {\n for (const src of validSources) {\n const raw = resolveSource(src)\n if (raw && prop in raw) {\n return true\n }\n }\n return false\n }\n\n const readProp = (prop: string | symbol) => {\n // Only return undefined if no source has this Symbol property\n // Search sources in reverse order (last wins)\n for (let i = validSources.length - 1; i >= 0; i--) {\n const src = validSources[i]!\n const raw = resolveSource(src)\n if (!raw || !(prop in raw)) continue\n\n const value = (raw as Record<string | symbol, unknown>)[prop]\n // Preserve prop getters - let child component's createPropsProxy unwrap lazily\n // Note: For Symbol properties, we still wrap in getter if source is dynamic\n if (typeof src === 'function' && !isPropGetter(value)) {\n return __fictProp(() => {\n const latest = resolveSource(src)\n if (!latest || !(prop in latest)) return undefined\n return (latest as Record<string | symbol, unknown>)[prop]\n })\n }\n return value\n }\n return undefined\n }\n\n return new Proxy({} as Record<string, unknown>, {\n get(_, prop) {\n return readProp(prop)\n },\n\n has(_, prop) {\n return hasProp(prop)\n },\n\n ownKeys() {\n const keys = new Set<string | symbol>()\n for (const src of validSources) {\n const raw = resolveSource(src)\n if (raw) {\n for (const key of Reflect.ownKeys(raw)) {\n keys.add(key)\n }\n }\n }\n return Array.from(keys)\n },\n\n getOwnPropertyDescriptor(_, prop) {\n if (!hasProp(prop)) return undefined\n return {\n enumerable: true,\n configurable: true,\n get: () => readProp(prop),\n }\n },\n })\n}\n\nexport type PropGetter<T> = (() => T) & { __fictProp: true }\n\nexport interface PropOptions {\n unwrap?: boolean\n}\n/**\n * Memoize a prop getter to cache expensive computations.\n * Use when prop expressions involve heavy calculations or you need lazy, reactive props.\n * Set { unwrap: false } to keep nested prop getters as values.\n *\n * @example\n * ```tsx\n * // Without prop - recomputes on every access\n * <Child data={expensiveComputation(list, filter)} />\n *\n * // With prop - cached until dependencies change, auto-unwrapped by props proxy\n * const memoizedData = prop(() => expensiveComputation(list, filter))\n * <Child data={memoizedData} />\n * ```\n */\nexport function prop<T>(getter: () => T, options?: PropOptions): PropGetter<T> {\n if (isPropGetter(getter)) {\n return getter as PropGetter<T>\n }\n // Capture getter to avoid type narrowing from isPropGetter guard\n const fn: () => T = getter\n const unwrap = options?.unwrap !== false\n // Wrap in prop so component props proxy auto-unwraps when passed down.\n return __fictProp(\n createMemo(() => {\n const value = fn()\n if (unwrap && isPropGetter(value)) {\n return (value as () => T)()\n }\n return value\n }),\n ) as PropGetter<T>\n}\n","/**\n * Fict DOM Rendering System\n *\n * This module provides DOM rendering capabilities with reactive bindings.\n * It transforms JSX virtual nodes into actual DOM elements, automatically\n * setting up reactive updates for dynamic values.\n *\n * Key Features:\n * - Reactive text content: `{count}` updates when count changes\n * - Reactive attributes: `disabled={!isValid}` updates reactively\n * - Reactive children: `{show && <Modal />}` handles conditionals\n * - List rendering: `{items.map(...)}` with efficient keyed updates\n */\n\nimport {\n createTextBinding,\n createAttributeBinding,\n createStyleBinding,\n createClassBinding,\n createChildBinding,\n bindEvent,\n isReactive,\n type MaybeReactive,\n type AttributeSetter,\n type BindingHandle,\n} from './binding'\nimport { Properties, ChildProperties, getPropAlias, SVGElements, SVGNamespace } from './constants'\nimport { __fictPushContext, __fictPopContext } from './hooks'\nimport { Fragment } from './jsx'\nimport {\n createRootContext,\n destroyRoot,\n flushOnMount,\n handleError,\n handleSuspend,\n pushRoot,\n popRoot,\n registerRootCleanup,\n getCurrentRoot,\n} from './lifecycle'\nimport { createPropsProxy, unwrapProps } from './props'\nimport { untrack } from './scheduler'\nimport type { DOMElement, FictNode, FictVNode, RefObject } from './types'\n\ntype NamespaceContext = 'svg' | 'mathml' | null\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\nconst MATHML_NS = 'http://www.w3.org/1998/Math/MathML'\nconst isDev =\n typeof __DEV__ !== 'undefined'\n ? __DEV__\n : typeof process === 'undefined' || process.env?.NODE_ENV !== 'production'\n\n// ============================================================================\n// Main Render Function\n// ============================================================================\n\n/**\n * Render a Fict view into a container element.\n *\n * @param view - A function that returns the view to render\n * @param container - The DOM container to render into\n * @returns A teardown function to unmount the view\n *\n * @example\n * ```ts\n * const unmount = render(() => <App />, document.getElementById('root')!)\n * // Later: unmount()\n * ```\n */\nexport function render(view: () => FictNode, container: HTMLElement): () => void {\n const root = createRootContext()\n const prev = pushRoot(root)\n let dom: DOMElement\n try {\n const output = view()\n // createElement must be called within the root context\n // so that child components register their onMount callbacks correctly\n dom = createElement(output)\n } finally {\n popRoot(prev)\n }\n\n container.replaceChildren(dom)\n container.setAttribute('data-fict-fine-grained', '1')\n\n flushOnMount(root)\n\n const teardown = () => {\n destroyRoot(root)\n container.innerHTML = ''\n }\n\n return teardown\n}\n\n// ============================================================================\n// Element Creation\n// ============================================================================\n\n/**\n * Create a DOM element from a Fict node.\n * This is the main entry point for converting virtual nodes to real DOM.\n *\n * Supports:\n * - Native DOM nodes (passed through)\n * - Null/undefined/false (empty text node)\n * - Arrays (DocumentFragment)\n * - Strings/numbers (text nodes)\n * - Booleans (empty text node)\n * - VNodes (components or HTML elements)\n * - Reactive values (functions returning any of the above)\n */\nexport function createElement(node: FictNode): DOMElement {\n return createElementWithContext(node, null)\n}\n\nfunction resolveNamespace(tagName: string, namespace: NamespaceContext): NamespaceContext {\n if (tagName === 'svg') return 'svg'\n if (tagName === 'math') return 'mathml'\n if (namespace === 'mathml') return 'mathml'\n if (namespace === 'svg') return 'svg'\n if (isDev && SVGElements.has(tagName)) return 'svg'\n return null\n}\n\nfunction createElementWithContext(node: FictNode, namespace: NamespaceContext): DOMElement {\n // Already a DOM node - pass through\n if (node instanceof Node) {\n return node\n }\n\n // Null/undefined/false - empty placeholder\n if (node === null || node === undefined || node === false) {\n return document.createTextNode('')\n }\n\n if (typeof node === 'object' && node !== null && !(node instanceof Node)) {\n // Handle BindingHandle (list/conditional bindings, etc)\n if ('marker' in node) {\n const handle = node as { marker: unknown; dispose?: () => void; flush?: () => void }\n // Register dispose cleanup if available\n if (typeof handle.dispose === 'function') {\n registerRootCleanup(handle.dispose)\n }\n if (typeof handle.flush === 'function') {\n const runFlush = () => handle.flush && handle.flush()\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(runFlush)\n } else {\n Promise.resolve()\n .then(runFlush)\n .catch(() => undefined)\n }\n }\n return createElement(handle.marker as FictNode)\n }\n }\n\n // Array - create fragment\n if (Array.isArray(node)) {\n const frag = document.createDocumentFragment()\n for (const child of node) {\n appendChildNode(frag, child, namespace)\n }\n return frag\n }\n\n // Primitive values - text node\n if (typeof node === 'string' || typeof node === 'number') {\n return document.createTextNode(String(node))\n }\n\n if (typeof node === 'boolean') {\n return document.createTextNode('')\n }\n\n // VNode\n const vnode = node as FictVNode\n\n // Function component\n if (typeof vnode.type === 'function') {\n const rawProps = unwrapProps(vnode.props ?? {}) as Record<string, unknown>\n const baseProps =\n vnode.key === undefined\n ? rawProps\n : new Proxy(rawProps, {\n get(target, prop, receiver) {\n if (prop === 'key') return vnode.key\n return Reflect.get(target, prop, receiver)\n },\n has(target, prop) {\n if (prop === 'key') return true\n return prop in target\n },\n ownKeys(target) {\n const keys = new Set(Reflect.ownKeys(target))\n keys.add('key')\n return Array.from(keys)\n },\n getOwnPropertyDescriptor(target, prop) {\n if (prop === 'key') {\n return { enumerable: true, configurable: true, value: vnode.key }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n })\n\n const props = createPropsProxy(baseProps)\n // Create a fresh hook context for this component instance.\n // This preserves slot state across re-renders driven by __fictRender.\n __fictPushContext()\n try {\n const rendered = vnode.type(props)\n return createElementWithContext(rendered as FictNode, namespace)\n } catch (err) {\n if (handleSuspend(err as any)) {\n return document.createComment('fict:suspend')\n }\n handleError(err, { source: 'render', componentName: vnode.type.name })\n throw err\n } finally {\n __fictPopContext()\n }\n }\n\n // Fragment\n if (vnode.type === Fragment) {\n const frag = document.createDocumentFragment()\n const children = vnode.props?.children as FictNode | FictNode[] | undefined\n appendChildren(frag, children, namespace)\n return frag\n }\n\n // HTML Element\n const tagName = typeof vnode.type === 'string' ? vnode.type : 'div'\n const resolvedNamespace = resolveNamespace(tagName, namespace)\n const el =\n resolvedNamespace === 'svg'\n ? document.createElementNS(SVG_NS, tagName)\n : resolvedNamespace === 'mathml'\n ? document.createElementNS(MATHML_NS, tagName)\n : document.createElement(tagName)\n applyProps(el, vnode.props ?? {}, resolvedNamespace === 'svg')\n appendChildren(\n el as unknown as ParentNode & Node,\n vnode.props?.children as FictNode | FictNode[] | undefined,\n tagName === 'foreignObject' ? null : resolvedNamespace,\n )\n return el as DOMElement\n}\n\n/**\n * Create a template cloning factory from an HTML string.\n * Used by the compiler for efficient DOM generation.\n *\n * @param html - The HTML string to create a template from\n * @param isImportNode - Use importNode for elements like img/iframe\n * @param isSVG - Whether the template is SVG content\n * @param isMathML - Whether the template is MathML content\n */\nexport function template(\n html: string,\n isImportNode?: boolean,\n isSVG?: boolean,\n isMathML?: boolean,\n): () => Node {\n let node: Node | null = null\n\n const create = (): Node => {\n const t = isMathML\n ? document.createElementNS(MATHML_NS, 'template')\n : document.createElement('template')\n t.innerHTML = html\n\n if (isSVG) {\n // For SVG, get the nested content\n return (t as HTMLTemplateElement).content.firstChild!.firstChild!\n }\n if (isMathML) {\n return t.firstChild!\n }\n return (t as HTMLTemplateElement).content.firstChild!\n }\n\n // Create the cloning function\n const fn = isImportNode\n ? () => untrack(() => document.importNode(node || (node = create()), true))\n : () => (node || (node = create())).cloneNode(true)\n\n // Add cloneNode property for compatibility\n ;(fn as { cloneNode?: typeof fn }).cloneNode = fn\n\n return fn\n}\n\n// ============================================================================\n// Child Node Handling\n// ============================================================================\n\n// Use the comprehensive Properties set from constants for property binding\n// These properties must update via DOM property semantics rather than attributes\n\n/**\n * Check if a value is a runtime binding handle\n */\nfunction isBindingHandle(node: unknown): node is BindingHandle {\n return (\n node !== null &&\n typeof node === 'object' &&\n 'marker' in node &&\n 'dispose' in node &&\n typeof (node as BindingHandle).dispose === 'function'\n )\n}\n\n/**\n * Append a child node to a parent, handling all node types including reactive values.\n */\nfunction appendChildNode(\n parent: ParentNode & Node,\n child: FictNode,\n namespace: NamespaceContext,\n): void {\n // Skip nullish values\n if (child === null || child === undefined || child === false) {\n return\n }\n\n // Handle BindingHandle (recursive)\n if (isBindingHandle(child)) {\n appendChildNode(parent, child.marker, namespace)\n // Flush pending nodes now that markers are in the DOM\n child.flush?.()\n return\n }\n\n // Handle getter function (recursive)\n if (typeof child === 'function' && (child as () => FictNode).length === 0) {\n const childGetter = child as () => FictNode\n createChildBinding(parent, childGetter, node => createElementWithContext(node, namespace))\n return\n }\n\n // Static child - create element and append\n if (Array.isArray(child)) {\n for (const item of child) {\n appendChildNode(parent, item, namespace)\n }\n return\n }\n\n // Cast to Node for remaining logic\n let domNode: Node\n if (typeof child !== 'object' || child === null) {\n domNode = document.createTextNode(String(child ?? ''))\n } else {\n domNode = createElementWithContext(child as any, namespace) as Node\n }\n\n // Handle DocumentFragment manually to avoid JSDOM issues\n if (domNode.nodeType === 11) {\n const children = Array.from(domNode.childNodes)\n for (const node of children) {\n appendChildNode(parent, node as FictNode, namespace)\n }\n return\n }\n\n if (domNode.ownerDocument !== parent.ownerDocument && parent.ownerDocument) {\n parent.ownerDocument.adoptNode(domNode)\n }\n\n try {\n parent.appendChild(domNode)\n } catch (e: any) {\n if (parent.ownerDocument) {\n const clone = parent.ownerDocument.importNode(domNode, true)\n parent.appendChild(clone)\n return\n }\n throw e\n }\n}\n\n/**\n * Append multiple children, handling arrays and nested structures.\n */\nfunction appendChildren(\n parent: ParentNode & Node,\n children: FictNode | FictNode[] | undefined,\n namespace: NamespaceContext,\n): void {\n if (children === undefined) return\n\n if (Array.isArray(children)) {\n for (const child of children) {\n appendChildren(parent, child, namespace)\n }\n return\n }\n\n appendChildNode(parent, children, namespace)\n}\n\n// ============================================================================\n// Ref Handling\n// ============================================================================\n\n/**\n * Apply a ref to an element, supporting both callback and object refs.\n * Both types are automatically cleaned up on unmount.\n */\nfunction applyRef(el: Element, value: unknown): void {\n if (typeof value === 'function') {\n // Callback ref\n const refFn = value as (el: Element | null) => void\n refFn(el)\n\n // Match React behavior: call ref(null) on unmount\n const root = getCurrentRoot()\n if (root) {\n registerRootCleanup(() => {\n refFn(null)\n })\n } else if (isDev) {\n console.warn(\n '[fict] Ref applied outside of a root context. ' +\n 'The ref cleanup (setting to null) will not run automatically. ' +\n 'Consider using createRoot() or ensure the element is created within a component.',\n )\n }\n } else if (value && typeof value === 'object' && 'current' in value) {\n // Object ref\n const refObj = value as RefObject<Element>\n refObj.current = el\n\n // Auto-cleanup on unmount\n const root = getCurrentRoot()\n if (root) {\n registerRootCleanup(() => {\n refObj.current = null\n })\n } else if (isDev) {\n console.warn(\n '[fict] Ref applied outside of a root context. ' +\n 'The ref cleanup (setting to null) will not run automatically. ' +\n 'Consider using createRoot() or ensure the element is created within a component.',\n )\n }\n }\n}\n\n// ============================================================================\n// Props Handling\n// ============================================================================\n\n/**\n * Apply props to an HTML element, setting up reactive bindings as needed.\n * Uses comprehensive property constants for correct attribute/property handling.\n */\nfunction applyProps(el: Element, props: Record<string, unknown>, isSVG = false): void {\n props = unwrapProps(props)\n const tagName = el.tagName\n\n // Check if this is a custom element\n const isCE = tagName.includes('-') || 'is' in props\n\n for (const [key, value] of Object.entries(props)) {\n if (key === 'children') continue\n\n // Ref handling\n if (key === 'ref') {\n applyRef(el, value)\n continue\n }\n\n // Event handling with delegation support\n if (isEventKey(key)) {\n bindEvent(\n el,\n eventNameFromProp(key),\n value as MaybeReactive<EventListenerOrEventListenerObject | null | undefined>,\n )\n continue\n }\n\n // Explicit on: namespace for non-delegated events\n if (key.slice(0, 3) === 'on:') {\n bindEvent(\n el,\n key.slice(3),\n value as MaybeReactive<EventListenerOrEventListenerObject | null | undefined>,\n false, // Non-delegated\n )\n continue\n }\n\n // Capture events\n if (key.slice(0, 10) === 'oncapture:') {\n bindEvent(\n el,\n key.slice(10),\n value as MaybeReactive<EventListenerOrEventListenerObject | null | undefined>,\n true, // Capture\n )\n continue\n }\n\n // Class/ClassName\n if (key === 'class' || key === 'className') {\n createClassBinding(el, value as MaybeReactive<string | Record<string, boolean> | null>)\n continue\n }\n\n // classList for object-style class binding\n if (key === 'classList') {\n createClassBinding(el, value as MaybeReactive<Record<string, boolean> | null>)\n continue\n }\n\n // Style\n if (key === 'style') {\n createStyleBinding(\n el,\n value as MaybeReactive<string | Record<string, string | number> | null>,\n )\n continue\n }\n\n // dangerouslySetInnerHTML\n if (key === 'dangerouslySetInnerHTML' && value && typeof value === 'object') {\n const htmlValue = (value as { __html?: string }).__html\n if (htmlValue !== undefined) {\n if (isReactive(htmlValue)) {\n createAttributeBinding(el, 'innerHTML', htmlValue as () => unknown, setInnerHTML)\n } else {\n el.innerHTML = htmlValue\n }\n }\n continue\n }\n\n // Child properties (innerHTML, textContent, etc.)\n if (\n (isDev && ChildProperties.has(key)) ||\n key === 'innerHTML' ||\n key === 'textContent' ||\n key === 'innerText' ||\n key === 'children'\n ) {\n createAttributeBinding(el, key, value as MaybeReactive<unknown>, setProperty)\n continue\n }\n\n // Forced attribute via attr: prefix\n if (key.slice(0, 5) === 'attr:') {\n createAttributeBinding(el, key.slice(5), value as MaybeReactive<unknown>, setAttribute)\n continue\n }\n\n // Forced boolean attribute via bool: prefix\n if (key.slice(0, 5) === 'bool:') {\n createAttributeBinding(el, key.slice(5), value as MaybeReactive<unknown>, setBoolAttribute)\n continue\n }\n\n // Forced property via prop: prefix\n if (key.slice(0, 5) === 'prop:') {\n createAttributeBinding(el, key.slice(5), value as MaybeReactive<unknown>, setProperty)\n continue\n }\n\n // Check for property alias (element-specific mappings)\n const propAlias = !isSVG && isDev ? getPropAlias(key, tagName) : undefined\n const isProperty = !isSVG\n ? isDev\n ? Properties.has(key)\n : key in (el as unknown as Record<string, unknown>)\n : false\n\n // Handle properties and element-specific attributes\n if (propAlias || isProperty || (isCE && !isSVG)) {\n const propName = propAlias || key\n // Custom elements use toPropertyName conversion\n if (isCE && !isProperty && !propAlias) {\n createAttributeBinding(\n el,\n toPropertyName(propName),\n value as MaybeReactive<unknown>,\n setProperty,\n )\n } else {\n createAttributeBinding(el, propName, value as MaybeReactive<unknown>, setProperty)\n }\n continue\n }\n\n // SVG namespaced attributes (xlink:href, xml:lang, etc.)\n if (isSVG && key.indexOf(':') > -1) {\n const [prefix, name] = key.split(':')\n const ns = SVGNamespace[prefix!]\n if (ns) {\n createAttributeBinding(el, key, value as MaybeReactive<unknown>, (el, _key, val) =>\n setAttributeNS(el, ns, name!, val),\n )\n continue\n }\n }\n\n // Regular attributes (potentially reactive)\n // Apply alias mapping (className -> class, htmlFor -> for)\n const attrName = key === 'htmlFor' ? 'for' : key\n createAttributeBinding(el, attrName, value as MaybeReactive<unknown>, setAttribute)\n }\n}\n\n/**\n * Convert kebab-case to camelCase for custom element properties\n */\nfunction toPropertyName(name: string): string {\n return name.toLowerCase().replace(/-([a-z])/g, (_, w) => w.toUpperCase())\n}\n\n// ============================================================================\n// Attribute Setters\n// ============================================================================\n\n/**\n * Set an attribute on an element, handling various value types.\n */\nconst setAttribute: AttributeSetter = (el: Element, key: string, value: unknown): void => {\n // Remove attribute for nullish/false values\n if (value === undefined || value === null || value === false) {\n el.removeAttribute(key)\n return\n }\n\n // Boolean true -> empty string attribute\n if (value === true) {\n el.setAttribute(key, '')\n return\n }\n\n // Primitive values\n const valueType = typeof value\n if (valueType === 'string' || valueType === 'number') {\n el.setAttribute(key, String(value))\n return\n }\n\n // DOM property (for cases like `value`, `checked`, etc.)\n if (key in el) {\n ;(el as unknown as Record<string, unknown>)[key] = value\n return\n }\n\n // Fallback: set as attribute\n el.setAttribute(key, String(value))\n}\n\n/**\n * Set a property on an element, ensuring nullish values clear sensibly.\n */\nconst setProperty: AttributeSetter = (el: Element, key: string, value: unknown): void => {\n if (value === undefined || value === null) {\n const fallback = key === 'checked' || key === 'selected' ? false : ''\n ;(el as unknown as Record<string, unknown>)[key] = fallback\n return\n }\n\n // Handle style object binding style={{ color: 'red' }}\n if (key === 'style' && typeof value === 'object' && value !== null) {\n for (const k in value as Record<string, string>) {\n const v = (value as Record<string, string>)[k]\n if (v !== undefined) {\n ;((el as HTMLElement).style as unknown as Record<string, string>)[k] = String(v)\n }\n }\n return\n }\n\n ;(el as unknown as Record<string, unknown>)[key] = value as unknown\n}\n\n/**\n * Set innerHTML on an element (used for dangerouslySetInnerHTML)\n */\nconst setInnerHTML: AttributeSetter = (el: Element, _key: string, value: unknown): void => {\n const next = value == null ? '' : String(value)\n const node = el as HTMLElement\n if (node.innerHTML === next) return\n node.innerHTML = next\n}\n\n/**\n * Set a boolean attribute on an element (empty string when true, removed when false)\n */\nconst setBoolAttribute: AttributeSetter = (el: Element, key: string, value: unknown): void => {\n if (value) {\n el.setAttribute(key, '')\n } else {\n el.removeAttribute(key)\n }\n}\n\n/**\n * Set an attribute with a namespace (for SVG xlink:href, etc.)\n */\nfunction setAttributeNS(el: Element, namespace: string, name: string, value: unknown): void {\n if (value == null) {\n el.removeAttributeNS(namespace, name)\n } else {\n el.setAttributeNS(namespace, name, String(value))\n }\n}\n\n// ============================================================================\n// Event Handling Utilities\n// ============================================================================\n\n/**\n * Check if a prop key is an event handler (starts with \"on\")\n */\nfunction isEventKey(key: string): boolean {\n return key.startsWith('on') && key.length > 2 && key[2]!.toUpperCase() === key[2]\n}\n\n/**\n * Convert a React-style event prop to a DOM event name\n * e.g., \"onClick\" -> \"click\", \"onMouseDown\" -> \"mousedown\"\n */\nfunction eventNameFromProp(key: string): string {\n return key.slice(2).toLowerCase()\n}\n\n// ============================================================================\n// Exports for Advanced Usage\n// ============================================================================\n\nexport {\n createTextBinding,\n createChildBinding,\n createAttributeBinding,\n createStyleBinding,\n createClassBinding,\n isReactive,\n}\n\nexport type { BindingHandle, MaybeReactive }\n"],"mappings":"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","names":["prop","isDev","isDev","options","isDev","link","effect","isDev","batch","untrack","isDev","prop","currentRoot","batch","options","applyRef","cleanup","render","isDev","ctx","prop","options","unwrap","isDev","prop","untrack","toPropertyName","el"]}