sinwan 0.0.0 → 1.0.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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +94 -1
  3. package/dist/cjs/index.development.js +2288 -0
  4. package/dist/cjs/index.development.js.map +35 -0
  5. package/dist/cjs/index.production.min.js +3 -0
  6. package/dist/cjs/index.production.min.js.map +35 -0
  7. package/dist/cjs/jsx/jsx-dev-runtime.development.js +124 -0
  8. package/dist/cjs/jsx/jsx-dev-runtime.development.js.map +10 -0
  9. package/dist/cjs/jsx/jsx-dev-runtime.production.min.js +3 -0
  10. package/dist/cjs/jsx/jsx-dev-runtime.production.min.js.map +10 -0
  11. package/dist/cjs/jsx/jsx-runtime.development.js +116 -0
  12. package/dist/cjs/jsx/jsx-runtime.development.js.map +10 -0
  13. package/dist/cjs/jsx/jsx-runtime.production.min.js +3 -0
  14. package/dist/cjs/jsx/jsx-runtime.production.min.js.map +10 -0
  15. package/dist/cjs/package.json +4 -0
  16. package/dist/cjs/renderer/index.development.js +1175 -0
  17. package/dist/cjs/renderer/index.development.js.map +24 -0
  18. package/dist/cjs/renderer/index.production.min.js +3 -0
  19. package/dist/cjs/renderer/index.production.min.js.map +24 -0
  20. package/dist/cjs/server/index.development.js +1265 -0
  21. package/dist/cjs/server/index.development.js.map +23 -0
  22. package/dist/cjs/server/index.production.min.js +3 -0
  23. package/dist/cjs/server/index.production.min.js.map +23 -0
  24. package/dist/component/control-flow.d.ts +18 -0
  25. package/dist/component/control-flow.d.ts.map +1 -0
  26. package/dist/component/create.d.ts +75 -0
  27. package/dist/component/create.d.ts.map +1 -0
  28. package/dist/component/index.d.ts +12 -0
  29. package/dist/component/index.d.ts.map +1 -0
  30. package/dist/component/instance.d.ts +84 -0
  31. package/dist/component/instance.d.ts.map +1 -0
  32. package/dist/component/lifecycle.d.ts +41 -0
  33. package/dist/component/lifecycle.d.ts.map +1 -0
  34. package/dist/component/provide-inject.d.ts +45 -0
  35. package/dist/component/provide-inject.d.ts.map +1 -0
  36. package/dist/escaper.d.ts +26 -0
  37. package/dist/escaper.d.ts.map +1 -0
  38. package/dist/esm/index.development.js +2201 -0
  39. package/dist/esm/index.development.js.map +35 -0
  40. package/dist/esm/index.production.min.js +4 -0
  41. package/dist/esm/index.production.min.js.map +35 -0
  42. package/dist/esm/jsx/jsx-dev-runtime.development.js +73 -0
  43. package/dist/esm/jsx/jsx-dev-runtime.development.js.map +10 -0
  44. package/dist/esm/jsx/jsx-dev-runtime.production.min.js +4 -0
  45. package/dist/esm/jsx/jsx-dev-runtime.production.min.js.map +10 -0
  46. package/dist/esm/jsx/jsx-runtime.development.js +77 -0
  47. package/dist/esm/jsx/jsx-runtime.development.js.map +10 -0
  48. package/dist/esm/jsx/jsx-runtime.production.min.js +4 -0
  49. package/dist/esm/jsx/jsx-runtime.production.min.js.map +10 -0
  50. package/dist/esm/package.json +4 -0
  51. package/dist/esm/renderer/index.development.js +1124 -0
  52. package/dist/esm/renderer/index.development.js.map +24 -0
  53. package/dist/esm/renderer/index.production.min.js +4 -0
  54. package/dist/esm/renderer/index.production.min.js.map +24 -0
  55. package/dist/esm/server/index.development.js +1214 -0
  56. package/dist/esm/server/index.development.js.map +23 -0
  57. package/dist/esm/server/index.production.min.js +4 -0
  58. package/dist/esm/server/index.production.min.js.map +23 -0
  59. package/dist/hydration/hydrate.d.ts +29 -0
  60. package/dist/hydration/hydrate.d.ts.map +1 -0
  61. package/dist/hydration/index.d.ts +7 -0
  62. package/dist/hydration/index.d.ts.map +1 -0
  63. package/dist/hydration/markers.d.ts +48 -0
  64. package/dist/hydration/markers.d.ts.map +1 -0
  65. package/dist/hydration/walk.d.ts +32 -0
  66. package/dist/hydration/walk.d.ts.map +1 -0
  67. package/dist/index.d.ts +14 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +7 -0
  70. package/dist/index.mjs +4 -0
  71. package/dist/jsx/jsx-dev-runtime.d.ts +10 -0
  72. package/dist/jsx/jsx-dev-runtime.d.ts.map +1 -0
  73. package/dist/jsx/jsx-runtime.d.ts +67 -0
  74. package/dist/jsx/jsx-runtime.d.ts.map +1 -0
  75. package/dist/jsx/jsx-types.d.ts +702 -0
  76. package/dist/jsx/jsx-types.d.ts.map +1 -0
  77. package/dist/jsx-dev-runtime.d.ts +1 -0
  78. package/dist/jsx-dev-runtime.js +7 -0
  79. package/dist/jsx-dev-runtime.mjs +4 -0
  80. package/dist/jsx-runtime.d.ts +1 -0
  81. package/dist/jsx-runtime.js +7 -0
  82. package/dist/jsx-runtime.mjs +4 -0
  83. package/dist/reactivity/batch.d.ts +27 -0
  84. package/dist/reactivity/batch.d.ts.map +1 -0
  85. package/dist/reactivity/computed.d.ts +41 -0
  86. package/dist/reactivity/computed.d.ts.map +1 -0
  87. package/dist/reactivity/effect.d.ts +79 -0
  88. package/dist/reactivity/effect.d.ts.map +1 -0
  89. package/dist/reactivity/index.d.ts +15 -0
  90. package/dist/reactivity/index.d.ts.map +1 -0
  91. package/dist/reactivity/scheduler.d.ts +35 -0
  92. package/dist/reactivity/scheduler.d.ts.map +1 -0
  93. package/dist/reactivity/signal.d.ts +36 -0
  94. package/dist/reactivity/signal.d.ts.map +1 -0
  95. package/dist/renderer/attributes.d.ts +8 -0
  96. package/dist/renderer/attributes.d.ts.map +1 -0
  97. package/dist/renderer/dom-ops.d.ts +30 -0
  98. package/dist/renderer/dom-ops.d.ts.map +1 -0
  99. package/dist/renderer/events.d.ts +21 -0
  100. package/dist/renderer/events.d.ts.map +1 -0
  101. package/dist/renderer/index.d.ts +12 -0
  102. package/dist/renderer/index.d.ts.map +1 -0
  103. package/dist/renderer/mount.d.ts +27 -0
  104. package/dist/renderer/mount.d.ts.map +1 -0
  105. package/dist/renderer/render-children.d.ts +19 -0
  106. package/dist/renderer/render-children.d.ts.map +1 -0
  107. package/dist/renderer/render-control-flow.d.ts +13 -0
  108. package/dist/renderer/render-control-flow.d.ts.map +1 -0
  109. package/dist/renderer/render-element.d.ts +13 -0
  110. package/dist/renderer/render-element.d.ts.map +1 -0
  111. package/dist/renderer/types.d.ts +65 -0
  112. package/dist/renderer/types.d.ts.map +1 -0
  113. package/dist/renderer/unmount.d.ts +20 -0
  114. package/dist/renderer/unmount.d.ts.map +1 -0
  115. package/dist/renderer.d.ts +1 -0
  116. package/dist/renderer.js +7 -0
  117. package/dist/renderer.mjs +4 -0
  118. package/dist/server/hydration-markers.d.ts +23 -0
  119. package/dist/server/hydration-markers.d.ts.map +1 -0
  120. package/dist/server/index.d.ts +9 -0
  121. package/dist/server/index.d.ts.map +1 -0
  122. package/dist/server/renderer.d.ts +33 -0
  123. package/dist/server/renderer.d.ts.map +1 -0
  124. package/dist/server/stream.d.ts +20 -0
  125. package/dist/server/stream.d.ts.map +1 -0
  126. package/dist/server.d.ts +1 -0
  127. package/dist/server.js +7 -0
  128. package/dist/server.mjs +4 -0
  129. package/dist/types.d.ts +48 -0
  130. package/dist/types.d.ts.map +1 -0
  131. package/package.json +116 -4
  132. package/bun.lock +0 -26
  133. package/src/index.ts +0 -1
  134. package/tsconfig.json +0 -29
@@ -0,0 +1,24 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jsx/jsx-runtime.ts", "../../src/renderer/dom-ops.ts", "../../src/reactivity/scheduler.ts", "../../src/reactivity/effect.ts", "../../src/reactivity/signal.ts", "../../src/reactivity/computed.ts", "../../src/renderer/events.ts", "../../src/component/instance.ts", "../../src/renderer/attributes.ts", "../../src/component/control-flow.ts", "../../src/renderer/unmount.ts", "../../src/renderer/render-control-flow.ts", "../../src/renderer/render-element.ts", "../../src/renderer/render-children.ts", "../../src/renderer/mount.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * SinwanJS View Module — JSX Runtime\n *\n * JSX factory that returns SinwanElement structures for the view renderer.\n * Imported automatically when using JSX syntax.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { SinwanIntrinsicElements } from \"./jsx-types\";\n\nexport const Fragment = Symbol(\"Fragment\");\n\n/**\n * A string that has been marked as safe HTML (already escaped).\n * Used for raw HTML injection with explicit trust marking.\n */\nexport class HtmlEscapedString extends String {\n constructor(public readonly value: string) {\n super(value);\n }\n override toString() {\n return this.value;\n }\n}\n\nexport const raw = (str: string) => new HtmlEscapedString(str);\n\n// Fast path for intrinsic elements\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\n/**\n * Normalize children into an array of SinwanNode.\n */\nfunction normalizeChildren(children: any): SinwanNode[] {\n if (children == null || typeof children === \"boolean\") return [];\n if (Array.isArray(children)) return children.flat(Infinity);\n return [children];\n}\n\n/**\n * Build an SinwanElement from a component/tag invocation.\n * Shared logic for jsx, jsxs, and jsxDEV.\n */\nfunction buildElement(\n type: any,\n props: any,\n children: SinwanNode[],\n): SinwanElement {\n // Handle Fragment\n if (type === Fragment) {\n return { tag: \"\", props: {}, children };\n }\n\n // Functional components and intrinsic HTML elements both pass the type\n // through as `tag`. The renderer (client / server / hydration) is the\n // single owner of component-instance creation and lifecycle dispatch.\n // Calling the function eagerly here would bypass instance management\n // and break `onMounted`, `provide`/`inject`, and the parent/child tree.\n if (typeof type === \"function\" || typeof type === \"string\") {\n const finalProps = props ?? {};\n // Mirror children into props.children so component setup can read it.\n if (children.length > 0 && finalProps.children === undefined) {\n finalProps.children = children.length === 1 ? children[0] : children;\n }\n return { tag: type, props: finalProps, children };\n }\n\n // Fallback\n return { tag: \"\", props: {}, children };\n}\n\n/**\n * JSX factory — called for elements with 0 or 1 child.\n * TypeScript auto-imports this in production mode (`react-jsx`).\n */\nexport function jsx(type: any, props: any, key?: any): SinwanElement {\n return buildElement(type, props, normalizeChildren(props?.children));\n}\n\n/**\n * JSX static factory — called for elements with 2+ children.\n * `props.children` is **already an array**, so we skip normalizeChildren.\n */\nexport function jsxs(type: any, props: any, key?: any): SinwanElement {\n const children = props?.children;\n // Children is guaranteed to be an array by the compiler\n return buildElement(\n type,\n props,\n Array.isArray(children)\n ? children.flat(Infinity)\n : normalizeChildren(children),\n );\n}\n\n/**\n * Source location metadata attached by the compiler in dev mode.\n */\nexport interface JSXSource {\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\n/**\n * JSX dev factory — called in dev mode (`react-jsxdev`).\n * Receives extra source/debug info for better error messages.\n */\nexport function jsxDEV(\n type: any,\n props: any,\n key: any,\n isStaticChildren: boolean,\n source?: JSXSource,\n self?: unknown,\n): SinwanElement {\n const children = isStaticChildren\n ? Array.isArray(props?.children)\n ? props.children.flat(Infinity)\n : normalizeChildren(props?.children)\n : normalizeChildren(props?.children);\n\n const element = buildElement(type, props, children);\n\n // Attach debug metadata (useful for dev-tools / error traces)\n if (source) {\n (element as any).__source = source;\n }\n\n return element;\n}\n\nexport namespace JSX {\n export type Element = SinwanElement | Promise<SinwanElement>;\n export interface IntrinsicAttributes {\n key?: string | number;\n }\n export interface ElementChildrenAttribute {\n children: {};\n }\n export interface IntrinsicElements extends SinwanIntrinsicElements {}\n}\n\ndeclare global {\n namespace JSX {\n type Element = SinwanElement | Promise<SinwanElement>;\n interface IntrinsicAttributes {\n key?: string | number;\n }\n interface ElementChildrenAttribute {\n children: {};\n }\n interface IntrinsicElements extends SinwanIntrinsicElements {}\n }\n}\n",
6
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — DOM Operations\n *\n * Thin abstraction over native DOM APIs for testability\n * and potential future server-side DOM (e.g., happy-dom, linkedom).\n */\n\nexport interface DOMOps {\n createElement(tag: string): Element;\n createElementNS(namespace: string, tag: string): Element;\n createTextNode(text: string): Text;\n createComment(text: string): Comment;\n setAttribute(el: Element, key: string, value: string): void;\n removeAttribute(el: Element, key: string): void;\n setProperty(el: Element, key: string, value: unknown): void;\n insertBefore(parent: Node, child: Node, anchor: Node | null): void;\n appendChild(parent: Node, child: Node): void;\n remove(node: Node): void;\n setTextContent(node: Text, text: string): void;\n addEventListener(el: Element, event: string, handler: EventListener): void;\n removeEventListener(el: Element, event: string, handler: EventListener): void;\n parentNode(node: Node): Node | null;\n nextSibling(node: Node): Node | null;\n}\n\nfunction createDefaultDOMOps(): DOMOps {\n return {\n createElement(tag: string): Element {\n return document.createElement(tag);\n },\n\n createElementNS(namespace: string, tag: string): Element {\n return document.createElementNS(namespace, tag);\n },\n\n createTextNode(text: string): Text {\n return document.createTextNode(text);\n },\n\n createComment(text: string): Comment {\n return document.createComment(text);\n },\n\n setAttribute(el: Element, key: string, value: string): void {\n el.setAttribute(key, value);\n },\n\n removeAttribute(el: Element, key: string): void {\n el.removeAttribute(key);\n },\n\n setProperty(el: Element, key: string, value: unknown): void {\n (el as any)[key] = value;\n },\n\n insertBefore(parent: Node, child: Node, anchor: Node | null): void {\n parent.insertBefore(child, anchor);\n },\n\n appendChild(parent: Node, child: Node): void {\n parent.appendChild(child);\n },\n\n remove(node: Node): void {\n node.parentNode?.removeChild(node);\n },\n\n setTextContent(node: Text, text: string): void {\n node.data = text;\n },\n\n addEventListener(el: Element, event: string, handler: EventListener): void {\n el.addEventListener(event, handler);\n },\n\n removeEventListener(el: Element, event: string, handler: EventListener): void {\n el.removeEventListener(event, handler);\n },\n\n parentNode(node: Node): Node | null {\n return node.parentNode;\n },\n\n nextSibling(node: Node): Node | null {\n return node.nextSibling;\n },\n };\n}\n\nconst defaultDOMOps = createDefaultDOMOps();\n\n/**\n * Live DOM operations object used by the renderer.\n */\nexport const domOps: DOMOps = { ...defaultDOMOps };\n\nexport function setDOMOps(overrides: Partial<DOMOps>): void {\n Object.assign(domOps, overrides);\n}\n\nexport function resetDOMOps(): void {\n for (const key of Object.keys(domOps) as (keyof DOMOps)[]) {\n delete (domOps as any)[key];\n }\n Object.assign(domOps, defaultDOMOps);\n}\n",
7
+ "/**\n * SinwanJS Reactivity — Scheduler\n *\n * Microtask-based flush queue for batching reactive updates.\n * Effects are NOT run synchronously on signal write — they are\n * queued and flushed in a microtask (like Vue's nextTick).\n */\n\nexport interface EffectNode {\n id: number;\n run(): void;\n active: boolean;\n}\n\nconst pendingEffects = new Set<EffectNode>();\nlet flushScheduled = false;\nlet isFlushing = false;\n\n// Pending nextTick callbacks\nconst pendingCallbacks: (() => void)[] = [];\n\n/**\n * Schedule an effect for the next microtask flush.\n */\nexport function scheduleEffect(effect: EffectNode): void {\n if (!effect.active) return;\n pendingEffects.add(effect);\n scheduleFlush();\n}\n\n/**\n * Remove a scheduled effect (e.g. when disposed before flush).\n */\nexport function unscheduleEffect(effect: EffectNode): void {\n pendingEffects.delete(effect);\n}\n\n/**\n * Schedule the microtask flush if not already scheduled.\n */\nfunction scheduleFlush(): void {\n if (!flushScheduled) {\n flushScheduled = true;\n queueMicrotask(flush);\n }\n}\n\n/**\n * Flush all pending effects. Effects added during flush are\n * processed in the same pass (convergence loop with a safety limit).\n */\nfunction flush(): void {\n isFlushing = true;\n\n // Sort by id to guarantee parent-before-child execution order\n const sorted = [...pendingEffects].sort((a, b) => a.id - b.id);\n pendingEffects.clear();\n\n for (const effect of sorted) {\n if (effect.active) {\n effect.run();\n }\n }\n\n // If new effects were queued during the flush, drain them too\n // (safety limit to prevent infinite loops)\n let safety = 10;\n while (pendingEffects.size > 0 && safety-- > 0) {\n const next = [...pendingEffects].sort((a, b) => a.id - b.id);\n pendingEffects.clear();\n for (const effect of next) {\n if (effect.active) {\n effect.run();\n }\n }\n }\n\n flushScheduled = false;\n isFlushing = false;\n\n // Run nextTick callbacks after all effects\n const cbs = pendingCallbacks.splice(0);\n for (const cb of cbs) {\n cb();\n }\n}\n\n/**\n * Returns true if the scheduler is currently flushing effects.\n */\nexport function isFlushingEffects(): boolean {\n return isFlushing;\n}\n\n/**\n * Queue a callback that runs after the next reactive flush completes.\n * Similar to Vue's nextTick().\n */\nexport function nextTick(fn?: () => void): Promise<void> {\n return new Promise<void>((resolve) => {\n const callback = () => {\n fn?.();\n resolve();\n };\n if (flushScheduled || isFlushing) {\n // Effects are pending — run after they flush\n pendingCallbacks.push(callback);\n } else {\n // No pending effects — run on next microtask\n queueMicrotask(callback);\n }\n });\n}\n\n/**\n * Force synchronous flush of all pending effects.\n * Primarily for testing and batch().\n */\nexport function flushSync(): void {\n if (flushScheduled) {\n flushScheduled = false;\n flush();\n }\n}\n",
8
+ "/**\n * SinwanJS Reactivity — Effect\n *\n * Fine-grained effect system with automatic dependency tracking.\n * When an effect runs, any signal reads are tracked as dependencies.\n * When those signals change, the effect is re-scheduled.\n */\n\nimport { type EffectNode, scheduleEffect, unscheduleEffect } from \"./scheduler.ts\";\n\n// ─── Global tracking state ─────────────────────────────────\n\nlet activeEffect: ReactiveEffect | null = null;\nconst effectStack: ReactiveEffect[] = [];\nlet effectIdCounter = 0;\n\n// ─── Subscription interface ────────────────────────────────\n\n/**\n * A Dep is any object that can track subscribers.\n * Signals and computeds implement this internally.\n */\nexport interface Dep {\n subscribers: Set<ReactiveEffect>;\n}\n\n// ─── ReactiveEffect ────────────────────────────────────────\n\nexport type CleanupFn = () => void;\nexport type EffectFn = () => CleanupFn | void;\n\nexport class ReactiveEffect implements EffectNode {\n id: number;\n active = true;\n\n /** The user-supplied function */\n private fn: EffectFn;\n\n /** Cleanup returned from the last run */\n private cleanup: CleanupFn | void = undefined;\n\n /** All deps this effect is subscribed to (for bidirectional cleanup) */\n deps: Set<Dep> = new Set();\n\n constructor(fn: EffectFn) {\n this.id = effectIdCounter++;\n this.fn = fn;\n }\n\n /**\n * Execute the effect function while tracking dependencies.\n */\n run(): void {\n if (!this.active) return;\n\n // Prevent infinite re-entry\n if (effectStack.includes(this)) return;\n\n // Clean up previous dependencies\n this.cleanupDeps();\n\n // Run user cleanup from previous execution\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n\n // Push onto the tracking stack\n effectStack.push(this);\n const prevEffect = activeEffect;\n activeEffect = this;\n\n try {\n const result = this.fn();\n if (typeof result === \"function\") {\n this.cleanup = result;\n }\n } finally {\n activeEffect = prevEffect;\n effectStack.pop();\n }\n }\n\n /**\n * Unsubscribe from all current deps so stale deps don't trigger this effect.\n */\n private cleanupDeps(): void {\n for (const dep of this.deps) {\n dep.subscribers.delete(this);\n }\n this.deps.clear();\n }\n\n /**\n * Notify the scheduler that this effect should re-run.\n */\n notify(): void {\n scheduleEffect(this);\n }\n\n /**\n * Permanently dispose this effect — stop tracking & unsubscribe.\n */\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n\n // Run user cleanup\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n\n this.cleanupDeps();\n unscheduleEffect(this);\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a reactive effect.\n *\n * The effect function runs immediately to establish initial dependencies.\n * It re-runs whenever any tracked signal changes.\n * Returns a dispose function to stop the effect.\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"count is\", count.value);\n * });\n * // logs \"count is 0\" immediately\n *\n * count.value = 1;\n * // logs \"count is 1\" on next microtask\n *\n * dispose(); // stops tracking\n */\nexport function effect(fn: EffectFn): CleanupFn {\n const e = new ReactiveEffect(fn);\n // Run immediately (synchronous first run for initial tracking)\n e.run();\n return () => e.dispose();\n}\n\n// ─── Tracking helpers (used by signals/computed) ───────────\n\n/**\n * Track a dependency from the currently active effect.\n * Called by signal.value getters.\n */\nexport function track(dep: Dep): void {\n if (activeEffect) {\n dep.subscribers.add(activeEffect);\n activeEffect.deps.add(dep);\n }\n}\n\n/**\n * Trigger all subscribers of a dependency.\n * Called by signal.value setters.\n */\nexport function trigger(dep: Dep): void {\n // Copy to avoid modification during iteration\n const effects = [...dep.subscribers];\n for (const effect of effects) {\n effect.notify();\n }\n}\n\n/**\n * Returns the currently active effect (for advanced usage).\n */\nexport function getActiveEffect(): ReactiveEffect | null {\n return activeEffect;\n}\n",
9
+ "/**\n * SinwanJS Reactivity — Signal\n *\n * A signal is a reactive container for a single value.\n * Reading `.value` tracks the current effect as a subscriber.\n * Writing `.value` notifies all subscribers.\n *\n * Inspired by Vue 3 ref(), Solid signals, Preact signals.\n */\n\nimport { type Dep, track, trigger } from \"./effect.ts\";\n\n// ─── Signal interface ──────────────────────────────────────\n\nexport interface Signal<T> {\n /** Get or set the reactive value. Reading tracks; writing notifies. */\n value: T;\n\n /** Read the value without tracking dependencies. */\n peek(): T;\n\n /** Manually subscribe to changes. Returns an unsubscribe function. */\n subscribe(fn: (value: T) => void): () => void;\n}\n\n// Brand for type-checking\nconst SIGNAL_BRAND = Symbol(\"Sinwan:signal\");\n\n// ─── Implementation ────────────────────────────────────────\n\nclass SignalImpl<T> implements Signal<T>, Dep {\n [SIGNAL_BRAND] = true;\n\n subscribers = new Set<import(\"./effect.ts\").ReactiveEffect>();\n private _value: T;\n private _manualSubs = new Set<(value: T) => void>();\n\n constructor(initial: T) {\n this._value = initial;\n }\n\n get value(): T {\n track(this);\n return this._value;\n }\n\n set value(newValue: T) {\n if (Object.is(this._value, newValue)) return;\n this._value = newValue;\n trigger(this);\n\n // Notify manual subscribers\n for (const fn of this._manualSubs) {\n fn(newValue);\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n subscribe(fn: (value: T) => void): () => void {\n this._manualSubs.add(fn);\n return () => {\n this._manualSubs.delete(fn);\n };\n }\n\n /**\n * toString() for interpolation in templates.\n */\n toString(): string {\n return String(this.value);\n }\n\n /**\n * valueOf() for numeric operations.\n */\n valueOf(): T {\n return this.value;\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a reactive signal.\n *\n * @example\n * const count = signal(0);\n * console.log(count.value); // 0\n *\n * effect(() => {\n * console.log(count.value); // re-runs when count changes\n * });\n *\n * count.value = 5; // triggers the effect\n */\nexport function signal<T>(initial: T): Signal<T> {\n return new SignalImpl(initial);\n}\n\n/**\n * Type guard: check if a value is a Signal.\n */\nexport function isSignal(value: unknown): value is Signal<unknown> {\n return (\n value != null && typeof value === \"object\" && SIGNAL_BRAND in (value as any)\n );\n}\n",
10
+ "/**\n * SinwanJS Reactivity — Computed\n *\n * A computed is a derived reactive value that lazily re-evaluates\n * when its dependencies change. It caches the result and only\n * recomputes when actually read after a dependency has changed.\n *\n * Design: The computed does NOT use the scheduler for its own\n * re-evaluation. When a dependency changes, it marks itself dirty\n * and triggers downstream subscribers (which ARE scheduled).\n * The actual re-evaluation happens lazily on `.value` access.\n *\n * Inspired by Vue 3 computed(), Solid createMemo().\n */\n\nimport { type Dep, track, trigger, ReactiveEffect } from \"./effect.ts\";\n\n// ─── Computed interface ────────────────────────────────────\n\nexport interface Computed<T> {\n /** Read the computed value (lazy evaluation, cached). */\n readonly value: T;\n\n /** Read without tracking. */\n peek(): T;\n}\n\n// Brand for type-checking\nconst COMPUTED_BRAND = Symbol(\"Sinwan:computed\");\n\n// ─── Implementation ────────────────────────────────────────\n\nclass ComputedImpl<T> implements Computed<T>, Dep {\n [COMPUTED_BRAND] = true;\n\n subscribers = new Set<ReactiveEffect>();\n\n _value!: T;\n _dirty = true;\n _effect: ReactiveEffect;\n\n constructor(getter: () => T) {\n const self = this;\n\n // Internal effect solely for dependency tracking.\n // The fn wraps the getter — it writes to self._value as a side effect.\n this._effect = new ReactiveEffect(() => {\n self._value = getter();\n });\n\n // Override notify: don't schedule this effect via the scheduler.\n // Instead mark dirty and propagate to our own subscribers.\n this._effect.notify = function () {\n if (!self._dirty) {\n self._dirty = true;\n trigger(self);\n }\n };\n\n // Run once synchronously to establish deps and cache initial value\n this._effect.run();\n this._dirty = false;\n }\n\n get value(): T {\n track(this);\n\n if (this._dirty) {\n this._effect.run();\n this._dirty = false;\n }\n\n return this._value;\n }\n\n peek(): T {\n if (this._dirty) {\n this._effect.run();\n this._dirty = false;\n }\n return this._value;\n }\n\n /**\n * toString() for template interpolation.\n */\n toString(): string {\n return String(this.value);\n }\n\n /**\n * valueOf() for numeric operations.\n */\n valueOf(): T {\n return this.value;\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a computed reactive value.\n *\n * The getter function is tracked — when any signal it reads changes,\n * the computed is marked dirty and will re-evaluate on next `.value` read.\n *\n * @example\n * const count = signal(2);\n * const doubled = computed(() => count.value * 2);\n *\n * console.log(doubled.value); // 4\n *\n * count.value = 5;\n * console.log(doubled.value); // 10\n */\nexport function computed<T>(getter: () => T): Computed<T> {\n return new ComputedImpl(getter);\n}\n\n/**\n * Type guard: check if a value is a Computed.\n */\nexport function isComputed(value: unknown): value is Computed<unknown> {\n return (\n value != null &&\n typeof value === \"object\" &&\n COMPUTED_BRAND in (value as any)\n );\n}\n",
11
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Event Binding\n *\n * Direct event binding (not delegation). Each handler is attached\n * directly to its target element for simplicity and easy hydration.\n *\n * Design decision: direct binding like Solid.js, not delegation like React.\n */\n\nimport { domOps } from \"./dom-ops.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\n\n/**\n * Check if a prop key is an event handler (starts with \"on\").\n */\nexport function isEventProp(key: string): boolean {\n return key.length > 2 && key[0] === \"o\" && key[1] === \"n\" && key[2]! >= \"A\" && key[2]! <= \"Z\";\n}\n\n/**\n * Extract the DOM event name from a prop key.\n * e.g., \"onClick\" → \"click\", \"onMouseEnter\" → \"mouseenter\"\n */\nexport function toEventName(key: string): string {\n return key.slice(2).toLowerCase();\n}\n\n/**\n * Bind an event handler to an element.\n * Returns a cleanup function to remove the listener.\n */\nexport function bindEvent(\n el: Element,\n eventName: string,\n handler: EventListener,\n): CleanupFn {\n domOps.addEventListener(el, eventName, handler);\n return () => {\n domOps.removeEventListener(el, eventName, handler);\n };\n}\n\n/**\n * Bind all event props from an element's props object.\n * Returns an array of cleanup functions.\n */\nexport function bindEvents(\n el: Element,\n props: Record<string, unknown>,\n): CleanupFn[] {\n const cleanups: CleanupFn[] = [];\n\n for (const key of Object.keys(props)) {\n if (isEventProp(key)) {\n const handler = props[key];\n if (typeof handler === \"function\") {\n const eventName = toEventName(key);\n cleanups.push(bindEvent(el, eventName, handler as EventListener));\n }\n }\n }\n\n return cleanups;\n}\n",
12
+ "/**\n * SinwanJS Component Runtime — Instance Management\n *\n * Each component rendered on the client gets a ComponentInstance\n * that tracks its lifecycle hooks, effects, parent/child tree,\n * and provide/inject context.\n *\n * A global `currentInstance` stack lets lifecycle hooks (onMounted, etc.)\n * register themselves during setup or synchronous lifecycle callbacks —\n * same pattern as Vue's getCurrentInstance.\n */\n\nimport type { SinwanComponent } from \"../types.ts\";\nimport type { MountedNode } from \"../renderer/types.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport { nextTick } from \"../reactivity/scheduler.ts\";\n\n// ─── ComponentInstance ─────────────────────────────────────\n\nlet uidCounter = 0;\n\nexport interface ComponentInstance {\n /** Unique identifier for this instance. */\n uid: number;\n\n /** The component definition (setup function). */\n component: SinwanComponent<any>;\n\n /** Props passed to this component. */\n props: Record<string, any>;\n\n /** The rendered DOM subtree (set after render). */\n element: MountedNode | null;\n\n /** Parent instance in the component tree. */\n parent: ComponentInstance | null;\n\n /** Child component instances. */\n children: ComponentInstance[];\n\n /** All effect dispose functions owned by this component. */\n effects: CleanupFn[];\n\n // ─── Lifecycle hook queues ────────────────────────────\n\n /** Callbacks to fire after the component is mounted to DOM. */\n _mountedHooks: (() => void)[];\n\n /** Callbacks to fire when the component is unmounted. */\n _unmountedHooks: (() => void)[];\n\n /** Callbacks to fire after any reactive update in this component. */\n _updatedHooks: (() => void)[];\n\n /** Error handler callbacks. */\n _errorHooks: ((err: Error) => void)[];\n\n // ─── Provide/Inject context ───────────────────────────\n\n /** Values provided by this instance (for inject in children). */\n provides: Record<string | symbol, unknown>;\n\n // ─── State flags ──────────────────────────────────────\n\n isMounted: boolean;\n isUnmounted: boolean;\n}\n\n/**\n * Create a fresh ComponentInstance.\n */\nexport function createComponentInstance(\n component: SinwanComponent<any>,\n props: Record<string, any>,\n parent: ComponentInstance | null,\n): ComponentInstance {\n return {\n uid: uidCounter++,\n component,\n props,\n element: null,\n parent,\n children: [],\n effects: [],\n _mountedHooks: [],\n _unmountedHooks: [],\n _updatedHooks: [],\n _errorHooks: [],\n // Inherit parent's provides (prototype chain for lookup)\n provides: parent ? Object.create(parent.provides) : Object.create(null),\n isMounted: false,\n isUnmounted: false,\n };\n}\n\n// ─── Current instance stack ────────────────────────────────\n\nlet currentInstance: ComponentInstance | null = null;\n\n/**\n * Get the currently active component instance.\n * Used by lifecycle hooks to register themselves.\n */\nexport function getCurrentInstance(): ComponentInstance | null {\n return currentInstance;\n}\n\n/**\n * Set the current instance (called by renderer before setup).\n * Returns the previous instance for restoration.\n */\nexport function setCurrentInstance(\n instance: ComponentInstance | null,\n): ComponentInstance | null {\n const prev = currentInstance;\n currentInstance = instance;\n return prev;\n}\n\n/**\n * Run a function with `instance` as the current component instance.\n * Automatically restores the previous instance when done.\n */\nexport function withInstance<T>(instance: ComponentInstance, fn: () => T): T {\n const prev = setCurrentInstance(instance);\n try {\n return fn();\n } finally {\n setCurrentInstance(prev);\n }\n}\n\n// ─── Lifecycle execution ───────────────────────────────────\n\n/**\n * Fire all onMounted hooks for an instance and its children (depth-first).\n */\nexport function fireMountedHooks(instance: ComponentInstance): void {\n if (instance.isUnmounted) {\n return;\n }\n\n // Children first (bottom-up, like Vue)\n for (const child of instance.children) {\n fireMountedHooks(child);\n }\n\n if (!instance.isMounted) {\n instance.isMounted = true;\n for (const hook of instance._mountedHooks) {\n hook();\n }\n }\n}\n\n/**\n * Fire all onUnmounted hooks and dispose all effects for an instance\n * and its children (depth-first, children first).\n */\nexport function fireUnmountedHooks(instance: ComponentInstance): void {\n // Children first\n for (const child of instance.children) {\n fireUnmountedHooks(child);\n }\n\n if (instance.isMounted && !instance.isUnmounted) {\n instance.isUnmounted = true;\n instance.isMounted = false;\n\n // Fire unmounted hooks\n for (const hook of instance._unmountedHooks) {\n hook();\n }\n\n // Dispose all effects owned by this component\n for (const dispose of instance.effects) {\n dispose();\n }\n instance.effects.length = 0;\n }\n}\n\n/**\n * Fire onUpdated hooks for the current instance.\n */\nexport function fireUpdatedHooks(instance: ComponentInstance): void {\n for (const hook of instance._updatedHooks) {\n hook();\n }\n}\n\nconst queuedUpdatedHooks = new Set<ComponentInstance>();\n\n/**\n * Queue onUpdated hooks to run after the current reactive flush.\n * Multiple DOM effects in the same flush produce one updated callback.\n */\nexport function queueUpdatedHooks(instance: ComponentInstance | null): void {\n if (\n !instance ||\n !instance.isMounted ||\n instance.isUnmounted ||\n instance._updatedHooks.length === 0 ||\n queuedUpdatedHooks.has(instance)\n ) {\n return;\n }\n\n queuedUpdatedHooks.add(instance);\n nextTick(() => {\n queuedUpdatedHooks.delete(instance);\n if (instance.isMounted && !instance.isUnmounted) {\n fireUpdatedHooks(instance);\n }\n });\n}\n\n/**\n * Handle an error in the component tree — walks up to find an error handler.\n */\nexport function handleComponentError(\n instance: ComponentInstance,\n err: Error,\n): void {\n let current: ComponentInstance | null = instance;\n while (current) {\n if (current._errorHooks.length > 0) {\n for (const hook of current._errorHooks) {\n hook(err);\n }\n return;\n }\n current = current.parent;\n }\n // No handler found — re-throw\n console.error(\"[Sinwan] Unhandled component error:\", err);\n}\n",
13
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Attribute Handling\n *\n * Maps JSX props to DOM attributes and properties.\n * Handles special cases: className→class, htmlFor→for,\n * style objects, boolean attributes, and reactive attributes.\n */\n\nimport { domOps } from \"./dom-ops.ts\";\nimport { isEventProp } from \"./events.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport {\n getCurrentInstance,\n queueUpdatedHooks,\n} from \"../component/instance.ts\";\n\n// Props that should be skipped during attribute rendering\nconst SKIP_PROPS = new Set([\"children\", \"key\", \"ref\", \"dangerouslySetInnerHTML\"]);\n\n// Props that map to DOM properties rather than attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"disabled\", \"readOnly\", \"multiple\", \"indeterminate\"]);\n\n// Prop name aliases\nconst PROP_ALIASES: Record<string, string> = {\n className: \"class\",\n htmlFor: \"for\",\n tabIndex: \"tabindex\",\n crossOrigin: \"crossorigin\",\n};\n\n/**\n * Apply all non-event props to a DOM element.\n * Handles static values, reactive signals, and special cases.\n * Returns an array of disposers for reactive attributes.\n */\nexport function applyAttributes(\n el: Element,\n props: Record<string, unknown>,\n): CleanupFn[] {\n const disposers: CleanupFn[] = [];\n const owner = getCurrentInstance();\n\n for (const [key, value] of Object.entries(props)) {\n if (SKIP_PROPS.has(key) || isEventProp(key)) continue;\n\n if (isSignal(value) || isComputed(value)) {\n // Reactive attribute — wrap in an effect\n let initialized = false;\n const dispose = effect(() => {\n setSingleAttribute(el, key, (value as any).value);\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n });\n disposers.push(dispose);\n } else {\n setSingleAttribute(el, key, value);\n }\n }\n\n return disposers;\n}\n\n/**\n * Set a single attribute/property on a DOM element.\n */\nfunction setSingleAttribute(el: Element, key: string, value: unknown): void {\n // Resolve alias\n const attrName = PROP_ALIASES[key] ?? key;\n\n // Handle style objects\n if (attrName === \"style\" && typeof value === \"object\" && value !== null) {\n applyStyle(el as HTMLElement, value as Record<string, string>);\n return;\n }\n\n // Handle class arrays/objects\n if (attrName === \"class\" && typeof value === \"object\" && value !== null) {\n applyClass(el, value);\n return;\n }\n\n // Handle null/undefined/false — remove attribute\n if (value == null || value === false) {\n domOps.removeAttribute(el, attrName);\n // Also clear the property if it's a DOM property\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, attrName === \"value\" ? \"\" : false);\n }\n return;\n }\n\n // Handle boolean true — set as attribute name only\n if (value === true) {\n domOps.setAttribute(el, attrName, \"\");\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, true);\n }\n return;\n }\n\n // DOM properties — set directly on the element\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, value);\n return;\n }\n\n // Default — set as string attribute\n domOps.setAttribute(el, attrName, String(value));\n}\n\n/**\n * Apply a style object to an element.\n */\nfunction applyStyle(el: HTMLElement, styles: Record<string, string>): void {\n for (const [prop, val] of Object.entries(styles)) {\n // Convert camelCase to kebab-case for style.setProperty\n if (prop.includes(\"-\")) {\n el.style.setProperty(prop, val);\n } else {\n (el.style as any)[prop] = val;\n }\n }\n}\n\n/**\n * Apply class value — supports string, array, or object notation.\n */\nfunction applyClass(el: Element, value: unknown): void {\n let classStr: string;\n\n if (Array.isArray(value)) {\n // [\"foo\", \"bar\", false && \"baz\"] → \"foo bar\"\n classStr = value.filter(Boolean).join(\" \");\n } else if (typeof value === \"object\" && value !== null) {\n // { foo: true, bar: false } → \"foo\"\n classStr = Object.entries(value)\n .filter(([, v]) => Boolean(v))\n .map(([k]) => k)\n .join(\" \");\n } else {\n classStr = String(value);\n }\n\n domOps.setAttribute(el, \"class\", classStr);\n}\n",
14
+ "import type { Reactive, SinwanElement, SinwanNode } from \"../types.ts\";\n\nexport const SHOW_TYPE = Symbol.for(\"Sinwan.Show\");\nexport const FOR_TYPE = Symbol.for(\"Sinwan.For\");\n\nexport interface ShowProps<T> {\n when: Reactive<T | false | null | undefined>;\n fallback?: SinwanNode;\n children?: SinwanNode | ((value: NonNullable<T>) => SinwanNode);\n}\n\nexport interface ForProps<T> {\n each: Reactive<readonly T[]>;\n key?: (item: T, index: number) => string | number | symbol;\n children?: (item: T, index: () => number) => SinwanNode;\n}\n\nexport function Show<T>(props: ShowProps<T>): SinwanElement {\n return {\n tag: SHOW_TYPE,\n props: props as unknown as Record<string, unknown>,\n children: [],\n };\n}\n\nexport function For<T>(props: ForProps<T>): SinwanElement {\n return {\n tag: FOR_TYPE,\n props: props as unknown as Record<string, unknown>,\n children: [],\n };\n}\n\nexport function isShowElement(element: SinwanElement): boolean {\n return element.tag === SHOW_TYPE;\n}\n\nexport function isForElement(element: SinwanElement): boolean {\n return element.tag === FOR_TYPE;\n}\n",
15
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Unmount helpers\n *\n * Shared cleanup and DOM removal utilities used by mount(), reactive blocks,\n * and future renderer entrypoints.\n */\n\nimport type { MountedNode } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { fireUnmountedHooks } from \"../component/instance.ts\";\n\n/**\n * Return the actual DOM nodes owned by a mounted tree, in document order.\n */\nexport function getMountedDomNodes(node: MountedNode): Node[] {\n switch (node.type) {\n case \"text\":\n case \"reactive-text\":\n return [node.node];\n\n case \"element\":\n return [node.node];\n\n case \"fragment\":\n return [\n node.anchor,\n ...node.children.flatMap((child) => getMountedDomNodes(child)),\n ];\n\n case \"reactive-block\":\n return [\n node.startAnchor,\n ...node.children.flatMap((child) => getMountedDomNodes(child)),\n node.endAnchor,\n ];\n\n case \"component\":\n return node.children.flatMap((child) => getMountedDomNodes(child));\n }\n}\n\n/**\n * Recursively unmount a node tree — disposes effects, removes events and refs.\n */\nexport function unmountNode(node: MountedNode): void {\n switch (node.type) {\n case \"text\":\n break;\n\n case \"reactive-text\":\n node.dispose();\n break;\n\n case \"element\":\n for (const dispose of node.attrDisposers) {\n dispose();\n }\n for (const cleanup of node.eventCleanups) {\n cleanup();\n }\n node.refCleanup?.();\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"fragment\":\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"reactive-block\":\n node.dispose();\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"component\":\n if (node.instance) {\n fireUnmountedHooks(node.instance);\n } else {\n for (const dispose of node.disposers) {\n dispose();\n }\n }\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n }\n}\n\n/**\n * Unmount a mounted tree and remove every DOM node it owns.\n */\nexport function removeMountedNode(node: MountedNode): void {\n const domNodes = getMountedDomNodes(node);\n unmountNode(node);\n for (const domNode of domNodes) {\n if (domNode.parentNode) {\n domOps.remove(domNode);\n }\n }\n}\n",
16
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Reactive control-flow blocks\n *\n * `<Show>` and `<For>` render between stable comment anchors. Updates remove,\n * move, or insert only the block-owned DOM nodes.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { MountedNode, MountedReactiveBlock } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport {\n getCurrentInstance,\n fireMountedHooks,\n queueUpdatedHooks,\n withInstance,\n type ComponentInstance,\n} from \"../component/instance.ts\";\nimport { isForElement, isShowElement } from \"../component/control-flow.ts\";\nimport {\n getMountedDomNodes,\n removeMountedNode,\n} from \"./unmount.ts\";\nimport { renderNodeToDOM } from \"./render-children.ts\";\n\ninterface ForRecord<T> {\n key: unknown;\n item: T;\n index: number;\n mounted: MountedNode;\n}\n\n/**\n * Render a Show/For element to a reactive block.\n */\nexport function renderControlFlowToDOM(\n element: SinwanElement,\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedReactiveBlock {\n const startAnchor = domOps.createComment(\"Sinwan-b\");\n const endAnchor = domOps.createComment(\"/Sinwan-b\");\n insertNode(parent, startAnchor, anchor);\n insertNode(parent, endAnchor, anchor);\n\n const owner = getCurrentInstance();\n let disposeEffect = () => {};\n\n const block: MountedReactiveBlock = {\n type: \"reactive-block\",\n dispose: () => disposeEffect(),\n children: [],\n startAnchor,\n endAnchor,\n };\n\n if (isShowElement(element)) {\n disposeEffect = renderShowBlock(element, block, parent, namespace, owner);\n } else if (isForElement(element)) {\n disposeEffect = renderForBlock(element, block, parent, namespace, owner);\n }\n\n return block;\n}\n\nfunction renderShowBlock(\n element: SinwanElement,\n block: MountedReactiveBlock,\n parent: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): () => void {\n let initialized = false;\n\n return effect(() => {\n clearChildren(block);\n\n const when = readReactive((element.props as any).when);\n const content = withOptionalInstance(owner, () =>\n when ? resolveShowChildren(element, when) : (element.props as any).fallback,\n );\n\n block.children = renderBlockContent(\n content,\n parent,\n block.endAnchor,\n namespace,\n owner,\n );\n\n if (initialized) {\n fireMountedAndQueueUpdated(owner);\n }\n initialized = true;\n });\n}\n\nfunction renderForBlock<T>(\n element: SinwanElement,\n block: MountedReactiveBlock,\n parent: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): () => void {\n let initialized = false;\n let records: ForRecord<T>[] = [];\n\n return effect(() => {\n const props = element.props as {\n each?: unknown;\n key?: (item: T, index: number) => string | number | symbol;\n children?: (item: T, index: () => number) => SinwanNode;\n };\n const items = readReactive(props.each) as readonly T[] | null | undefined;\n const list = Array.isArray(items) ? items : [];\n const renderChild = props.children;\n\n if (typeof renderChild !== \"function\") {\n clearChildren(block);\n records = [];\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n return;\n }\n\n const oldByKey = new Map<unknown, ForRecord<T>>();\n for (const record of records) {\n oldByKey.set(record.key, record);\n }\n\n const nextRecords: ForRecord<T>[] = [];\n\n list.forEach((item, index) => {\n const key = props.key ? props.key(item, index) : item;\n const old = oldByKey.get(key);\n\n if (old && old.item === item) {\n old.index = index;\n moveBeforeEnd(parent, old.mounted, block.endAnchor);\n nextRecords.push(old);\n oldByKey.delete(key);\n return;\n }\n\n if (old) {\n removeMountedNode(old.mounted);\n oldByKey.delete(key);\n }\n\n const record: ForRecord<T> = {\n key,\n item,\n index,\n mounted: { type: \"text\", node: domOps.createTextNode(\"\") },\n };\n\n record.mounted = withOptionalInstance(owner, () =>\n renderNodeToDOM(\n renderChild(item, () => record.index),\n parent,\n block.endAnchor,\n namespace,\n ),\n );\n nextRecords.push(record);\n });\n\n for (const record of oldByKey.values()) {\n removeMountedNode(record.mounted);\n }\n\n records = nextRecords;\n block.children = nextRecords.map((record) => record.mounted);\n\n if (initialized) {\n fireMountedAndQueueUpdated(owner);\n }\n initialized = true;\n });\n}\n\nfunction resolveShowChildren(element: SinwanElement, value: unknown): SinwanNode {\n const children = (element.props as any).children ?? element.children;\n if (typeof children === \"function\") {\n return children(value);\n }\n return children as SinwanNode;\n}\n\nfunction renderBlockContent(\n content: unknown,\n parent: Node,\n anchor: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): MountedNode[] {\n if (content == null || typeof content === \"boolean\") {\n return [];\n }\n\n const nodes = Array.isArray(content) ? content : [content];\n return nodes.map((node) =>\n withOptionalInstance(owner, () =>\n renderNodeToDOM(node as SinwanNode, parent, anchor, namespace),\n ),\n );\n}\n\nfunction clearChildren(block: MountedReactiveBlock): void {\n for (const child of block.children) {\n removeMountedNode(child);\n }\n block.children = [];\n}\n\nfunction moveBeforeEnd(parent: Node, mounted: MountedNode, endAnchor: Node): void {\n for (const node of getMountedDomNodes(mounted)) {\n domOps.insertBefore(parent, node, endAnchor);\n }\n}\n\nfunction fireMountedAndQueueUpdated(owner: ComponentInstance | null): void {\n if (owner) {\n fireMountedHooks(owner);\n }\n queueUpdatedHooks(owner);\n}\n\nfunction withOptionalInstance<T>(\n owner: ComponentInstance | null,\n fn: () => T,\n): T {\n return owner ? withInstance(owner, fn) : fn();\n}\n\nfunction readReactive(value: unknown): unknown {\n return isSignal(value) || isComputed(value) ? (value as any).value : value;\n}\n\nfunction insertNode(parent: Node, child: Node, anchor: Node | null): void {\n if (anchor) {\n domOps.insertBefore(parent, child, anchor);\n } else {\n domOps.appendChild(parent, child);\n }\n}\n",
17
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Element Rendering\n *\n * Converts SinwanElement trees into live DOM nodes.\n * Handles intrinsic HTML elements, functional components, and fragments.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { MountedNode, MountedElement, MountedComponent } from \"./types.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { applyAttributes } from \"./attributes.ts\";\nimport { bindEvents } from \"./events.ts\";\nimport { renderChildrenToDOM, renderNodeToDOM } from \"./render-children.ts\";\nimport { Fragment } from \"../jsx/jsx-runtime.ts\";\nimport { For, isForElement, isShowElement, Show } from \"../component/control-flow.ts\";\nimport { renderControlFlowToDOM } from \"./render-control-flow.ts\";\nimport {\n createComponentInstance,\n getCurrentInstance,\n setCurrentInstance,\n handleComponentError,\n type ComponentInstance,\n} from \"../component/instance.ts\";\n\n// Void elements — no children, self-closing\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst MATH_NS = \"http://www.w3.org/1998/Math/MathML\";\n\n/**\n * Render an SinwanElement to DOM and insert into parent.\n */\nexport function renderElementToDOM(\n element: SinwanElement,\n parent: Node,\n anchor: Node | null = null,\n namespace: string | null = null,\n): MountedNode {\n const { tag, props, children } = element;\n\n // Fragment — render children directly into parent\n if (tag === \"\" || (tag as any) === Fragment) {\n return renderFragmentToDOM(children, parent, anchor, namespace);\n }\n\n // Built-in control-flow components should belong to the current owner,\n // not create their own component instance.\n if (tag === Show || tag === For) {\n return renderElementToDOM((tag as Function)(props), parent, anchor, namespace);\n }\n\n if (isShowElement(element) || isForElement(element)) {\n return renderControlFlowToDOM(element, parent, anchor, namespace);\n }\n\n // Functional component — call it and render the result\n if (typeof tag === \"function\") {\n return renderComponentToDOM(tag, props, parent, anchor, namespace);\n }\n\n // Intrinsic HTML element\n if (typeof tag === \"string\") {\n return renderIntrinsicToDOM(tag, props, children, parent, anchor, namespace);\n }\n\n // Fallback — render children\n return renderFragmentToDOM(children, parent, anchor, namespace);\n}\n\n/**\n * Render an intrinsic HTML element (<div>, <p>, <button>, etc.).\n */\nfunction renderIntrinsicToDOM(\n tag: string,\n props: Record<string, unknown>,\n children: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n parentNamespace: string | null,\n): MountedElement {\n const namespace = getElementNamespace(tag, parentNamespace);\n const el = namespace\n ? domOps.createElementNS(namespace, tag)\n : domOps.createElement(tag);\n\n // Apply attributes (returns disposers for reactive attrs)\n const attrDisposers = applyAttributes(el, props);\n\n // Bind event handlers\n const eventCleanups = bindEvents(el, props);\n\n // Render children (unless void element)\n let mountedChildren: MountedNode[] = [];\n if (!VOID_ELEMENTS.has(tag)) {\n // Handle dangerouslySetInnerHTML\n const dangerous = props.dangerouslySetInnerHTML as\n | { __html?: string }\n | undefined;\n if (dangerous && typeof dangerous.__html === \"string\") {\n (el as HTMLElement).innerHTML = dangerous.__html;\n } else {\n mountedChildren = renderChildrenToDOM(\n children,\n el,\n getChildNamespace(tag, namespace),\n );\n }\n }\n\n // Insert into parent\n if (anchor) {\n domOps.insertBefore(parent, el, anchor);\n } else {\n domOps.appendChild(parent, el);\n }\n\n const refCleanup = applyRef(el, props.ref);\n\n return {\n type: \"element\",\n node: el,\n children: mountedChildren,\n eventCleanups,\n attrDisposers,\n refCleanup,\n };\n}\n\n/**\n * Render a functional component.\n *\n * Creates a ComponentInstance, sets it as the active instance during\n * setup so lifecycle hooks (onMounted, etc.) register on it, then\n * renders the returned element tree.\n */\nfunction renderComponentToDOM(\n component: Function,\n props: Record<string, unknown>,\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedComponent {\n // Create instance with parent context\n const parentInstance = getCurrentInstance();\n const instance = createComponentInstance(\n component as any,\n props,\n parentInstance,\n );\n\n // Register as child of parent\n if (parentInstance) {\n parentInstance.children.push(instance);\n }\n\n // Set this instance as current during BOTH setup AND rendering,\n // so nested child components discover it as their parent.\n const prevInstance = setCurrentInstance(instance);\n\n let result: any;\n let child: MountedNode;\n\n try {\n result = component(props);\n\n // Render the returned element tree (still under this instance)\n if (result && typeof result === \"object\" && \"tag\" in result) {\n child = renderElementToDOM(result as SinwanElement, parent, anchor, namespace);\n } else {\n child = renderNodeToDOM(result as SinwanNode, parent, anchor, namespace);\n }\n } catch (err) {\n // Restore parent before error handling\n setCurrentInstance(prevInstance);\n handleComponentError(instance, err as Error);\n // Return empty placeholder on error\n const text = domOps.createTextNode(\"\");\n if (anchor) {\n domOps.insertBefore(parent, text, anchor);\n } else {\n domOps.appendChild(parent, text);\n }\n return {\n type: \"component\",\n children: [{ type: \"text\", node: text }],\n disposers: [],\n instance,\n };\n }\n\n // Restore parent instance\n setCurrentInstance(prevInstance);\n\n instance.element = child;\n\n return {\n type: \"component\",\n children: [child],\n disposers: instance.effects,\n instance,\n };\n}\n\n/**\n * Render children as a fragment (no wrapper element).\n */\nfunction renderFragmentToDOM(\n children: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedNode {\n const anchorComment = domOps.createComment(\"Sinwan-f\");\n if (anchor) {\n domOps.insertBefore(parent, anchorComment, anchor);\n } else {\n domOps.appendChild(parent, anchorComment);\n }\n\n const mounted: MountedNode[] = [];\n for (const child of children) {\n mounted.push(renderNodeToDOM(child, parent, anchor, namespace));\n }\n\n return { type: \"fragment\", children: mounted, anchor: anchorComment };\n}\n\nfunction getElementNamespace(tag: string, parentNamespace: string | null): string | null {\n if (tag === \"svg\") return SVG_NS;\n if (tag === \"math\") return MATH_NS;\n return parentNamespace;\n}\n\nfunction getChildNamespace(tag: string, namespace: string | null): string | null {\n if (namespace === SVG_NS && tag === \"foreignObject\") {\n return null;\n }\n return namespace;\n}\n\ntype RefValue =\n | ((el: Element | null) => void)\n | { current: Element | null }\n | null\n | undefined;\n\nfunction applyRef(el: Element, ref: unknown): CleanupFn | null {\n const value = ref as RefValue;\n if (!value) {\n return null;\n }\n\n if (typeof value === \"function\") {\n value(el);\n return () => value(null);\n }\n\n if (typeof value === \"object\" && \"current\" in value) {\n value.current = el;\n return () => {\n value.current = null;\n };\n }\n\n return null;\n}\n",
18
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Child Rendering\n *\n * Renders SinwanNode children to DOM nodes. Handles primitives,\n * elements, arrays, signals, and fragments.\n */\n\nimport type { SinwanNode } from \"../types.ts\";\nimport type { MountedNode } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport { renderElementToDOM } from \"./render-element.ts\";\nimport { HtmlEscapedString } from \"../jsx/jsx-runtime.ts\";\nimport {\n getCurrentInstance,\n queueUpdatedHooks,\n} from \"../component/instance.ts\";\n\n/**\n * Render a single SinwanNode to DOM and append to parent.\n * Returns the MountedNode descriptor for cleanup/unmount.\n */\nexport function renderNodeToDOM(\n node: SinwanNode,\n parent: Node,\n anchor: Node | null = null,\n namespace: string | null = null,\n): MountedNode {\n // null/undefined/boolean → empty text node (placeholder)\n if (node == null || typeof node === \"boolean\") {\n const text = domOps.createTextNode(\"\");\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // String\n if (typeof node === \"string\") {\n const text = domOps.createTextNode(node);\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Number\n if (typeof node === \"number\") {\n const text = domOps.createTextNode(String(node));\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Pre-escaped HTML string\n if (node instanceof HtmlEscapedString) {\n const text = domOps.createTextNode(node.value);\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Signal or Computed → reactive text node\n if (isSignal(node) || isComputed(node)) {\n const text = domOps.createTextNode(String(node.value));\n insertNode(parent, text, anchor);\n const owner = getCurrentInstance();\n let initialized = false;\n const dispose = effect(() => {\n domOps.setTextContent(text, String((node as any).value));\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n });\n return { type: \"reactive-text\", node: text, dispose };\n }\n\n // Array → fragment\n if (Array.isArray(node)) {\n return renderArrayToDOM(node, parent, anchor, namespace);\n }\n\n // Promise → placeholder (resolved async)\n if (node instanceof Promise) {\n const placeholder = domOps.createTextNode(\"\");\n insertNode(parent, placeholder, anchor);\n // TODO: async component support (Phase 3+)\n node.then((resolved) => {\n const mounted = renderNodeToDOM(resolved, parent, placeholder, namespace);\n domOps.remove(placeholder);\n });\n return { type: \"text\", node: placeholder };\n }\n\n // SinwanElement\n if (typeof node === \"object\" && \"tag\" in node) {\n return renderElementToDOM(node, parent, anchor, namespace);\n }\n\n // Fallback — coerce to string\n const text = domOps.createTextNode(String(node));\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n}\n\n/**\n * Render an array of children to DOM as a fragment.\n */\nfunction renderArrayToDOM(\n nodes: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedNode {\n const anchorComment = domOps.createComment(\"Sinwan-f\");\n insertNode(parent, anchorComment, anchor);\n\n const children: MountedNode[] = [];\n for (const child of nodes) {\n children.push(renderNodeToDOM(child, parent, anchor, namespace));\n }\n\n return { type: \"fragment\", children, anchor: anchorComment };\n}\n\n/**\n * Render multiple children into a parent element.\n * Returns array of MountedNode descriptors.\n */\nexport function renderChildrenToDOM(\n children: SinwanNode[],\n parent: Node,\n namespace: string | null = null,\n): MountedNode[] {\n const mounted: MountedNode[] = [];\n for (const child of children) {\n mounted.push(renderNodeToDOM(child, parent, null, namespace));\n }\n return mounted;\n}\n\n/**\n * Insert a node into parent, optionally before an anchor.\n */\nfunction insertNode(parent: Node, child: Node, anchor: Node | null): void {\n if (anchor) {\n domOps.insertBefore(parent, child, anchor);\n } else {\n domOps.appendChild(parent, child);\n }\n}\n",
19
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Mount\n *\n * Entry point for rendering a component tree into a DOM container.\n * Returns an AppInstance handle for unmounting.\n */\n\nimport type { SinwanComponent, SinwanNode, SinwanElement } from \"../types.ts\";\nimport type { AppInstance, MountedNode } from \"./types.ts\";\nimport { renderNodeToDOM } from \"./render-children.ts\";\nimport { renderElementToDOM } from \"./render-element.ts\";\nimport { unmountNode } from \"./unmount.ts\";\nimport {\n createComponentInstance,\n setCurrentInstance,\n fireMountedHooks,\n fireUnmountedHooks,\n handleComponentError,\n} from \"../component/instance.ts\";\n\n/**\n * Mount a component into a DOM container.\n *\n * Creates a root ComponentInstance, runs setup with lifecycle hooks,\n * renders to DOM, then fires onMounted hooks (bottom-up).\n *\n * @example\n * const app = mount(Counter, document.getElementById(\"app\")!, { initial: 0 });\n * // later...\n * app.unmount();\n */\nexport function mount(\n component: SinwanComponent<any>,\n container: Element,\n props?: Record<string, unknown>,\n): AppInstance {\n // Clear the container\n container.innerHTML = \"\";\n\n const mergedProps = props ?? {};\n\n // Create root component instance\n const instance = createComponentInstance(component, mergedProps, null);\n\n let result: any;\n let root: MountedNode;\n\n // Set instance as current for BOTH setup AND rendering,\n // so child components can discover their parent.\n setCurrentInstance(instance);\n\n try {\n result = component(mergedProps);\n\n if (result instanceof Promise) {\n // Async component — render placeholder, then swap\n const placeholder = document.createTextNode(\"\");\n container.appendChild(placeholder);\n root = { type: \"text\", node: placeholder };\n\n result.then((resolved) => {\n container.innerHTML = \"\";\n setCurrentInstance(instance);\n root = renderElementToDOM(resolved, container);\n setCurrentInstance(null);\n instance.element = root;\n fireMountedHooks(instance);\n });\n } else if (result && typeof result === \"object\" && \"tag\" in result) {\n root = renderElementToDOM(result, container);\n } else {\n root = renderNodeToDOM(result as SinwanNode, container);\n }\n } catch (err) {\n setCurrentInstance(null);\n handleComponentError(instance, err as Error);\n return {\n root: { type: \"text\", node: document.createTextNode(\"\") },\n unmount() {},\n };\n }\n\n // Restore — no instance is current at the top level\n setCurrentInstance(null);\n\n instance.element = root;\n\n // Fire onMounted hooks (bottom-up: children first, then parent)\n fireMountedHooks(instance);\n\n return {\n root,\n unmount() {\n // Fire onUnmounted hooks and dispose all effects\n fireUnmountedHooks(instance);\n // Clean up DOM tree\n unmountNode(root);\n container.innerHTML = \"\";\n },\n };\n}\n\n/**\n * Render a raw SinwanElement or SinwanNode tree into a container.\n * Lower-level than mount() — doesn't call a component function.\n */\nexport function render(node: SinwanNode, container: Element): AppInstance {\n container.innerHTML = \"\";\n\n const root = renderNodeToDOM(node, container);\n\n return {\n root,\n unmount() {\n unmountNode(root);\n container.innerHTML = \"\";\n },\n };\n}\n\nexport { unmountNode } from \"./unmount.ts\";\n"
20
+ ],
21
+ "mappings": "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",
22
+ "debugId": "80EB7FDFA686DCB664756E2164756E21",
23
+ "names": []
24
+ }
@@ -0,0 +1,3 @@
1
+ var{defineProperty:a,getOwnPropertyNames:kY,getOwnPropertyDescriptor:vY}=Object,fY=Object.prototype.hasOwnProperty;function hY(Y){return this[Y]}var GY=(Y)=>{var W=(QY??=new WeakMap).get(Y),J;if(W)return W;if(W=a({},"__esModule",{value:!0}),Y&&typeof Y==="object"||typeof Y==="function"){for(var X of kY(Y))if(!fY.call(W,X))a(W,X,{get:hY.bind(Y,X),enumerable:!(J=vY(Y,X))||J.enumerable})}return QY.set(Y,W),W},QY;var uY=(Y)=>Y;function mY(Y,W){this[Y]=uY.bind(null,W)}var jY=(Y,W)=>{for(var J in W)a(Y,J,{get:W[J],enumerable:!0,configurable:!0,set:mY.bind(W,J)})};var dY={};jY(dY,{raw:()=>iY,jsxs:()=>lY,jsxDEV:()=>sY,jsx:()=>pY,HtmlEscapedString:()=>C,Fragment:()=>k});module.exports=GY(dY);var k=Symbol("Fragment");class C extends String{value;constructor(Y){super(Y);this.value=Y}toString(){return this.value}}var iY=(Y)=>new C(Y);function g(Y){if(Y==null||typeof Y==="boolean")return[];if(Array.isArray(Y))return Y.flat(1/0);return[Y]}function t(Y,W,J){if(Y===k)return{tag:"",props:{},children:J};if(typeof Y==="function"||typeof Y==="string"){let X=W??{};if(J.length>0&&X.children===void 0)X.children=J.length===1?J[0]:J;return{tag:Y,props:X,children:J}}return{tag:"",props:{},children:J}}function pY(Y,W,J){return t(Y,W,g(W?.children))}function lY(Y,W,J){let X=W?.children;return t(Y,W,Array.isArray(X)?X.flat(1/0):g(X))}function sY(Y,W,J,X,Z,$){let G=X?Array.isArray(W?.children)?W.children.flat(1/0):g(W?.children):g(W?.children),j=t(Y,W,G);if(Z)j.__source=Z;return j}var zW={};jY(zW,{unmountNode:()=>_,toEventName:()=>YY,setDOMOps:()=>LY,resetDOMOps:()=>qY,renderNodeToDOM:()=>L,renderElementToDOM:()=>z,renderChildrenToDOM:()=>c,render:()=>gY,mount:()=>OY,isEventProp:()=>N,domOps:()=>Q,bindEvents:()=>u,bindEvent:()=>WY,applyAttributes:()=>p});module.exports=GY(zW);function cY(){return{createElement(Y){return document.createElement(Y)},createElementNS(Y,W){return document.createElementNS(Y,W)},createTextNode(Y){return document.createTextNode(Y)},createComment(Y){return document.createComment(Y)},setAttribute(Y,W,J){Y.setAttribute(W,J)},removeAttribute(Y,W){Y.removeAttribute(W)},setProperty(Y,W,J){Y[W]=J},insertBefore(Y,W,J){Y.insertBefore(W,J)},appendChild(Y,W){Y.appendChild(W)},remove(Y){Y.parentNode?.removeChild(Y)},setTextContent(Y,W){Y.data=W},addEventListener(Y,W,J){Y.addEventListener(W,J)},removeEventListener(Y,W,J){Y.removeEventListener(W,J)},parentNode(Y){return Y.parentNode},nextSibling(Y){return Y.nextSibling}}}var KY=cY(),Q={...KY};function LY(Y){Object.assign(Q,Y)}function qY(){for(let Y of Object.keys(Q))delete Q[Y];Object.assign(Q,KY)}var A=new Set,w=!1,n=!1,VY=[];function FY(Y){if(!Y.active)return;A.add(Y),rY()}function _Y(Y){A.delete(Y)}function rY(){if(!w)w=!0,queueMicrotask(zY)}function zY(){n=!0;let Y=[...A].sort((X,Z)=>X.id-Z.id);A.clear();for(let X of Y)if(X.active)X.run();let W=10;while(A.size>0&&W-- >0){let X=[...A].sort((Z,$)=>Z.id-$.id);A.clear();for(let Z of X)if(Z.active)Z.run()}w=!1,n=!1;let J=VY.splice(0);for(let X of J)X()}function BY(Y){return new Promise((W)=>{let J=()=>{Y?.(),W()};if(w||n)VY.push(J);else queueMicrotask(J)})}function UW(){if(w)w=!1,zY()}var b=null,e=[],oY=0;class v{id;active=!0;fn;cleanup=void 0;deps=new Set;constructor(Y){this.id=oY++,this.fn=Y}run(){if(!this.active)return;if(e.includes(this))return;if(this.cleanupDeps(),this.cleanup)this.cleanup(),this.cleanup=void 0;e.push(this);let Y=b;b=this;try{let W=this.fn();if(typeof W==="function")this.cleanup=W}finally{b=Y,e.pop()}}cleanupDeps(){for(let Y of this.deps)Y.subscribers.delete(this);this.deps.clear()}notify(){FY(this)}dispose(){if(!this.active)return;if(this.active=!1,this.cleanup)this.cleanup(),this.cleanup=void 0;this.cleanupDeps(),_Y(this)}}function x(Y){let W=new v(Y);return W.run(),()=>W.dispose()}function f(Y){if(b)Y.subscribers.add(b),b.deps.add(Y)}function h(Y){let W=[...Y.subscribers];for(let J of W)J.notify()}var PY=Symbol("Sinwan:signal");class UY{[PY]=!0;subscribers=new Set;_value;_manualSubs=new Set;constructor(Y){this._value=Y}get value(){return f(this),this._value}set value(Y){if(Object.is(this._value,Y))return;this._value=Y,h(this);for(let W of this._manualSubs)W(Y)}peek(){return this._value}subscribe(Y){return this._manualSubs.add(Y),()=>{this._manualSubs.delete(Y)}}toString(){return String(this.value)}valueOf(){return this.value}}function xW(Y){return new UY(Y)}function I(Y){return Y!=null&&typeof Y==="object"&&PY in Y}var HY=Symbol("Sinwan:computed");class TY{[HY]=!0;subscribers=new Set;_value;_dirty=!0;_effect;constructor(Y){let W=this;this._effect=new v(()=>{W._value=Y()}),this._effect.notify=function(){if(!W._dirty)W._dirty=!0,h(W)},this._effect.run(),this._dirty=!1}get value(){if(f(this),this._dirty)this._effect.run(),this._dirty=!1;return this._value}peek(){if(this._dirty)this._effect.run(),this._dirty=!1;return this._value}toString(){return String(this.value)}valueOf(){return this.value}}function bW(Y){return new TY(Y)}function D(Y){return Y!=null&&typeof Y==="object"&&HY in Y}function N(Y){return Y.length>2&&Y[0]==="o"&&Y[1]==="n"&&Y[2]>="A"&&Y[2]<="Z"}function YY(Y){return Y.slice(2).toLowerCase()}function WY(Y,W,J){return Q.addEventListener(Y,W,J),()=>{Q.removeEventListener(Y,W,J)}}function u(Y,W){let J=[];for(let X of Object.keys(W))if(N(X)){let Z=W[X];if(typeof Z==="function"){let $=YY(X);J.push(WY(Y,$,Z))}}return J}var aY=0;function m(Y,W,J){return{uid:aY++,component:Y,props:W,element:null,parent:J,children:[],effects:[],_mountedHooks:[],_unmountedHooks:[],_updatedHooks:[],_errorHooks:[],provides:J?Object.create(J.provides):Object.create(null),isMounted:!1,isUnmounted:!1}}var XY=null;function U(){return XY}function V(Y){let W=XY;return XY=Y,W}function RY(Y,W){let J=V(Y);try{return W()}finally{V(J)}}function M(Y){if(Y.isUnmounted)return;for(let W of Y.children)M(W);if(!Y.isMounted){Y.isMounted=!0;for(let W of Y._mountedHooks)W()}}function y(Y){for(let W of Y.children)y(W);if(Y.isMounted&&!Y.isUnmounted){Y.isUnmounted=!0,Y.isMounted=!1;for(let W of Y._unmountedHooks)W();for(let W of Y.effects)W();Y.effects.length=0}}function tY(Y){for(let W of Y._updatedHooks)W()}var JY=new Set;function S(Y){if(!Y||!Y.isMounted||Y.isUnmounted||Y._updatedHooks.length===0||JY.has(Y))return;JY.add(Y),BY(()=>{if(JY.delete(Y),Y.isMounted&&!Y.isUnmounted)tY(Y)})}function i(Y,W){let J=Y;while(J){if(J._errorHooks.length>0){for(let X of J._errorHooks)X(W);return}J=J.parent}console.error("[Sinwan] Unhandled component error:",W)}var nY=new Set(["children","key","ref","dangerouslySetInnerHTML"]),ZY=new Set(["value","checked","selected","disabled","readOnly","multiple","indeterminate"]),eY={className:"class",htmlFor:"for",tabIndex:"tabindex",crossOrigin:"crossorigin"};function p(Y,W){let J=[],X=U();for(let[Z,$]of Object.entries(W)){if(nY.has(Z)||N(Z))continue;if(I($)||D($)){let G=!1,j=x(()=>{if(AY(Y,Z,$.value),G)S(X);G=!0});J.push(j)}else AY(Y,Z,$)}return J}function AY(Y,W,J){let X=eY[W]??W;if(X==="style"&&typeof J==="object"&&J!==null){YW(Y,J);return}if(X==="class"&&typeof J==="object"&&J!==null){WW(Y,J);return}if(J==null||J===!1){if(Q.removeAttribute(Y,X),ZY.has(X))Q.setProperty(Y,X,X==="value"?"":!1);return}if(J===!0){if(Q.setAttribute(Y,X,""),ZY.has(X))Q.setProperty(Y,X,!0);return}if(ZY.has(X)){Q.setProperty(Y,X,J);return}Q.setAttribute(Y,X,String(J))}function YW(Y,W){for(let[J,X]of Object.entries(W))if(J.includes("-"))Y.style.setProperty(J,X);else Y.style[J]=X}function WW(Y,W){let J;if(Array.isArray(W))J=W.filter(Boolean).join(" ");else if(typeof W==="object"&&W!==null)J=Object.entries(W).filter(([,X])=>Boolean(X)).map(([X])=>X).join(" ");else J=String(W);Q.setAttribute(Y,"class",J)}var xY=Symbol.for("Sinwan.Show"),SY=Symbol.for("Sinwan.For");function wY(Y){return{tag:xY,props:Y,children:[]}}function bY(Y){return{tag:SY,props:Y,children:[]}}function l(Y){return Y.tag===xY}function s(Y){return Y.tag===SY}function E(Y){switch(Y.type){case"text":case"reactive-text":return[Y.node];case"element":return[Y.node];case"fragment":return[Y.anchor,...Y.children.flatMap((W)=>E(W))];case"reactive-block":return[Y.startAnchor,...Y.children.flatMap((W)=>E(W)),Y.endAnchor];case"component":return Y.children.flatMap((W)=>E(W))}}function _(Y){switch(Y.type){case"text":break;case"reactive-text":Y.dispose();break;case"element":for(let W of Y.attrDisposers)W();for(let W of Y.eventCleanups)W();Y.refCleanup?.();for(let W of Y.children)_(W);break;case"fragment":for(let W of Y.children)_(W);break;case"reactive-block":Y.dispose();for(let W of Y.children)_(W);break;case"component":if(Y.instance)y(Y.instance);else for(let W of Y.disposers)W();for(let W of Y.children)_(W);break}}function d(Y){let W=E(Y);_(Y);for(let J of W)if(J.parentNode)Q.remove(J)}function DY(Y,W,J,X){let Z=Q.createComment("Sinwan-b"),$=Q.createComment("/Sinwan-b");IY(W,Z,J),IY(W,$,J);let G=U(),j=()=>{},K={type:"reactive-block",dispose:()=>j(),children:[],startAnchor:Z,endAnchor:$};if(l(Y))j=JW(Y,K,W,X,G);else if(s(Y))j=XW(Y,K,W,X,G);return K}function JW(Y,W,J,X,Z){let $=!1;return x(()=>{MY(W);let G=CY(Y.props.when),j=$Y(Z,()=>G?ZW(Y,G):Y.props.fallback);if(W.children=$W(j,J,W.endAnchor,X,Z),$)EY(Z);$=!0})}function XW(Y,W,J,X,Z){let $=!1,G=[];return x(()=>{let j=Y.props,K=CY(j.each),B=Array.isArray(K)?K:[],T=j.children;if(typeof T!=="function"){if(MY(W),G=[],$)S(Z);$=!0;return}let F=new Map;for(let q of G)F.set(q.key,q);let P=[];B.forEach((q,r)=>{let O=j.key?j.key(q,r):q,R=F.get(O);if(R&&R.item===q){R.index=r,QW(J,R.mounted,W.endAnchor),P.push(R),F.delete(O);return}if(R)d(R.mounted),F.delete(O);let o={key:O,item:q,index:r,mounted:{type:"text",node:Q.createTextNode("")}};o.mounted=$Y(Z,()=>L(T(q,()=>o.index),J,W.endAnchor,X)),P.push(o)});for(let q of F.values())d(q.mounted);if(G=P,W.children=P.map((q)=>q.mounted),$)EY(Z);$=!0})}function ZW(Y,W){let J=Y.props.children??Y.children;if(typeof J==="function")return J(W);return J}function $W(Y,W,J,X,Z){if(Y==null||typeof Y==="boolean")return[];return(Array.isArray(Y)?Y:[Y]).map((G)=>$Y(Z,()=>L(G,W,J,X)))}function MY(Y){for(let W of Y.children)d(W);Y.children=[]}function QW(Y,W,J){for(let X of E(W))Q.insertBefore(Y,X,J)}function EY(Y){if(Y)M(Y);S(Y)}function $Y(Y,W){return Y?RY(Y,W):W()}function CY(Y){return I(Y)||D(Y)?Y.value:Y}function IY(Y,W,J){if(J)Q.insertBefore(Y,W,J);else Q.appendChild(Y,W)}var GW=new Set(["area","base","br","col","embed","hr","img","input","link","meta","param","source","track","wbr"]),yY="http://www.w3.org/2000/svg",jW="http://www.w3.org/1998/Math/MathML";function z(Y,W,J=null,X=null){let{tag:Z,props:$,children:G}=Y;if(Z===""||Z===k)return NY(G,W,J,X);if(Z===wY||Z===bY)return z(Z($),W,J,X);if(l(Y)||s(Y))return DY(Y,W,J,X);if(typeof Z==="function")return LW(Z,$,W,J,X);if(typeof Z==="string")return KW(Z,$,G,W,J,X);return NY(G,W,J,X)}function KW(Y,W,J,X,Z,$){let G=qW(Y,$),j=G?Q.createElementNS(G,Y):Q.createElement(Y),K=p(j,W),B=u(j,W),T=[];if(!GW.has(Y)){let P=W.dangerouslySetInnerHTML;if(P&&typeof P.__html==="string")j.innerHTML=P.__html;else T=c(J,j,VW(Y,G))}if(Z)Q.insertBefore(X,j,Z);else Q.appendChild(X,j);let F=FW(j,W.ref);return{type:"element",node:j,children:T,eventCleanups:B,attrDisposers:K,refCleanup:F}}function LW(Y,W,J,X,Z){let $=U(),G=m(Y,W,$);if($)$.children.push(G);let j=V(G),K,B;try{if(K=Y(W),K&&typeof K==="object"&&"tag"in K)B=z(K,J,X,Z);else B=L(K,J,X,Z)}catch(T){V(j),i(G,T);let F=Q.createTextNode("");if(X)Q.insertBefore(J,F,X);else Q.appendChild(J,F);return{type:"component",children:[{type:"text",node:F}],disposers:[],instance:G}}return V(j),G.element=B,{type:"component",children:[B],disposers:G.effects,instance:G}}function NY(Y,W,J,X){let Z=Q.createComment("Sinwan-f");if(J)Q.insertBefore(W,Z,J);else Q.appendChild(W,Z);let $=[];for(let G of Y)$.push(L(G,W,J,X));return{type:"fragment",children:$,anchor:Z}}function qW(Y,W){if(Y==="svg")return yY;if(Y==="math")return jW;return W}function VW(Y,W){if(W===yY&&Y==="foreignObject")return null;return W}function FW(Y,W){let J=W;if(!J)return null;if(typeof J==="function")return J(Y),()=>J(null);if(typeof J==="object"&&"current"in J)return J.current=Y,()=>{J.current=null};return null}function L(Y,W,J=null,X=null){if(Y==null||typeof Y==="boolean"){let $=Q.createTextNode("");return H(W,$,J),{type:"text",node:$}}if(typeof Y==="string"){let $=Q.createTextNode(Y);return H(W,$,J),{type:"text",node:$}}if(typeof Y==="number"){let $=Q.createTextNode(String(Y));return H(W,$,J),{type:"text",node:$}}if(Y instanceof C){let $=Q.createTextNode(Y.value);return H(W,$,J),{type:"text",node:$}}if(I(Y)||D(Y)){let $=Q.createTextNode(String(Y.value));H(W,$,J);let G=U(),j=!1,K=x(()=>{if(Q.setTextContent($,String(Y.value)),j)S(G);j=!0});return{type:"reactive-text",node:$,dispose:K}}if(Array.isArray(Y))return _W(Y,W,J,X);if(Y instanceof Promise){let $=Q.createTextNode("");return H(W,$,J),Y.then((G)=>{let j=L(G,W,$,X);Q.remove($)}),{type:"text",node:$}}if(typeof Y==="object"&&"tag"in Y)return z(Y,W,J,X);let Z=Q.createTextNode(String(Y));return H(W,Z,J),{type:"text",node:Z}}function _W(Y,W,J,X){let Z=Q.createComment("Sinwan-f");H(W,Z,J);let $=[];for(let G of Y)$.push(L(G,W,J,X));return{type:"fragment",children:$,anchor:Z}}function c(Y,W,J=null){let X=[];for(let Z of Y)X.push(L(Z,W,null,J));return X}function H(Y,W,J){if(J)Q.insertBefore(Y,W,J);else Q.appendChild(Y,W)}function OY(Y,W,J){W.innerHTML="";let X=J??{},Z=m(Y,X,null),$,G;V(Z);try{if($=Y(X),$ instanceof Promise){let j=document.createTextNode("");W.appendChild(j),G={type:"text",node:j},$.then((K)=>{W.innerHTML="",V(Z),G=z(K,W),V(null),Z.element=G,M(Z)})}else if($&&typeof $==="object"&&"tag"in $)G=z($,W);else G=L($,W)}catch(j){return V(null),i(Z,j),{root:{type:"text",node:document.createTextNode("")},unmount(){}}}return V(null),Z.element=G,M(Z),{root:G,unmount(){y(Z),_(G),W.innerHTML=""}}}function gY(Y,W){W.innerHTML="";let J=L(Y,W);return{root:J,unmount(){_(J),W.innerHTML=""}}}
2
+
3
+ //# debugId=9C7A44BD060D1ED664756E2164756E21
@@ -0,0 +1,24 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/jsx/jsx-runtime.ts", "../../src/renderer/dom-ops.ts", "../../src/reactivity/scheduler.ts", "../../src/reactivity/effect.ts", "../../src/reactivity/signal.ts", "../../src/reactivity/computed.ts", "../../src/renderer/events.ts", "../../src/component/instance.ts", "../../src/renderer/attributes.ts", "../../src/component/control-flow.ts", "../../src/renderer/unmount.ts", "../../src/renderer/render-control-flow.ts", "../../src/renderer/render-element.ts", "../../src/renderer/render-children.ts", "../../src/renderer/mount.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * SinwanJS View Module — JSX Runtime\n *\n * JSX factory that returns SinwanElement structures for the view renderer.\n * Imported automatically when using JSX syntax.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { SinwanIntrinsicElements } from \"./jsx-types\";\n\nexport const Fragment = Symbol(\"Fragment\");\n\n/**\n * A string that has been marked as safe HTML (already escaped).\n * Used for raw HTML injection with explicit trust marking.\n */\nexport class HtmlEscapedString extends String {\n constructor(public readonly value: string) {\n super(value);\n }\n override toString() {\n return this.value;\n }\n}\n\nexport const raw = (str: string) => new HtmlEscapedString(str);\n\n// Fast path for intrinsic elements\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\n/**\n * Normalize children into an array of SinwanNode.\n */\nfunction normalizeChildren(children: any): SinwanNode[] {\n if (children == null || typeof children === \"boolean\") return [];\n if (Array.isArray(children)) return children.flat(Infinity);\n return [children];\n}\n\n/**\n * Build an SinwanElement from a component/tag invocation.\n * Shared logic for jsx, jsxs, and jsxDEV.\n */\nfunction buildElement(\n type: any,\n props: any,\n children: SinwanNode[],\n): SinwanElement {\n // Handle Fragment\n if (type === Fragment) {\n return { tag: \"\", props: {}, children };\n }\n\n // Functional components and intrinsic HTML elements both pass the type\n // through as `tag`. The renderer (client / server / hydration) is the\n // single owner of component-instance creation and lifecycle dispatch.\n // Calling the function eagerly here would bypass instance management\n // and break `onMounted`, `provide`/`inject`, and the parent/child tree.\n if (typeof type === \"function\" || typeof type === \"string\") {\n const finalProps = props ?? {};\n // Mirror children into props.children so component setup can read it.\n if (children.length > 0 && finalProps.children === undefined) {\n finalProps.children = children.length === 1 ? children[0] : children;\n }\n return { tag: type, props: finalProps, children };\n }\n\n // Fallback\n return { tag: \"\", props: {}, children };\n}\n\n/**\n * JSX factory — called for elements with 0 or 1 child.\n * TypeScript auto-imports this in production mode (`react-jsx`).\n */\nexport function jsx(type: any, props: any, key?: any): SinwanElement {\n return buildElement(type, props, normalizeChildren(props?.children));\n}\n\n/**\n * JSX static factory — called for elements with 2+ children.\n * `props.children` is **already an array**, so we skip normalizeChildren.\n */\nexport function jsxs(type: any, props: any, key?: any): SinwanElement {\n const children = props?.children;\n // Children is guaranteed to be an array by the compiler\n return buildElement(\n type,\n props,\n Array.isArray(children)\n ? children.flat(Infinity)\n : normalizeChildren(children),\n );\n}\n\n/**\n * Source location metadata attached by the compiler in dev mode.\n */\nexport interface JSXSource {\n fileName: string;\n lineNumber: number;\n columnNumber: number;\n}\n\n/**\n * JSX dev factory — called in dev mode (`react-jsxdev`).\n * Receives extra source/debug info for better error messages.\n */\nexport function jsxDEV(\n type: any,\n props: any,\n key: any,\n isStaticChildren: boolean,\n source?: JSXSource,\n self?: unknown,\n): SinwanElement {\n const children = isStaticChildren\n ? Array.isArray(props?.children)\n ? props.children.flat(Infinity)\n : normalizeChildren(props?.children)\n : normalizeChildren(props?.children);\n\n const element = buildElement(type, props, children);\n\n // Attach debug metadata (useful for dev-tools / error traces)\n if (source) {\n (element as any).__source = source;\n }\n\n return element;\n}\n\nexport namespace JSX {\n export type Element = SinwanElement | Promise<SinwanElement>;\n export interface IntrinsicAttributes {\n key?: string | number;\n }\n export interface ElementChildrenAttribute {\n children: {};\n }\n export interface IntrinsicElements extends SinwanIntrinsicElements {}\n}\n\ndeclare global {\n namespace JSX {\n type Element = SinwanElement | Promise<SinwanElement>;\n interface IntrinsicAttributes {\n key?: string | number;\n }\n interface ElementChildrenAttribute {\n children: {};\n }\n interface IntrinsicElements extends SinwanIntrinsicElements {}\n }\n}\n",
6
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — DOM Operations\n *\n * Thin abstraction over native DOM APIs for testability\n * and potential future server-side DOM (e.g., happy-dom, linkedom).\n */\n\nexport interface DOMOps {\n createElement(tag: string): Element;\n createElementNS(namespace: string, tag: string): Element;\n createTextNode(text: string): Text;\n createComment(text: string): Comment;\n setAttribute(el: Element, key: string, value: string): void;\n removeAttribute(el: Element, key: string): void;\n setProperty(el: Element, key: string, value: unknown): void;\n insertBefore(parent: Node, child: Node, anchor: Node | null): void;\n appendChild(parent: Node, child: Node): void;\n remove(node: Node): void;\n setTextContent(node: Text, text: string): void;\n addEventListener(el: Element, event: string, handler: EventListener): void;\n removeEventListener(el: Element, event: string, handler: EventListener): void;\n parentNode(node: Node): Node | null;\n nextSibling(node: Node): Node | null;\n}\n\nfunction createDefaultDOMOps(): DOMOps {\n return {\n createElement(tag: string): Element {\n return document.createElement(tag);\n },\n\n createElementNS(namespace: string, tag: string): Element {\n return document.createElementNS(namespace, tag);\n },\n\n createTextNode(text: string): Text {\n return document.createTextNode(text);\n },\n\n createComment(text: string): Comment {\n return document.createComment(text);\n },\n\n setAttribute(el: Element, key: string, value: string): void {\n el.setAttribute(key, value);\n },\n\n removeAttribute(el: Element, key: string): void {\n el.removeAttribute(key);\n },\n\n setProperty(el: Element, key: string, value: unknown): void {\n (el as any)[key] = value;\n },\n\n insertBefore(parent: Node, child: Node, anchor: Node | null): void {\n parent.insertBefore(child, anchor);\n },\n\n appendChild(parent: Node, child: Node): void {\n parent.appendChild(child);\n },\n\n remove(node: Node): void {\n node.parentNode?.removeChild(node);\n },\n\n setTextContent(node: Text, text: string): void {\n node.data = text;\n },\n\n addEventListener(el: Element, event: string, handler: EventListener): void {\n el.addEventListener(event, handler);\n },\n\n removeEventListener(el: Element, event: string, handler: EventListener): void {\n el.removeEventListener(event, handler);\n },\n\n parentNode(node: Node): Node | null {\n return node.parentNode;\n },\n\n nextSibling(node: Node): Node | null {\n return node.nextSibling;\n },\n };\n}\n\nconst defaultDOMOps = createDefaultDOMOps();\n\n/**\n * Live DOM operations object used by the renderer.\n */\nexport const domOps: DOMOps = { ...defaultDOMOps };\n\nexport function setDOMOps(overrides: Partial<DOMOps>): void {\n Object.assign(domOps, overrides);\n}\n\nexport function resetDOMOps(): void {\n for (const key of Object.keys(domOps) as (keyof DOMOps)[]) {\n delete (domOps as any)[key];\n }\n Object.assign(domOps, defaultDOMOps);\n}\n",
7
+ "/**\n * SinwanJS Reactivity — Scheduler\n *\n * Microtask-based flush queue for batching reactive updates.\n * Effects are NOT run synchronously on signal write — they are\n * queued and flushed in a microtask (like Vue's nextTick).\n */\n\nexport interface EffectNode {\n id: number;\n run(): void;\n active: boolean;\n}\n\nconst pendingEffects = new Set<EffectNode>();\nlet flushScheduled = false;\nlet isFlushing = false;\n\n// Pending nextTick callbacks\nconst pendingCallbacks: (() => void)[] = [];\n\n/**\n * Schedule an effect for the next microtask flush.\n */\nexport function scheduleEffect(effect: EffectNode): void {\n if (!effect.active) return;\n pendingEffects.add(effect);\n scheduleFlush();\n}\n\n/**\n * Remove a scheduled effect (e.g. when disposed before flush).\n */\nexport function unscheduleEffect(effect: EffectNode): void {\n pendingEffects.delete(effect);\n}\n\n/**\n * Schedule the microtask flush if not already scheduled.\n */\nfunction scheduleFlush(): void {\n if (!flushScheduled) {\n flushScheduled = true;\n queueMicrotask(flush);\n }\n}\n\n/**\n * Flush all pending effects. Effects added during flush are\n * processed in the same pass (convergence loop with a safety limit).\n */\nfunction flush(): void {\n isFlushing = true;\n\n // Sort by id to guarantee parent-before-child execution order\n const sorted = [...pendingEffects].sort((a, b) => a.id - b.id);\n pendingEffects.clear();\n\n for (const effect of sorted) {\n if (effect.active) {\n effect.run();\n }\n }\n\n // If new effects were queued during the flush, drain them too\n // (safety limit to prevent infinite loops)\n let safety = 10;\n while (pendingEffects.size > 0 && safety-- > 0) {\n const next = [...pendingEffects].sort((a, b) => a.id - b.id);\n pendingEffects.clear();\n for (const effect of next) {\n if (effect.active) {\n effect.run();\n }\n }\n }\n\n flushScheduled = false;\n isFlushing = false;\n\n // Run nextTick callbacks after all effects\n const cbs = pendingCallbacks.splice(0);\n for (const cb of cbs) {\n cb();\n }\n}\n\n/**\n * Returns true if the scheduler is currently flushing effects.\n */\nexport function isFlushingEffects(): boolean {\n return isFlushing;\n}\n\n/**\n * Queue a callback that runs after the next reactive flush completes.\n * Similar to Vue's nextTick().\n */\nexport function nextTick(fn?: () => void): Promise<void> {\n return new Promise<void>((resolve) => {\n const callback = () => {\n fn?.();\n resolve();\n };\n if (flushScheduled || isFlushing) {\n // Effects are pending — run after they flush\n pendingCallbacks.push(callback);\n } else {\n // No pending effects — run on next microtask\n queueMicrotask(callback);\n }\n });\n}\n\n/**\n * Force synchronous flush of all pending effects.\n * Primarily for testing and batch().\n */\nexport function flushSync(): void {\n if (flushScheduled) {\n flushScheduled = false;\n flush();\n }\n}\n",
8
+ "/**\n * SinwanJS Reactivity — Effect\n *\n * Fine-grained effect system with automatic dependency tracking.\n * When an effect runs, any signal reads are tracked as dependencies.\n * When those signals change, the effect is re-scheduled.\n */\n\nimport { type EffectNode, scheduleEffect, unscheduleEffect } from \"./scheduler.ts\";\n\n// ─── Global tracking state ─────────────────────────────────\n\nlet activeEffect: ReactiveEffect | null = null;\nconst effectStack: ReactiveEffect[] = [];\nlet effectIdCounter = 0;\n\n// ─── Subscription interface ────────────────────────────────\n\n/**\n * A Dep is any object that can track subscribers.\n * Signals and computeds implement this internally.\n */\nexport interface Dep {\n subscribers: Set<ReactiveEffect>;\n}\n\n// ─── ReactiveEffect ────────────────────────────────────────\n\nexport type CleanupFn = () => void;\nexport type EffectFn = () => CleanupFn | void;\n\nexport class ReactiveEffect implements EffectNode {\n id: number;\n active = true;\n\n /** The user-supplied function */\n private fn: EffectFn;\n\n /** Cleanup returned from the last run */\n private cleanup: CleanupFn | void = undefined;\n\n /** All deps this effect is subscribed to (for bidirectional cleanup) */\n deps: Set<Dep> = new Set();\n\n constructor(fn: EffectFn) {\n this.id = effectIdCounter++;\n this.fn = fn;\n }\n\n /**\n * Execute the effect function while tracking dependencies.\n */\n run(): void {\n if (!this.active) return;\n\n // Prevent infinite re-entry\n if (effectStack.includes(this)) return;\n\n // Clean up previous dependencies\n this.cleanupDeps();\n\n // Run user cleanup from previous execution\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n\n // Push onto the tracking stack\n effectStack.push(this);\n const prevEffect = activeEffect;\n activeEffect = this;\n\n try {\n const result = this.fn();\n if (typeof result === \"function\") {\n this.cleanup = result;\n }\n } finally {\n activeEffect = prevEffect;\n effectStack.pop();\n }\n }\n\n /**\n * Unsubscribe from all current deps so stale deps don't trigger this effect.\n */\n private cleanupDeps(): void {\n for (const dep of this.deps) {\n dep.subscribers.delete(this);\n }\n this.deps.clear();\n }\n\n /**\n * Notify the scheduler that this effect should re-run.\n */\n notify(): void {\n scheduleEffect(this);\n }\n\n /**\n * Permanently dispose this effect — stop tracking & unsubscribe.\n */\n dispose(): void {\n if (!this.active) return;\n this.active = false;\n\n // Run user cleanup\n if (this.cleanup) {\n this.cleanup();\n this.cleanup = undefined;\n }\n\n this.cleanupDeps();\n unscheduleEffect(this);\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a reactive effect.\n *\n * The effect function runs immediately to establish initial dependencies.\n * It re-runs whenever any tracked signal changes.\n * Returns a dispose function to stop the effect.\n *\n * @example\n * const count = signal(0);\n * const dispose = effect(() => {\n * console.log(\"count is\", count.value);\n * });\n * // logs \"count is 0\" immediately\n *\n * count.value = 1;\n * // logs \"count is 1\" on next microtask\n *\n * dispose(); // stops tracking\n */\nexport function effect(fn: EffectFn): CleanupFn {\n const e = new ReactiveEffect(fn);\n // Run immediately (synchronous first run for initial tracking)\n e.run();\n return () => e.dispose();\n}\n\n// ─── Tracking helpers (used by signals/computed) ───────────\n\n/**\n * Track a dependency from the currently active effect.\n * Called by signal.value getters.\n */\nexport function track(dep: Dep): void {\n if (activeEffect) {\n dep.subscribers.add(activeEffect);\n activeEffect.deps.add(dep);\n }\n}\n\n/**\n * Trigger all subscribers of a dependency.\n * Called by signal.value setters.\n */\nexport function trigger(dep: Dep): void {\n // Copy to avoid modification during iteration\n const effects = [...dep.subscribers];\n for (const effect of effects) {\n effect.notify();\n }\n}\n\n/**\n * Returns the currently active effect (for advanced usage).\n */\nexport function getActiveEffect(): ReactiveEffect | null {\n return activeEffect;\n}\n",
9
+ "/**\n * SinwanJS Reactivity — Signal\n *\n * A signal is a reactive container for a single value.\n * Reading `.value` tracks the current effect as a subscriber.\n * Writing `.value` notifies all subscribers.\n *\n * Inspired by Vue 3 ref(), Solid signals, Preact signals.\n */\n\nimport { type Dep, track, trigger } from \"./effect.ts\";\n\n// ─── Signal interface ──────────────────────────────────────\n\nexport interface Signal<T> {\n /** Get or set the reactive value. Reading tracks; writing notifies. */\n value: T;\n\n /** Read the value without tracking dependencies. */\n peek(): T;\n\n /** Manually subscribe to changes. Returns an unsubscribe function. */\n subscribe(fn: (value: T) => void): () => void;\n}\n\n// Brand for type-checking\nconst SIGNAL_BRAND = Symbol(\"Sinwan:signal\");\n\n// ─── Implementation ────────────────────────────────────────\n\nclass SignalImpl<T> implements Signal<T>, Dep {\n [SIGNAL_BRAND] = true;\n\n subscribers = new Set<import(\"./effect.ts\").ReactiveEffect>();\n private _value: T;\n private _manualSubs = new Set<(value: T) => void>();\n\n constructor(initial: T) {\n this._value = initial;\n }\n\n get value(): T {\n track(this);\n return this._value;\n }\n\n set value(newValue: T) {\n if (Object.is(this._value, newValue)) return;\n this._value = newValue;\n trigger(this);\n\n // Notify manual subscribers\n for (const fn of this._manualSubs) {\n fn(newValue);\n }\n }\n\n peek(): T {\n return this._value;\n }\n\n subscribe(fn: (value: T) => void): () => void {\n this._manualSubs.add(fn);\n return () => {\n this._manualSubs.delete(fn);\n };\n }\n\n /**\n * toString() for interpolation in templates.\n */\n toString(): string {\n return String(this.value);\n }\n\n /**\n * valueOf() for numeric operations.\n */\n valueOf(): T {\n return this.value;\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a reactive signal.\n *\n * @example\n * const count = signal(0);\n * console.log(count.value); // 0\n *\n * effect(() => {\n * console.log(count.value); // re-runs when count changes\n * });\n *\n * count.value = 5; // triggers the effect\n */\nexport function signal<T>(initial: T): Signal<T> {\n return new SignalImpl(initial);\n}\n\n/**\n * Type guard: check if a value is a Signal.\n */\nexport function isSignal(value: unknown): value is Signal<unknown> {\n return (\n value != null && typeof value === \"object\" && SIGNAL_BRAND in (value as any)\n );\n}\n",
10
+ "/**\n * SinwanJS Reactivity — Computed\n *\n * A computed is a derived reactive value that lazily re-evaluates\n * when its dependencies change. It caches the result and only\n * recomputes when actually read after a dependency has changed.\n *\n * Design: The computed does NOT use the scheduler for its own\n * re-evaluation. When a dependency changes, it marks itself dirty\n * and triggers downstream subscribers (which ARE scheduled).\n * The actual re-evaluation happens lazily on `.value` access.\n *\n * Inspired by Vue 3 computed(), Solid createMemo().\n */\n\nimport { type Dep, track, trigger, ReactiveEffect } from \"./effect.ts\";\n\n// ─── Computed interface ────────────────────────────────────\n\nexport interface Computed<T> {\n /** Read the computed value (lazy evaluation, cached). */\n readonly value: T;\n\n /** Read without tracking. */\n peek(): T;\n}\n\n// Brand for type-checking\nconst COMPUTED_BRAND = Symbol(\"Sinwan:computed\");\n\n// ─── Implementation ────────────────────────────────────────\n\nclass ComputedImpl<T> implements Computed<T>, Dep {\n [COMPUTED_BRAND] = true;\n\n subscribers = new Set<ReactiveEffect>();\n\n _value!: T;\n _dirty = true;\n _effect: ReactiveEffect;\n\n constructor(getter: () => T) {\n const self = this;\n\n // Internal effect solely for dependency tracking.\n // The fn wraps the getter — it writes to self._value as a side effect.\n this._effect = new ReactiveEffect(() => {\n self._value = getter();\n });\n\n // Override notify: don't schedule this effect via the scheduler.\n // Instead mark dirty and propagate to our own subscribers.\n this._effect.notify = function () {\n if (!self._dirty) {\n self._dirty = true;\n trigger(self);\n }\n };\n\n // Run once synchronously to establish deps and cache initial value\n this._effect.run();\n this._dirty = false;\n }\n\n get value(): T {\n track(this);\n\n if (this._dirty) {\n this._effect.run();\n this._dirty = false;\n }\n\n return this._value;\n }\n\n peek(): T {\n if (this._dirty) {\n this._effect.run();\n this._dirty = false;\n }\n return this._value;\n }\n\n /**\n * toString() for template interpolation.\n */\n toString(): string {\n return String(this.value);\n }\n\n /**\n * valueOf() for numeric operations.\n */\n valueOf(): T {\n return this.value;\n }\n}\n\n// ─── Public API ────────────────────────────────────────────\n\n/**\n * Create a computed reactive value.\n *\n * The getter function is tracked — when any signal it reads changes,\n * the computed is marked dirty and will re-evaluate on next `.value` read.\n *\n * @example\n * const count = signal(2);\n * const doubled = computed(() => count.value * 2);\n *\n * console.log(doubled.value); // 4\n *\n * count.value = 5;\n * console.log(doubled.value); // 10\n */\nexport function computed<T>(getter: () => T): Computed<T> {\n return new ComputedImpl(getter);\n}\n\n/**\n * Type guard: check if a value is a Computed.\n */\nexport function isComputed(value: unknown): value is Computed<unknown> {\n return (\n value != null &&\n typeof value === \"object\" &&\n COMPUTED_BRAND in (value as any)\n );\n}\n",
11
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Event Binding\n *\n * Direct event binding (not delegation). Each handler is attached\n * directly to its target element for simplicity and easy hydration.\n *\n * Design decision: direct binding like Solid.js, not delegation like React.\n */\n\nimport { domOps } from \"./dom-ops.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\n\n/**\n * Check if a prop key is an event handler (starts with \"on\").\n */\nexport function isEventProp(key: string): boolean {\n return key.length > 2 && key[0] === \"o\" && key[1] === \"n\" && key[2]! >= \"A\" && key[2]! <= \"Z\";\n}\n\n/**\n * Extract the DOM event name from a prop key.\n * e.g., \"onClick\" → \"click\", \"onMouseEnter\" → \"mouseenter\"\n */\nexport function toEventName(key: string): string {\n return key.slice(2).toLowerCase();\n}\n\n/**\n * Bind an event handler to an element.\n * Returns a cleanup function to remove the listener.\n */\nexport function bindEvent(\n el: Element,\n eventName: string,\n handler: EventListener,\n): CleanupFn {\n domOps.addEventListener(el, eventName, handler);\n return () => {\n domOps.removeEventListener(el, eventName, handler);\n };\n}\n\n/**\n * Bind all event props from an element's props object.\n * Returns an array of cleanup functions.\n */\nexport function bindEvents(\n el: Element,\n props: Record<string, unknown>,\n): CleanupFn[] {\n const cleanups: CleanupFn[] = [];\n\n for (const key of Object.keys(props)) {\n if (isEventProp(key)) {\n const handler = props[key];\n if (typeof handler === \"function\") {\n const eventName = toEventName(key);\n cleanups.push(bindEvent(el, eventName, handler as EventListener));\n }\n }\n }\n\n return cleanups;\n}\n",
12
+ "/**\n * SinwanJS Component Runtime — Instance Management\n *\n * Each component rendered on the client gets a ComponentInstance\n * that tracks its lifecycle hooks, effects, parent/child tree,\n * and provide/inject context.\n *\n * A global `currentInstance` stack lets lifecycle hooks (onMounted, etc.)\n * register themselves during setup or synchronous lifecycle callbacks —\n * same pattern as Vue's getCurrentInstance.\n */\n\nimport type { SinwanComponent } from \"../types.ts\";\nimport type { MountedNode } from \"../renderer/types.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport { nextTick } from \"../reactivity/scheduler.ts\";\n\n// ─── ComponentInstance ─────────────────────────────────────\n\nlet uidCounter = 0;\n\nexport interface ComponentInstance {\n /** Unique identifier for this instance. */\n uid: number;\n\n /** The component definition (setup function). */\n component: SinwanComponent<any>;\n\n /** Props passed to this component. */\n props: Record<string, any>;\n\n /** The rendered DOM subtree (set after render). */\n element: MountedNode | null;\n\n /** Parent instance in the component tree. */\n parent: ComponentInstance | null;\n\n /** Child component instances. */\n children: ComponentInstance[];\n\n /** All effect dispose functions owned by this component. */\n effects: CleanupFn[];\n\n // ─── Lifecycle hook queues ────────────────────────────\n\n /** Callbacks to fire after the component is mounted to DOM. */\n _mountedHooks: (() => void)[];\n\n /** Callbacks to fire when the component is unmounted. */\n _unmountedHooks: (() => void)[];\n\n /** Callbacks to fire after any reactive update in this component. */\n _updatedHooks: (() => void)[];\n\n /** Error handler callbacks. */\n _errorHooks: ((err: Error) => void)[];\n\n // ─── Provide/Inject context ───────────────────────────\n\n /** Values provided by this instance (for inject in children). */\n provides: Record<string | symbol, unknown>;\n\n // ─── State flags ──────────────────────────────────────\n\n isMounted: boolean;\n isUnmounted: boolean;\n}\n\n/**\n * Create a fresh ComponentInstance.\n */\nexport function createComponentInstance(\n component: SinwanComponent<any>,\n props: Record<string, any>,\n parent: ComponentInstance | null,\n): ComponentInstance {\n return {\n uid: uidCounter++,\n component,\n props,\n element: null,\n parent,\n children: [],\n effects: [],\n _mountedHooks: [],\n _unmountedHooks: [],\n _updatedHooks: [],\n _errorHooks: [],\n // Inherit parent's provides (prototype chain for lookup)\n provides: parent ? Object.create(parent.provides) : Object.create(null),\n isMounted: false,\n isUnmounted: false,\n };\n}\n\n// ─── Current instance stack ────────────────────────────────\n\nlet currentInstance: ComponentInstance | null = null;\n\n/**\n * Get the currently active component instance.\n * Used by lifecycle hooks to register themselves.\n */\nexport function getCurrentInstance(): ComponentInstance | null {\n return currentInstance;\n}\n\n/**\n * Set the current instance (called by renderer before setup).\n * Returns the previous instance for restoration.\n */\nexport function setCurrentInstance(\n instance: ComponentInstance | null,\n): ComponentInstance | null {\n const prev = currentInstance;\n currentInstance = instance;\n return prev;\n}\n\n/**\n * Run a function with `instance` as the current component instance.\n * Automatically restores the previous instance when done.\n */\nexport function withInstance<T>(instance: ComponentInstance, fn: () => T): T {\n const prev = setCurrentInstance(instance);\n try {\n return fn();\n } finally {\n setCurrentInstance(prev);\n }\n}\n\n// ─── Lifecycle execution ───────────────────────────────────\n\n/**\n * Fire all onMounted hooks for an instance and its children (depth-first).\n */\nexport function fireMountedHooks(instance: ComponentInstance): void {\n if (instance.isUnmounted) {\n return;\n }\n\n // Children first (bottom-up, like Vue)\n for (const child of instance.children) {\n fireMountedHooks(child);\n }\n\n if (!instance.isMounted) {\n instance.isMounted = true;\n for (const hook of instance._mountedHooks) {\n hook();\n }\n }\n}\n\n/**\n * Fire all onUnmounted hooks and dispose all effects for an instance\n * and its children (depth-first, children first).\n */\nexport function fireUnmountedHooks(instance: ComponentInstance): void {\n // Children first\n for (const child of instance.children) {\n fireUnmountedHooks(child);\n }\n\n if (instance.isMounted && !instance.isUnmounted) {\n instance.isUnmounted = true;\n instance.isMounted = false;\n\n // Fire unmounted hooks\n for (const hook of instance._unmountedHooks) {\n hook();\n }\n\n // Dispose all effects owned by this component\n for (const dispose of instance.effects) {\n dispose();\n }\n instance.effects.length = 0;\n }\n}\n\n/**\n * Fire onUpdated hooks for the current instance.\n */\nexport function fireUpdatedHooks(instance: ComponentInstance): void {\n for (const hook of instance._updatedHooks) {\n hook();\n }\n}\n\nconst queuedUpdatedHooks = new Set<ComponentInstance>();\n\n/**\n * Queue onUpdated hooks to run after the current reactive flush.\n * Multiple DOM effects in the same flush produce one updated callback.\n */\nexport function queueUpdatedHooks(instance: ComponentInstance | null): void {\n if (\n !instance ||\n !instance.isMounted ||\n instance.isUnmounted ||\n instance._updatedHooks.length === 0 ||\n queuedUpdatedHooks.has(instance)\n ) {\n return;\n }\n\n queuedUpdatedHooks.add(instance);\n nextTick(() => {\n queuedUpdatedHooks.delete(instance);\n if (instance.isMounted && !instance.isUnmounted) {\n fireUpdatedHooks(instance);\n }\n });\n}\n\n/**\n * Handle an error in the component tree — walks up to find an error handler.\n */\nexport function handleComponentError(\n instance: ComponentInstance,\n err: Error,\n): void {\n let current: ComponentInstance | null = instance;\n while (current) {\n if (current._errorHooks.length > 0) {\n for (const hook of current._errorHooks) {\n hook(err);\n }\n return;\n }\n current = current.parent;\n }\n // No handler found — re-throw\n console.error(\"[Sinwan] Unhandled component error:\", err);\n}\n",
13
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Attribute Handling\n *\n * Maps JSX props to DOM attributes and properties.\n * Handles special cases: className→class, htmlFor→for,\n * style objects, boolean attributes, and reactive attributes.\n */\n\nimport { domOps } from \"./dom-ops.ts\";\nimport { isEventProp } from \"./events.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport {\n getCurrentInstance,\n queueUpdatedHooks,\n} from \"../component/instance.ts\";\n\n// Props that should be skipped during attribute rendering\nconst SKIP_PROPS = new Set([\"children\", \"key\", \"ref\", \"dangerouslySetInnerHTML\"]);\n\n// Props that map to DOM properties rather than attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"disabled\", \"readOnly\", \"multiple\", \"indeterminate\"]);\n\n// Prop name aliases\nconst PROP_ALIASES: Record<string, string> = {\n className: \"class\",\n htmlFor: \"for\",\n tabIndex: \"tabindex\",\n crossOrigin: \"crossorigin\",\n};\n\n/**\n * Apply all non-event props to a DOM element.\n * Handles static values, reactive signals, and special cases.\n * Returns an array of disposers for reactive attributes.\n */\nexport function applyAttributes(\n el: Element,\n props: Record<string, unknown>,\n): CleanupFn[] {\n const disposers: CleanupFn[] = [];\n const owner = getCurrentInstance();\n\n for (const [key, value] of Object.entries(props)) {\n if (SKIP_PROPS.has(key) || isEventProp(key)) continue;\n\n if (isSignal(value) || isComputed(value)) {\n // Reactive attribute — wrap in an effect\n let initialized = false;\n const dispose = effect(() => {\n setSingleAttribute(el, key, (value as any).value);\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n });\n disposers.push(dispose);\n } else {\n setSingleAttribute(el, key, value);\n }\n }\n\n return disposers;\n}\n\n/**\n * Set a single attribute/property on a DOM element.\n */\nfunction setSingleAttribute(el: Element, key: string, value: unknown): void {\n // Resolve alias\n const attrName = PROP_ALIASES[key] ?? key;\n\n // Handle style objects\n if (attrName === \"style\" && typeof value === \"object\" && value !== null) {\n applyStyle(el as HTMLElement, value as Record<string, string>);\n return;\n }\n\n // Handle class arrays/objects\n if (attrName === \"class\" && typeof value === \"object\" && value !== null) {\n applyClass(el, value);\n return;\n }\n\n // Handle null/undefined/false — remove attribute\n if (value == null || value === false) {\n domOps.removeAttribute(el, attrName);\n // Also clear the property if it's a DOM property\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, attrName === \"value\" ? \"\" : false);\n }\n return;\n }\n\n // Handle boolean true — set as attribute name only\n if (value === true) {\n domOps.setAttribute(el, attrName, \"\");\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, true);\n }\n return;\n }\n\n // DOM properties — set directly on the element\n if (DOM_PROPERTIES.has(attrName)) {\n domOps.setProperty(el, attrName, value);\n return;\n }\n\n // Default — set as string attribute\n domOps.setAttribute(el, attrName, String(value));\n}\n\n/**\n * Apply a style object to an element.\n */\nfunction applyStyle(el: HTMLElement, styles: Record<string, string>): void {\n for (const [prop, val] of Object.entries(styles)) {\n // Convert camelCase to kebab-case for style.setProperty\n if (prop.includes(\"-\")) {\n el.style.setProperty(prop, val);\n } else {\n (el.style as any)[prop] = val;\n }\n }\n}\n\n/**\n * Apply class value — supports string, array, or object notation.\n */\nfunction applyClass(el: Element, value: unknown): void {\n let classStr: string;\n\n if (Array.isArray(value)) {\n // [\"foo\", \"bar\", false && \"baz\"] → \"foo bar\"\n classStr = value.filter(Boolean).join(\" \");\n } else if (typeof value === \"object\" && value !== null) {\n // { foo: true, bar: false } → \"foo\"\n classStr = Object.entries(value)\n .filter(([, v]) => Boolean(v))\n .map(([k]) => k)\n .join(\" \");\n } else {\n classStr = String(value);\n }\n\n domOps.setAttribute(el, \"class\", classStr);\n}\n",
14
+ "import type { Reactive, SinwanElement, SinwanNode } from \"../types.ts\";\n\nexport const SHOW_TYPE = Symbol.for(\"Sinwan.Show\");\nexport const FOR_TYPE = Symbol.for(\"Sinwan.For\");\n\nexport interface ShowProps<T> {\n when: Reactive<T | false | null | undefined>;\n fallback?: SinwanNode;\n children?: SinwanNode | ((value: NonNullable<T>) => SinwanNode);\n}\n\nexport interface ForProps<T> {\n each: Reactive<readonly T[]>;\n key?: (item: T, index: number) => string | number | symbol;\n children?: (item: T, index: () => number) => SinwanNode;\n}\n\nexport function Show<T>(props: ShowProps<T>): SinwanElement {\n return {\n tag: SHOW_TYPE,\n props: props as unknown as Record<string, unknown>,\n children: [],\n };\n}\n\nexport function For<T>(props: ForProps<T>): SinwanElement {\n return {\n tag: FOR_TYPE,\n props: props as unknown as Record<string, unknown>,\n children: [],\n };\n}\n\nexport function isShowElement(element: SinwanElement): boolean {\n return element.tag === SHOW_TYPE;\n}\n\nexport function isForElement(element: SinwanElement): boolean {\n return element.tag === FOR_TYPE;\n}\n",
15
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Unmount helpers\n *\n * Shared cleanup and DOM removal utilities used by mount(), reactive blocks,\n * and future renderer entrypoints.\n */\n\nimport type { MountedNode } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { fireUnmountedHooks } from \"../component/instance.ts\";\n\n/**\n * Return the actual DOM nodes owned by a mounted tree, in document order.\n */\nexport function getMountedDomNodes(node: MountedNode): Node[] {\n switch (node.type) {\n case \"text\":\n case \"reactive-text\":\n return [node.node];\n\n case \"element\":\n return [node.node];\n\n case \"fragment\":\n return [\n node.anchor,\n ...node.children.flatMap((child) => getMountedDomNodes(child)),\n ];\n\n case \"reactive-block\":\n return [\n node.startAnchor,\n ...node.children.flatMap((child) => getMountedDomNodes(child)),\n node.endAnchor,\n ];\n\n case \"component\":\n return node.children.flatMap((child) => getMountedDomNodes(child));\n }\n}\n\n/**\n * Recursively unmount a node tree — disposes effects, removes events and refs.\n */\nexport function unmountNode(node: MountedNode): void {\n switch (node.type) {\n case \"text\":\n break;\n\n case \"reactive-text\":\n node.dispose();\n break;\n\n case \"element\":\n for (const dispose of node.attrDisposers) {\n dispose();\n }\n for (const cleanup of node.eventCleanups) {\n cleanup();\n }\n node.refCleanup?.();\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"fragment\":\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"reactive-block\":\n node.dispose();\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n\n case \"component\":\n if (node.instance) {\n fireUnmountedHooks(node.instance);\n } else {\n for (const dispose of node.disposers) {\n dispose();\n }\n }\n for (const child of node.children) {\n unmountNode(child);\n }\n break;\n }\n}\n\n/**\n * Unmount a mounted tree and remove every DOM node it owns.\n */\nexport function removeMountedNode(node: MountedNode): void {\n const domNodes = getMountedDomNodes(node);\n unmountNode(node);\n for (const domNode of domNodes) {\n if (domNode.parentNode) {\n domOps.remove(domNode);\n }\n }\n}\n",
16
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Reactive control-flow blocks\n *\n * `<Show>` and `<For>` render between stable comment anchors. Updates remove,\n * move, or insert only the block-owned DOM nodes.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { MountedNode, MountedReactiveBlock } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport {\n getCurrentInstance,\n fireMountedHooks,\n queueUpdatedHooks,\n withInstance,\n type ComponentInstance,\n} from \"../component/instance.ts\";\nimport { isForElement, isShowElement } from \"../component/control-flow.ts\";\nimport {\n getMountedDomNodes,\n removeMountedNode,\n} from \"./unmount.ts\";\nimport { renderNodeToDOM } from \"./render-children.ts\";\n\ninterface ForRecord<T> {\n key: unknown;\n item: T;\n index: number;\n mounted: MountedNode;\n}\n\n/**\n * Render a Show/For element to a reactive block.\n */\nexport function renderControlFlowToDOM(\n element: SinwanElement,\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedReactiveBlock {\n const startAnchor = domOps.createComment(\"Sinwan-b\");\n const endAnchor = domOps.createComment(\"/Sinwan-b\");\n insertNode(parent, startAnchor, anchor);\n insertNode(parent, endAnchor, anchor);\n\n const owner = getCurrentInstance();\n let disposeEffect = () => {};\n\n const block: MountedReactiveBlock = {\n type: \"reactive-block\",\n dispose: () => disposeEffect(),\n children: [],\n startAnchor,\n endAnchor,\n };\n\n if (isShowElement(element)) {\n disposeEffect = renderShowBlock(element, block, parent, namespace, owner);\n } else if (isForElement(element)) {\n disposeEffect = renderForBlock(element, block, parent, namespace, owner);\n }\n\n return block;\n}\n\nfunction renderShowBlock(\n element: SinwanElement,\n block: MountedReactiveBlock,\n parent: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): () => void {\n let initialized = false;\n\n return effect(() => {\n clearChildren(block);\n\n const when = readReactive((element.props as any).when);\n const content = withOptionalInstance(owner, () =>\n when ? resolveShowChildren(element, when) : (element.props as any).fallback,\n );\n\n block.children = renderBlockContent(\n content,\n parent,\n block.endAnchor,\n namespace,\n owner,\n );\n\n if (initialized) {\n fireMountedAndQueueUpdated(owner);\n }\n initialized = true;\n });\n}\n\nfunction renderForBlock<T>(\n element: SinwanElement,\n block: MountedReactiveBlock,\n parent: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): () => void {\n let initialized = false;\n let records: ForRecord<T>[] = [];\n\n return effect(() => {\n const props = element.props as {\n each?: unknown;\n key?: (item: T, index: number) => string | number | symbol;\n children?: (item: T, index: () => number) => SinwanNode;\n };\n const items = readReactive(props.each) as readonly T[] | null | undefined;\n const list = Array.isArray(items) ? items : [];\n const renderChild = props.children;\n\n if (typeof renderChild !== \"function\") {\n clearChildren(block);\n records = [];\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n return;\n }\n\n const oldByKey = new Map<unknown, ForRecord<T>>();\n for (const record of records) {\n oldByKey.set(record.key, record);\n }\n\n const nextRecords: ForRecord<T>[] = [];\n\n list.forEach((item, index) => {\n const key = props.key ? props.key(item, index) : item;\n const old = oldByKey.get(key);\n\n if (old && old.item === item) {\n old.index = index;\n moveBeforeEnd(parent, old.mounted, block.endAnchor);\n nextRecords.push(old);\n oldByKey.delete(key);\n return;\n }\n\n if (old) {\n removeMountedNode(old.mounted);\n oldByKey.delete(key);\n }\n\n const record: ForRecord<T> = {\n key,\n item,\n index,\n mounted: { type: \"text\", node: domOps.createTextNode(\"\") },\n };\n\n record.mounted = withOptionalInstance(owner, () =>\n renderNodeToDOM(\n renderChild(item, () => record.index),\n parent,\n block.endAnchor,\n namespace,\n ),\n );\n nextRecords.push(record);\n });\n\n for (const record of oldByKey.values()) {\n removeMountedNode(record.mounted);\n }\n\n records = nextRecords;\n block.children = nextRecords.map((record) => record.mounted);\n\n if (initialized) {\n fireMountedAndQueueUpdated(owner);\n }\n initialized = true;\n });\n}\n\nfunction resolveShowChildren(element: SinwanElement, value: unknown): SinwanNode {\n const children = (element.props as any).children ?? element.children;\n if (typeof children === \"function\") {\n return children(value);\n }\n return children as SinwanNode;\n}\n\nfunction renderBlockContent(\n content: unknown,\n parent: Node,\n anchor: Node,\n namespace: string | null,\n owner: ComponentInstance | null,\n): MountedNode[] {\n if (content == null || typeof content === \"boolean\") {\n return [];\n }\n\n const nodes = Array.isArray(content) ? content : [content];\n return nodes.map((node) =>\n withOptionalInstance(owner, () =>\n renderNodeToDOM(node as SinwanNode, parent, anchor, namespace),\n ),\n );\n}\n\nfunction clearChildren(block: MountedReactiveBlock): void {\n for (const child of block.children) {\n removeMountedNode(child);\n }\n block.children = [];\n}\n\nfunction moveBeforeEnd(parent: Node, mounted: MountedNode, endAnchor: Node): void {\n for (const node of getMountedDomNodes(mounted)) {\n domOps.insertBefore(parent, node, endAnchor);\n }\n}\n\nfunction fireMountedAndQueueUpdated(owner: ComponentInstance | null): void {\n if (owner) {\n fireMountedHooks(owner);\n }\n queueUpdatedHooks(owner);\n}\n\nfunction withOptionalInstance<T>(\n owner: ComponentInstance | null,\n fn: () => T,\n): T {\n return owner ? withInstance(owner, fn) : fn();\n}\n\nfunction readReactive(value: unknown): unknown {\n return isSignal(value) || isComputed(value) ? (value as any).value : value;\n}\n\nfunction insertNode(parent: Node, child: Node, anchor: Node | null): void {\n if (anchor) {\n domOps.insertBefore(parent, child, anchor);\n } else {\n domOps.appendChild(parent, child);\n }\n}\n",
17
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Element Rendering\n *\n * Converts SinwanElement trees into live DOM nodes.\n * Handles intrinsic HTML elements, functional components, and fragments.\n */\n\nimport type { SinwanElement, SinwanNode } from \"../types.ts\";\nimport type { MountedNode, MountedElement, MountedComponent } from \"./types.ts\";\nimport type { CleanupFn } from \"../reactivity/index.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { applyAttributes } from \"./attributes.ts\";\nimport { bindEvents } from \"./events.ts\";\nimport { renderChildrenToDOM, renderNodeToDOM } from \"./render-children.ts\";\nimport { Fragment } from \"../jsx/jsx-runtime.ts\";\nimport { For, isForElement, isShowElement, Show } from \"../component/control-flow.ts\";\nimport { renderControlFlowToDOM } from \"./render-control-flow.ts\";\nimport {\n createComponentInstance,\n getCurrentInstance,\n setCurrentInstance,\n handleComponentError,\n type ComponentInstance,\n} from \"../component/instance.ts\";\n\n// Void elements — no children, self-closing\nconst VOID_ELEMENTS = new Set([\n \"area\",\n \"base\",\n \"br\",\n \"col\",\n \"embed\",\n \"hr\",\n \"img\",\n \"input\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst MATH_NS = \"http://www.w3.org/1998/Math/MathML\";\n\n/**\n * Render an SinwanElement to DOM and insert into parent.\n */\nexport function renderElementToDOM(\n element: SinwanElement,\n parent: Node,\n anchor: Node | null = null,\n namespace: string | null = null,\n): MountedNode {\n const { tag, props, children } = element;\n\n // Fragment — render children directly into parent\n if (tag === \"\" || (tag as any) === Fragment) {\n return renderFragmentToDOM(children, parent, anchor, namespace);\n }\n\n // Built-in control-flow components should belong to the current owner,\n // not create their own component instance.\n if (tag === Show || tag === For) {\n return renderElementToDOM((tag as Function)(props), parent, anchor, namespace);\n }\n\n if (isShowElement(element) || isForElement(element)) {\n return renderControlFlowToDOM(element, parent, anchor, namespace);\n }\n\n // Functional component — call it and render the result\n if (typeof tag === \"function\") {\n return renderComponentToDOM(tag, props, parent, anchor, namespace);\n }\n\n // Intrinsic HTML element\n if (typeof tag === \"string\") {\n return renderIntrinsicToDOM(tag, props, children, parent, anchor, namespace);\n }\n\n // Fallback — render children\n return renderFragmentToDOM(children, parent, anchor, namespace);\n}\n\n/**\n * Render an intrinsic HTML element (<div>, <p>, <button>, etc.).\n */\nfunction renderIntrinsicToDOM(\n tag: string,\n props: Record<string, unknown>,\n children: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n parentNamespace: string | null,\n): MountedElement {\n const namespace = getElementNamespace(tag, parentNamespace);\n const el = namespace\n ? domOps.createElementNS(namespace, tag)\n : domOps.createElement(tag);\n\n // Apply attributes (returns disposers for reactive attrs)\n const attrDisposers = applyAttributes(el, props);\n\n // Bind event handlers\n const eventCleanups = bindEvents(el, props);\n\n // Render children (unless void element)\n let mountedChildren: MountedNode[] = [];\n if (!VOID_ELEMENTS.has(tag)) {\n // Handle dangerouslySetInnerHTML\n const dangerous = props.dangerouslySetInnerHTML as\n | { __html?: string }\n | undefined;\n if (dangerous && typeof dangerous.__html === \"string\") {\n (el as HTMLElement).innerHTML = dangerous.__html;\n } else {\n mountedChildren = renderChildrenToDOM(\n children,\n el,\n getChildNamespace(tag, namespace),\n );\n }\n }\n\n // Insert into parent\n if (anchor) {\n domOps.insertBefore(parent, el, anchor);\n } else {\n domOps.appendChild(parent, el);\n }\n\n const refCleanup = applyRef(el, props.ref);\n\n return {\n type: \"element\",\n node: el,\n children: mountedChildren,\n eventCleanups,\n attrDisposers,\n refCleanup,\n };\n}\n\n/**\n * Render a functional component.\n *\n * Creates a ComponentInstance, sets it as the active instance during\n * setup so lifecycle hooks (onMounted, etc.) register on it, then\n * renders the returned element tree.\n */\nfunction renderComponentToDOM(\n component: Function,\n props: Record<string, unknown>,\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedComponent {\n // Create instance with parent context\n const parentInstance = getCurrentInstance();\n const instance = createComponentInstance(\n component as any,\n props,\n parentInstance,\n );\n\n // Register as child of parent\n if (parentInstance) {\n parentInstance.children.push(instance);\n }\n\n // Set this instance as current during BOTH setup AND rendering,\n // so nested child components discover it as their parent.\n const prevInstance = setCurrentInstance(instance);\n\n let result: any;\n let child: MountedNode;\n\n try {\n result = component(props);\n\n // Render the returned element tree (still under this instance)\n if (result && typeof result === \"object\" && \"tag\" in result) {\n child = renderElementToDOM(result as SinwanElement, parent, anchor, namespace);\n } else {\n child = renderNodeToDOM(result as SinwanNode, parent, anchor, namespace);\n }\n } catch (err) {\n // Restore parent before error handling\n setCurrentInstance(prevInstance);\n handleComponentError(instance, err as Error);\n // Return empty placeholder on error\n const text = domOps.createTextNode(\"\");\n if (anchor) {\n domOps.insertBefore(parent, text, anchor);\n } else {\n domOps.appendChild(parent, text);\n }\n return {\n type: \"component\",\n children: [{ type: \"text\", node: text }],\n disposers: [],\n instance,\n };\n }\n\n // Restore parent instance\n setCurrentInstance(prevInstance);\n\n instance.element = child;\n\n return {\n type: \"component\",\n children: [child],\n disposers: instance.effects,\n instance,\n };\n}\n\n/**\n * Render children as a fragment (no wrapper element).\n */\nfunction renderFragmentToDOM(\n children: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedNode {\n const anchorComment = domOps.createComment(\"Sinwan-f\");\n if (anchor) {\n domOps.insertBefore(parent, anchorComment, anchor);\n } else {\n domOps.appendChild(parent, anchorComment);\n }\n\n const mounted: MountedNode[] = [];\n for (const child of children) {\n mounted.push(renderNodeToDOM(child, parent, anchor, namespace));\n }\n\n return { type: \"fragment\", children: mounted, anchor: anchorComment };\n}\n\nfunction getElementNamespace(tag: string, parentNamespace: string | null): string | null {\n if (tag === \"svg\") return SVG_NS;\n if (tag === \"math\") return MATH_NS;\n return parentNamespace;\n}\n\nfunction getChildNamespace(tag: string, namespace: string | null): string | null {\n if (namespace === SVG_NS && tag === \"foreignObject\") {\n return null;\n }\n return namespace;\n}\n\ntype RefValue =\n | ((el: Element | null) => void)\n | { current: Element | null }\n | null\n | undefined;\n\nfunction applyRef(el: Element, ref: unknown): CleanupFn | null {\n const value = ref as RefValue;\n if (!value) {\n return null;\n }\n\n if (typeof value === \"function\") {\n value(el);\n return () => value(null);\n }\n\n if (typeof value === \"object\" && \"current\" in value) {\n value.current = el;\n return () => {\n value.current = null;\n };\n }\n\n return null;\n}\n",
18
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Child Rendering\n *\n * Renders SinwanNode children to DOM nodes. Handles primitives,\n * elements, arrays, signals, and fragments.\n */\n\nimport type { SinwanNode } from \"../types.ts\";\nimport type { MountedNode } from \"./types.ts\";\nimport { domOps } from \"./dom-ops.ts\";\nimport { isSignal } from \"../reactivity/signal.ts\";\nimport { isComputed } from \"../reactivity/computed.ts\";\nimport { effect } from \"../reactivity/effect.ts\";\nimport { renderElementToDOM } from \"./render-element.ts\";\nimport { HtmlEscapedString } from \"../jsx/jsx-runtime.ts\";\nimport {\n getCurrentInstance,\n queueUpdatedHooks,\n} from \"../component/instance.ts\";\n\n/**\n * Render a single SinwanNode to DOM and append to parent.\n * Returns the MountedNode descriptor for cleanup/unmount.\n */\nexport function renderNodeToDOM(\n node: SinwanNode,\n parent: Node,\n anchor: Node | null = null,\n namespace: string | null = null,\n): MountedNode {\n // null/undefined/boolean → empty text node (placeholder)\n if (node == null || typeof node === \"boolean\") {\n const text = domOps.createTextNode(\"\");\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // String\n if (typeof node === \"string\") {\n const text = domOps.createTextNode(node);\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Number\n if (typeof node === \"number\") {\n const text = domOps.createTextNode(String(node));\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Pre-escaped HTML string\n if (node instanceof HtmlEscapedString) {\n const text = domOps.createTextNode(node.value);\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n }\n\n // Signal or Computed → reactive text node\n if (isSignal(node) || isComputed(node)) {\n const text = domOps.createTextNode(String(node.value));\n insertNode(parent, text, anchor);\n const owner = getCurrentInstance();\n let initialized = false;\n const dispose = effect(() => {\n domOps.setTextContent(text, String((node as any).value));\n if (initialized) {\n queueUpdatedHooks(owner);\n }\n initialized = true;\n });\n return { type: \"reactive-text\", node: text, dispose };\n }\n\n // Array → fragment\n if (Array.isArray(node)) {\n return renderArrayToDOM(node, parent, anchor, namespace);\n }\n\n // Promise → placeholder (resolved async)\n if (node instanceof Promise) {\n const placeholder = domOps.createTextNode(\"\");\n insertNode(parent, placeholder, anchor);\n // TODO: async component support (Phase 3+)\n node.then((resolved) => {\n const mounted = renderNodeToDOM(resolved, parent, placeholder, namespace);\n domOps.remove(placeholder);\n });\n return { type: \"text\", node: placeholder };\n }\n\n // SinwanElement\n if (typeof node === \"object\" && \"tag\" in node) {\n return renderElementToDOM(node, parent, anchor, namespace);\n }\n\n // Fallback — coerce to string\n const text = domOps.createTextNode(String(node));\n insertNode(parent, text, anchor);\n return { type: \"text\", node: text };\n}\n\n/**\n * Render an array of children to DOM as a fragment.\n */\nfunction renderArrayToDOM(\n nodes: SinwanNode[],\n parent: Node,\n anchor: Node | null,\n namespace: string | null,\n): MountedNode {\n const anchorComment = domOps.createComment(\"Sinwan-f\");\n insertNode(parent, anchorComment, anchor);\n\n const children: MountedNode[] = [];\n for (const child of nodes) {\n children.push(renderNodeToDOM(child, parent, anchor, namespace));\n }\n\n return { type: \"fragment\", children, anchor: anchorComment };\n}\n\n/**\n * Render multiple children into a parent element.\n * Returns array of MountedNode descriptors.\n */\nexport function renderChildrenToDOM(\n children: SinwanNode[],\n parent: Node,\n namespace: string | null = null,\n): MountedNode[] {\n const mounted: MountedNode[] = [];\n for (const child of children) {\n mounted.push(renderNodeToDOM(child, parent, null, namespace));\n }\n return mounted;\n}\n\n/**\n * Insert a node into parent, optionally before an anchor.\n */\nfunction insertNode(parent: Node, child: Node, anchor: Node | null): void {\n if (anchor) {\n domOps.insertBefore(parent, child, anchor);\n } else {\n domOps.appendChild(parent, child);\n }\n}\n",
19
+ "/// <reference lib=\"dom\" />\n\n/**\n * SinwanJS Client Renderer — Mount\n *\n * Entry point for rendering a component tree into a DOM container.\n * Returns an AppInstance handle for unmounting.\n */\n\nimport type { SinwanComponent, SinwanNode, SinwanElement } from \"../types.ts\";\nimport type { AppInstance, MountedNode } from \"./types.ts\";\nimport { renderNodeToDOM } from \"./render-children.ts\";\nimport { renderElementToDOM } from \"./render-element.ts\";\nimport { unmountNode } from \"./unmount.ts\";\nimport {\n createComponentInstance,\n setCurrentInstance,\n fireMountedHooks,\n fireUnmountedHooks,\n handleComponentError,\n} from \"../component/instance.ts\";\n\n/**\n * Mount a component into a DOM container.\n *\n * Creates a root ComponentInstance, runs setup with lifecycle hooks,\n * renders to DOM, then fires onMounted hooks (bottom-up).\n *\n * @example\n * const app = mount(Counter, document.getElementById(\"app\")!, { initial: 0 });\n * // later...\n * app.unmount();\n */\nexport function mount(\n component: SinwanComponent<any>,\n container: Element,\n props?: Record<string, unknown>,\n): AppInstance {\n // Clear the container\n container.innerHTML = \"\";\n\n const mergedProps = props ?? {};\n\n // Create root component instance\n const instance = createComponentInstance(component, mergedProps, null);\n\n let result: any;\n let root: MountedNode;\n\n // Set instance as current for BOTH setup AND rendering,\n // so child components can discover their parent.\n setCurrentInstance(instance);\n\n try {\n result = component(mergedProps);\n\n if (result instanceof Promise) {\n // Async component — render placeholder, then swap\n const placeholder = document.createTextNode(\"\");\n container.appendChild(placeholder);\n root = { type: \"text\", node: placeholder };\n\n result.then((resolved) => {\n container.innerHTML = \"\";\n setCurrentInstance(instance);\n root = renderElementToDOM(resolved, container);\n setCurrentInstance(null);\n instance.element = root;\n fireMountedHooks(instance);\n });\n } else if (result && typeof result === \"object\" && \"tag\" in result) {\n root = renderElementToDOM(result, container);\n } else {\n root = renderNodeToDOM(result as SinwanNode, container);\n }\n } catch (err) {\n setCurrentInstance(null);\n handleComponentError(instance, err as Error);\n return {\n root: { type: \"text\", node: document.createTextNode(\"\") },\n unmount() {},\n };\n }\n\n // Restore — no instance is current at the top level\n setCurrentInstance(null);\n\n instance.element = root;\n\n // Fire onMounted hooks (bottom-up: children first, then parent)\n fireMountedHooks(instance);\n\n return {\n root,\n unmount() {\n // Fire onUnmounted hooks and dispose all effects\n fireUnmountedHooks(instance);\n // Clean up DOM tree\n unmountNode(root);\n container.innerHTML = \"\";\n },\n };\n}\n\n/**\n * Render a raw SinwanElement or SinwanNode tree into a container.\n * Lower-level than mount() — doesn't call a component function.\n */\nexport function render(node: SinwanNode, container: Element): AppInstance {\n container.innerHTML = \"\";\n\n const root = renderNodeToDOM(node, container);\n\n return {\n root,\n unmount() {\n unmountNode(root);\n container.innerHTML = \"\";\n },\n };\n}\n\nexport { unmountNode } from \"./unmount.ts\";\n"
20
+ ],
21
+ "mappings": "orBAUO,IAAM,EAAW,OAAO,UAAU,EAMlC,MAAM,UAA0B,MAAO,CAChB,MAA5B,WAAW,CAAiB,EAAe,CACzC,MAAM,CAAK,EADe,aAGnB,QAAQ,EAAG,CAClB,OAAO,KAAK,MAEhB,CAEO,IAAM,GAAM,CAAC,IAAgB,IAAI,EAAkB,CAAG,EAuB7D,SAAS,CAAiB,CAAC,EAA6B,CACtD,GAAI,GAAY,MAAQ,OAAO,IAAa,UAAW,MAAO,CAAC,EAC/D,GAAI,MAAM,QAAQ,CAAQ,EAAG,OAAO,EAAS,KAAK,GAAQ,EAC1D,MAAO,CAAC,CAAQ,EAOlB,SAAS,CAAY,CACnB,EACA,EACA,EACe,CAEf,GAAI,IAAS,EACX,MAAO,CAAE,IAAK,GAAI,MAAO,CAAC,EAAG,UAAS,EAQxC,GAAI,OAAO,IAAS,YAAc,OAAO,IAAS,SAAU,CAC1D,IAAM,EAAa,GAAS,CAAC,EAE7B,GAAI,EAAS,OAAS,GAAK,EAAW,WAAa,OACjD,EAAW,SAAW,EAAS,SAAW,EAAI,EAAS,GAAK,EAE9D,MAAO,CAAE,IAAK,EAAM,MAAO,EAAY,UAAS,EAIlD,MAAO,CAAE,IAAK,GAAI,MAAO,CAAC,EAAG,UAAS,EAOjC,SAAS,EAAG,CAAC,EAAW,EAAY,EAA0B,CACnE,OAAO,EAAa,EAAM,EAAO,EAAkB,GAAO,QAAQ,CAAC,EAO9D,SAAS,EAAI,CAAC,EAAW,EAAY,EAA0B,CACpE,IAAM,EAAW,GAAO,SAExB,OAAO,EACL,EACA,EACA,MAAM,QAAQ,CAAQ,EAClB,EAAS,KAAK,GAAQ,EACtB,EAAkB,CAAQ,CAChC,EAgBK,SAAS,EAAM,CACpB,EACA,EACA,EACA,EACA,EACA,EACe,CACf,IAAM,EAAW,EACb,MAAM,QAAQ,GAAO,QAAQ,EAC3B,EAAM,SAAS,KAAK,GAAQ,EAC5B,EAAkB,GAAO,QAAQ,EACnC,EAAkB,GAAO,QAAQ,EAE/B,EAAU,EAAa,EAAM,EAAO,CAAQ,EAGlD,GAAI,EACD,EAAgB,SAAW,EAG9B,OAAO,+SCrHT,SAAS,EAAmB,EAAW,CACrC,MAAO,CACL,aAAa,CAAC,EAAsB,CAClC,OAAO,SAAS,cAAc,CAAG,GAGnC,eAAe,CAAC,EAAmB,EAAsB,CACvD,OAAO,SAAS,gBAAgB,EAAW,CAAG,GAGhD,cAAc,CAAC,EAAoB,CACjC,OAAO,SAAS,eAAe,CAAI,GAGrC,aAAa,CAAC,EAAuB,CACnC,OAAO,SAAS,cAAc,CAAI,GAGpC,YAAY,CAAC,EAAa,EAAa,EAAqB,CAC1D,EAAG,aAAa,EAAK,CAAK,GAG5B,eAAe,CAAC,EAAa,EAAmB,CAC9C,EAAG,gBAAgB,CAAG,GAGxB,WAAW,CAAC,EAAa,EAAa,EAAsB,CACzD,EAAW,GAAO,GAGrB,YAAY,CAAC,EAAc,EAAa,EAA2B,CACjE,EAAO,aAAa,EAAO,CAAM,GAGnC,WAAW,CAAC,EAAc,EAAmB,CAC3C,EAAO,YAAY,CAAK,GAG1B,MAAM,CAAC,EAAkB,CACvB,EAAK,YAAY,YAAY,CAAI,GAGnC,cAAc,CAAC,EAAY,EAAoB,CAC7C,EAAK,KAAO,GAGd,gBAAgB,CAAC,EAAa,EAAe,EAA8B,CACzE,EAAG,iBAAiB,EAAO,CAAO,GAGpC,mBAAmB,CAAC,EAAa,EAAe,EAA8B,CAC5E,EAAG,oBAAoB,EAAO,CAAO,GAGvC,UAAU,CAAC,EAAyB,CAClC,OAAO,EAAK,YAGd,WAAW,CAAC,EAAyB,CACnC,OAAO,EAAK,YAEhB,EAGF,IAAM,GAAgB,GAAoB,EAK7B,EAAiB,IAAK,EAAc,EAE1C,SAAS,EAAS,CAAC,EAAkC,CAC1D,OAAO,OAAO,EAAQ,CAAS,EAG1B,SAAS,EAAW,EAAS,CAClC,QAAW,KAAO,OAAO,KAAK,CAAM,EAClC,OAAQ,EAAe,GAEzB,OAAO,OAAO,EAAQ,EAAa,EC5FrC,IAAM,EAAiB,IAAI,IACvB,EAAiB,GACjB,EAAa,GAGX,GAAmC,CAAC,EAKnC,SAAS,EAAc,CAAC,EAA0B,CACvD,GAAI,CAAC,EAAO,OAAQ,OACpB,EAAe,IAAI,CAAM,EACzB,GAAc,EAMT,SAAS,EAAgB,CAAC,EAA0B,CACzD,EAAe,OAAO,CAAM,EAM9B,SAAS,EAAa,EAAS,CAC7B,GAAI,CAAC,EACH,EAAiB,GACjB,eAAe,EAAK,EAQxB,SAAS,EAAK,EAAS,CACrB,EAAa,GAGb,IAAM,EAAS,CAAC,GAAG,CAAc,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,GAAK,EAAE,EAAE,EAC7D,EAAe,MAAM,EAErB,QAAW,KAAU,EACnB,GAAI,EAAO,OACT,EAAO,IAAI,EAMf,IAAI,EAAS,GACb,MAAO,EAAe,KAAO,GAAK,KAAW,EAAG,CAC9C,IAAM,EAAO,CAAC,GAAG,CAAc,EAAE,KAAK,CAAC,EAAG,IAAM,EAAE,GAAK,EAAE,EAAE,EAC3D,EAAe,MAAM,EACrB,QAAW,KAAU,EACnB,GAAI,EAAO,OACT,EAAO,IAAI,EAKjB,EAAiB,GACjB,EAAa,GAGb,IAAM,EAAM,GAAiB,OAAO,CAAC,EACrC,QAAW,KAAM,EACf,EAAG,EAeA,SAAS,EAAQ,CAAC,EAAgC,CACvD,OAAO,IAAI,QAAc,CAAC,IAAY,CACpC,IAAM,EAAW,IAAM,CACrB,IAAK,EACL,EAAQ,GAEV,GAAI,GAAkB,EAEpB,GAAiB,KAAK,CAAQ,EAG9B,oBAAe,CAAQ,EAE1B,EAOI,SAAS,EAAS,EAAS,CAChC,GAAI,EACF,EAAiB,GACjB,GAAM,EC7GV,IAAI,EAAsC,KACpC,EAAgC,CAAC,EACnC,GAAkB,EAiBf,MAAM,CAAqC,CAChD,GACA,OAAS,GAGD,GAGA,QAA4B,OAGpC,KAAiB,IAAI,IAErB,WAAW,CAAC,EAAc,CACxB,KAAK,GAAK,KACV,KAAK,GAAK,EAMZ,GAAG,EAAS,CACV,GAAI,CAAC,KAAK,OAAQ,OAGlB,GAAI,EAAY,SAAS,IAAI,EAAG,OAMhC,GAHA,KAAK,YAAY,EAGb,KAAK,QACP,KAAK,QAAQ,EACb,KAAK,QAAU,OAIjB,EAAY,KAAK,IAAI,EACrB,IAAM,EAAa,EACnB,EAAe,KAEf,GAAI,CACF,IAAM,EAAS,KAAK,GAAG,EACvB,GAAI,OAAO,IAAW,WACpB,KAAK,QAAU,SAEjB,CACA,EAAe,EACf,EAAY,IAAI,GAOZ,WAAW,EAAS,CAC1B,QAAW,KAAO,KAAK,KACrB,EAAI,YAAY,OAAO,IAAI,EAE7B,KAAK,KAAK,MAAM,EAMlB,MAAM,EAAS,CACb,GAAe,IAAI,EAMrB,OAAO,EAAS,CACd,GAAI,CAAC,KAAK,OAAQ,OAIlB,GAHA,KAAK,OAAS,GAGV,KAAK,QACP,KAAK,QAAQ,EACb,KAAK,QAAU,OAGjB,KAAK,YAAY,EACjB,GAAiB,IAAI,EAEzB,CAuBO,SAAS,CAAM,CAAC,EAAyB,CAC9C,IAAM,EAAI,IAAI,EAAe,CAAE,EAG/B,OADA,EAAE,IAAI,EACC,IAAM,EAAE,QAAQ,EASlB,SAAS,CAAK,CAAC,EAAgB,CACpC,GAAI,EACF,EAAI,YAAY,IAAI,CAAY,EAChC,EAAa,KAAK,IAAI,CAAG,EAQtB,SAAS,CAAO,CAAC,EAAgB,CAEtC,IAAM,EAAU,CAAC,GAAG,EAAI,WAAW,EACnC,QAAW,KAAU,EACnB,EAAO,OAAO,EC7IlB,IAAM,GAAe,OAAO,eAAe,EAI3C,MAAM,EAAwC,EAC3C,IAAgB,GAEjB,YAAc,IAAI,IACV,OACA,YAAc,IAAI,IAE1B,WAAW,CAAC,EAAY,CACtB,KAAK,OAAS,KAGZ,MAAK,EAAM,CAEb,OADA,EAAM,IAAI,EACH,KAAK,UAGV,MAAK,CAAC,EAAa,CACrB,GAAI,OAAO,GAAG,KAAK,OAAQ,CAAQ,EAAG,OACtC,KAAK,OAAS,EACd,EAAQ,IAAI,EAGZ,QAAW,KAAM,KAAK,YACpB,EAAG,CAAQ,EAIf,IAAI,EAAM,CACR,OAAO,KAAK,OAGd,SAAS,CAAC,EAAoC,CAE5C,OADA,KAAK,YAAY,IAAI,CAAE,EAChB,IAAM,CACX,KAAK,YAAY,OAAO,CAAE,GAO9B,QAAQ,EAAW,CACjB,OAAO,OAAO,KAAK,KAAK,EAM1B,OAAO,EAAM,CACX,OAAO,KAAK,MAEhB,CAiBO,SAAS,EAAS,CAAC,EAAuB,CAC/C,OAAO,IAAI,GAAW,CAAO,EAMxB,SAAS,CAAQ,CAAC,EAA0C,CACjE,OACE,GAAS,MAAQ,OAAO,IAAU,UAAY,MAAiB,EC/EnE,IAAM,GAAiB,OAAO,iBAAiB,EAI/C,MAAM,EAA4C,EAC/C,IAAkB,GAEnB,YAAc,IAAI,IAElB,OACA,OAAS,GACT,QAEA,WAAW,CAAC,EAAiB,CAC3B,IAAM,EAAO,KAIb,KAAK,QAAU,IAAI,EAAe,IAAM,CACtC,EAAK,OAAS,EAAO,EACtB,EAID,KAAK,QAAQ,OAAS,QAAS,EAAG,CAChC,GAAI,CAAC,EAAK,OACR,EAAK,OAAS,GACd,EAAQ,CAAI,GAKhB,KAAK,QAAQ,IAAI,EACjB,KAAK,OAAS,MAGZ,MAAK,EAAM,CAGb,GAFA,EAAM,IAAI,EAEN,KAAK,OACP,KAAK,QAAQ,IAAI,EACjB,KAAK,OAAS,GAGhB,OAAO,KAAK,OAGd,IAAI,EAAM,CACR,GAAI,KAAK,OACP,KAAK,QAAQ,IAAI,EACjB,KAAK,OAAS,GAEhB,OAAO,KAAK,OAMd,QAAQ,EAAW,CACjB,OAAO,OAAO,KAAK,KAAK,EAM1B,OAAO,EAAM,CACX,OAAO,KAAK,MAEhB,CAmBO,SAAS,EAAW,CAAC,EAA8B,CACxD,OAAO,IAAI,GAAa,CAAM,EAMzB,SAAS,CAAU,CAAC,EAA4C,CACrE,OACE,GAAS,MACT,OAAO,IAAU,UACjB,MAAmB,EC7GhB,SAAS,CAAW,CAAC,EAAsB,CAChD,OAAO,EAAI,OAAS,GAAK,EAAI,KAAO,KAAO,EAAI,KAAO,KAAO,EAAI,IAAO,KAAO,EAAI,IAAO,IAOrF,SAAS,EAAW,CAAC,EAAqB,CAC/C,OAAO,EAAI,MAAM,CAAC,EAAE,YAAY,EAO3B,SAAS,EAAS,CACvB,EACA,EACA,EACW,CAEX,OADA,EAAO,iBAAiB,EAAI,EAAW,CAAO,EACvC,IAAM,CACX,EAAO,oBAAoB,EAAI,EAAW,CAAO,GAQ9C,SAAS,CAAU,CACxB,EACA,EACa,CACb,IAAM,EAAwB,CAAC,EAE/B,QAAW,KAAO,OAAO,KAAK,CAAK,EACjC,GAAI,EAAY,CAAG,EAAG,CACpB,IAAM,EAAU,EAAM,GACtB,GAAI,OAAO,IAAY,WAAY,CACjC,IAAM,EAAY,GAAY,CAAG,EACjC,EAAS,KAAK,GAAU,EAAI,EAAW,CAAwB,CAAC,GAKtE,OAAO,EC7CT,IAAI,GAAa,EAoDV,SAAS,CAAuB,CACrC,EACA,EACA,EACmB,CACnB,MAAO,CACL,IAAK,KACL,YACA,QACA,QAAS,KACT,SACA,SAAU,CAAC,EACX,QAAS,CAAC,EACV,cAAe,CAAC,EAChB,gBAAiB,CAAC,EAClB,cAAe,CAAC,EAChB,YAAa,CAAC,EAEd,SAAU,EAAS,OAAO,OAAO,EAAO,QAAQ,EAAI,OAAO,OAAO,IAAI,EACtE,UAAW,GACX,YAAa,EACf,EAKF,IAAI,GAA4C,KAMzC,SAAS,CAAkB,EAA6B,CAC7D,OAAO,GAOF,SAAS,CAAkB,CAChC,EAC0B,CAC1B,IAAM,EAAO,GAEb,OADA,GAAkB,EACX,EAOF,SAAS,EAAe,CAAC,EAA6B,EAAgB,CAC3E,IAAM,EAAO,EAAmB,CAAQ,EACxC,GAAI,CACF,OAAO,EAAG,SACV,CACA,EAAmB,CAAI,GASpB,SAAS,CAAgB,CAAC,EAAmC,CAClE,GAAI,EAAS,YACX,OAIF,QAAW,KAAS,EAAS,SAC3B,EAAiB,CAAK,EAGxB,GAAI,CAAC,EAAS,UAAW,CACvB,EAAS,UAAY,GACrB,QAAW,KAAQ,EAAS,cAC1B,EAAK,GASJ,SAAS,CAAkB,CAAC,EAAmC,CAEpE,QAAW,KAAS,EAAS,SAC3B,EAAmB,CAAK,EAG1B,GAAI,EAAS,WAAa,CAAC,EAAS,YAAa,CAC/C,EAAS,YAAc,GACvB,EAAS,UAAY,GAGrB,QAAW,KAAQ,EAAS,gBAC1B,EAAK,EAIP,QAAW,KAAW,EAAS,QAC7B,EAAQ,EAEV,EAAS,QAAQ,OAAS,GAOvB,SAAS,EAAgB,CAAC,EAAmC,CAClE,QAAW,KAAQ,EAAS,cAC1B,EAAK,EAIT,IAAM,GAAqB,IAAI,IAMxB,SAAS,CAAiB,CAAC,EAA0C,CAC1E,GACE,CAAC,GACD,CAAC,EAAS,WACV,EAAS,aACT,EAAS,cAAc,SAAW,GAClC,GAAmB,IAAI,CAAQ,EAE/B,OAGF,GAAmB,IAAI,CAAQ,EAC/B,GAAS,IAAM,CAEb,GADA,GAAmB,OAAO,CAAQ,EAC9B,EAAS,WAAa,CAAC,EAAS,YAClC,GAAiB,CAAQ,EAE5B,EAMI,SAAS,CAAoB,CAClC,EACA,EACM,CACN,IAAI,EAAoC,EACxC,MAAO,EAAS,CACd,GAAI,EAAQ,YAAY,OAAS,EAAG,CAClC,QAAW,KAAQ,EAAQ,YACzB,EAAK,CAAG,EAEV,OAEF,EAAU,EAAQ,OAGpB,QAAQ,MAAM,sCAAuC,CAAG,ECrN1D,IAAM,GAAa,IAAI,IAAI,CAAC,WAAY,MAAO,MAAO,yBAAyB,CAAC,EAG1E,GAAiB,IAAI,IAAI,CAAC,QAAS,UAAW,WAAY,WAAY,WAAY,WAAY,eAAe,CAAC,EAG9G,GAAuC,CAC3C,UAAW,QACX,QAAS,MACT,SAAU,WACV,YAAa,aACf,EAOO,SAAS,CAAe,CAC7B,EACA,EACa,CACb,IAAM,EAAyB,CAAC,EAC1B,EAAQ,EAAmB,EAEjC,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAK,EAAG,CAChD,GAAI,GAAW,IAAI,CAAG,GAAK,EAAY,CAAG,EAAG,SAE7C,GAAI,EAAS,CAAK,GAAK,EAAW,CAAK,EAAG,CAExC,IAAI,EAAc,GACZ,EAAU,EAAO,IAAM,CAE3B,GADA,GAAmB,EAAI,EAAM,EAAc,KAAK,EAC5C,EACF,EAAkB,CAAK,EAEzB,EAAc,GACf,EACD,EAAU,KAAK,CAAO,EAEtB,QAAmB,EAAI,EAAK,CAAK,EAIrC,OAAO,EAMT,SAAS,EAAkB,CAAC,EAAa,EAAa,EAAsB,CAE1E,IAAM,EAAW,GAAa,IAAQ,EAGtC,GAAI,IAAa,SAAW,OAAO,IAAU,UAAY,IAAU,KAAM,CACvE,GAAW,EAAmB,CAA+B,EAC7D,OAIF,GAAI,IAAa,SAAW,OAAO,IAAU,UAAY,IAAU,KAAM,CACvE,GAAW,EAAI,CAAK,EACpB,OAIF,GAAI,GAAS,MAAQ,IAAU,GAAO,CAGpC,GAFA,EAAO,gBAAgB,EAAI,CAAQ,EAE/B,GAAe,IAAI,CAAQ,EAC7B,EAAO,YAAY,EAAI,EAAU,IAAa,QAAU,GAAK,EAAK,EAEpE,OAIF,GAAI,IAAU,GAAM,CAElB,GADA,EAAO,aAAa,EAAI,EAAU,EAAE,EAChC,GAAe,IAAI,CAAQ,EAC7B,EAAO,YAAY,EAAI,EAAU,EAAI,EAEvC,OAIF,GAAI,GAAe,IAAI,CAAQ,EAAG,CAChC,EAAO,YAAY,EAAI,EAAU,CAAK,EACtC,OAIF,EAAO,aAAa,EAAI,EAAU,OAAO,CAAK,CAAC,EAMjD,SAAS,EAAU,CAAC,EAAiB,EAAsC,CACzE,QAAY,EAAM,KAAQ,OAAO,QAAQ,CAAM,EAE7C,GAAI,EAAK,SAAS,GAAG,EACnB,EAAG,MAAM,YAAY,EAAM,CAAG,EAE9B,KAAC,EAAG,MAAc,GAAQ,EAQhC,SAAS,EAAU,CAAC,EAAa,EAAsB,CACrD,IAAI,EAEJ,GAAI,MAAM,QAAQ,CAAK,EAErB,EAAW,EAAM,OAAO,OAAO,EAAE,KAAK,GAAG,EACpC,QAAI,OAAO,IAAU,UAAY,IAAU,KAEhD,EAAW,OAAO,QAAQ,CAAK,EAC5B,OAAO,GAAI,KAAO,QAAQ,CAAC,CAAC,EAC5B,IAAI,EAAE,KAAO,CAAC,EACd,KAAK,GAAG,EAEX,OAAW,OAAO,CAAK,EAGzB,EAAO,aAAa,EAAI,QAAS,CAAQ,ECpJpC,IAAM,GAAY,OAAO,IAAI,aAAa,EACpC,GAAW,OAAO,IAAI,YAAY,EAcxC,SAAS,EAAO,CAAC,EAAoC,CAC1D,MAAO,CACL,IAAK,GACL,MAAO,EACP,SAAU,CAAC,CACb,EAGK,SAAS,EAAM,CAAC,EAAmC,CACxD,MAAO,CACL,IAAK,GACL,MAAO,EACP,SAAU,CAAC,CACb,EAGK,SAAS,CAAa,CAAC,EAAiC,CAC7D,OAAO,EAAQ,MAAQ,GAGlB,SAAS,CAAY,CAAC,EAAiC,CAC5D,OAAO,EAAQ,MAAQ,GCtBlB,SAAS,CAAkB,CAAC,EAA2B,CAC5D,OAAQ,EAAK,UACN,WACA,gBACH,MAAO,CAAC,EAAK,IAAI,MAEd,UACH,MAAO,CAAC,EAAK,IAAI,MAEd,WACH,MAAO,CACL,EAAK,OACL,GAAG,EAAK,SAAS,QAAQ,CAAC,IAAU,EAAmB,CAAK,CAAC,CAC/D,MAEG,iBACH,MAAO,CACL,EAAK,YACL,GAAG,EAAK,SAAS,QAAQ,CAAC,IAAU,EAAmB,CAAK,CAAC,EAC7D,EAAK,SACP,MAEG,YACH,OAAO,EAAK,SAAS,QAAQ,CAAC,IAAU,EAAmB,CAAK,CAAC,GAOhE,SAAS,CAAW,CAAC,EAAyB,CACnD,OAAQ,EAAK,UACN,OACH,UAEG,gBACH,EAAK,QAAQ,EACb,UAEG,UACH,QAAW,KAAW,EAAK,cACzB,EAAQ,EAEV,QAAW,KAAW,EAAK,cACzB,EAAQ,EAEV,EAAK,aAAa,EAClB,QAAW,KAAS,EAAK,SACvB,EAAY,CAAK,EAEnB,UAEG,WACH,QAAW,KAAS,EAAK,SACvB,EAAY,CAAK,EAEnB,UAEG,iBACH,EAAK,QAAQ,EACb,QAAW,KAAS,EAAK,SACvB,EAAY,CAAK,EAEnB,UAEG,YACH,GAAI,EAAK,SACP,EAAmB,EAAK,QAAQ,EAEhC,aAAW,KAAW,EAAK,UACzB,EAAQ,EAGZ,QAAW,KAAS,EAAK,SACvB,EAAY,CAAK,EAEnB,OAOC,SAAS,CAAiB,CAAC,EAAyB,CACzD,IAAM,EAAW,EAAmB,CAAI,EACxC,EAAY,CAAI,EAChB,QAAW,KAAW,EACpB,GAAI,EAAQ,WACV,EAAO,OAAO,CAAO,ECjEpB,SAAS,EAAsB,CACpC,EACA,EACA,EACA,EACsB,CACtB,IAAM,EAAc,EAAO,cAAc,UAAU,EAC7C,EAAY,EAAO,cAAc,WAAW,EAClD,GAAW,EAAQ,EAAa,CAAM,EACtC,GAAW,EAAQ,EAAW,CAAM,EAEpC,IAAM,EAAQ,EAAmB,EAC7B,EAAgB,IAAM,GAEpB,EAA8B,CAClC,KAAM,iBACN,QAAS,IAAM,EAAc,EAC7B,SAAU,CAAC,EACX,cACA,WACF,EAEA,GAAI,EAAc,CAAO,EACvB,EAAgB,GAAgB,EAAS,EAAO,EAAQ,EAAW,CAAK,EACnE,QAAI,EAAa,CAAO,EAC7B,EAAgB,GAAe,EAAS,EAAO,EAAQ,EAAW,CAAK,EAGzE,OAAO,EAGT,SAAS,EAAe,CACtB,EACA,EACA,EACA,EACA,EACY,CACZ,IAAI,EAAc,GAElB,OAAO,EAAO,IAAM,CAClB,GAAc,CAAK,EAEnB,IAAM,EAAO,GAAc,EAAQ,MAAc,IAAI,EAC/C,EAAU,GAAqB,EAAO,IAC1C,EAAO,GAAoB,EAAS,CAAI,EAAK,EAAQ,MAAc,QACrE,EAUA,GARA,EAAM,SAAW,GACf,EACA,EACA,EAAM,UACN,EACA,CACF,EAEI,EACF,GAA2B,CAAK,EAElC,EAAc,GACf,EAGH,SAAS,EAAiB,CACxB,EACA,EACA,EACA,EACA,EACY,CACZ,IAAI,EAAc,GACd,EAA0B,CAAC,EAE/B,OAAO,EAAO,IAAM,CAClB,IAAM,EAAQ,EAAQ,MAKhB,EAAQ,GAAa,EAAM,IAAI,EAC/B,EAAO,MAAM,QAAQ,CAAK,EAAI,EAAQ,CAAC,EACvC,EAAc,EAAM,SAE1B,GAAI,OAAO,IAAgB,WAAY,CAGrC,GAFA,GAAc,CAAK,EACnB,EAAU,CAAC,EACP,EACF,EAAkB,CAAK,EAEzB,EAAc,GACd,OAGF,IAAM,EAAW,IAAI,IACrB,QAAW,KAAU,EACnB,EAAS,IAAI,EAAO,IAAK,CAAM,EAGjC,IAAM,EAA8B,CAAC,EAErC,EAAK,QAAQ,CAAC,EAAM,IAAU,CAC5B,IAAM,EAAM,EAAM,IAAM,EAAM,IAAI,EAAM,CAAK,EAAI,EAC3C,EAAM,EAAS,IAAI,CAAG,EAE5B,GAAI,GAAO,EAAI,OAAS,EAAM,CAC5B,EAAI,MAAQ,EACZ,GAAc,EAAQ,EAAI,QAAS,EAAM,SAAS,EAClD,EAAY,KAAK,CAAG,EACpB,EAAS,OAAO,CAAG,EACnB,OAGF,GAAI,EACF,EAAkB,EAAI,OAAO,EAC7B,EAAS,OAAO,CAAG,EAGrB,IAAM,EAAuB,CAC3B,MACA,OACA,QACA,QAAS,CAAE,KAAM,OAAQ,KAAM,EAAO,eAAe,EAAE,CAAE,CAC3D,EAEA,EAAO,QAAU,GAAqB,EAAO,IAC3C,EACE,EAAY,EAAM,IAAM,EAAO,KAAK,EACpC,EACA,EAAM,UACN,CACF,CACF,EACA,EAAY,KAAK,CAAM,EACxB,EAED,QAAW,KAAU,EAAS,OAAO,EACnC,EAAkB,EAAO,OAAO,EAMlC,GAHA,EAAU,EACV,EAAM,SAAW,EAAY,IAAI,CAAC,IAAW,EAAO,OAAO,EAEvD,EACF,GAA2B,CAAK,EAElC,EAAc,GACf,EAGH,SAAS,EAAmB,CAAC,EAAwB,EAA4B,CAC/E,IAAM,EAAY,EAAQ,MAAc,UAAY,EAAQ,SAC5D,GAAI,OAAO,IAAa,WACtB,OAAO,EAAS,CAAK,EAEvB,OAAO,EAGT,SAAS,EAAkB,CACzB,EACA,EACA,EACA,EACA,EACe,CACf,GAAI,GAAW,MAAQ,OAAO,IAAY,UACxC,MAAO,CAAC,EAIV,OADc,MAAM,QAAQ,CAAO,EAAI,EAAU,CAAC,CAAO,GAC5C,IAAI,CAAC,IAChB,GAAqB,EAAO,IAC1B,EAAgB,EAAoB,EAAQ,EAAQ,CAAS,CAC/D,CACF,EAGF,SAAS,EAAa,CAAC,EAAmC,CACxD,QAAW,KAAS,EAAM,SACxB,EAAkB,CAAK,EAEzB,EAAM,SAAW,CAAC,EAGpB,SAAS,EAAa,CAAC,EAAc,EAAsB,EAAuB,CAChF,QAAW,KAAQ,EAAmB,CAAO,EAC3C,EAAO,aAAa,EAAQ,EAAM,CAAS,EAI/C,SAAS,EAA0B,CAAC,EAAuC,CACzE,GAAI,EACF,EAAiB,CAAK,EAExB,EAAkB,CAAK,EAGzB,SAAS,EAAuB,CAC9B,EACA,EACG,CACH,OAAO,EAAQ,GAAa,EAAO,CAAE,EAAI,EAAG,EAG9C,SAAS,EAAY,CAAC,EAAyB,CAC7C,OAAO,EAAS,CAAK,GAAK,EAAW,CAAK,EAAK,EAAc,MAAQ,EAGvE,SAAS,EAAU,CAAC,EAAc,EAAa,EAA2B,CACxE,GAAI,EACF,EAAO,aAAa,EAAQ,EAAO,CAAM,EAEzC,OAAO,YAAY,EAAQ,CAAK,EC9NpC,IAAM,GAAgB,IAAI,IAAI,CAC5B,OACA,OACA,KACA,MACA,QACA,KACA,MACA,QACA,OACA,OACA,QACA,SACA,QACA,KACF,CAAC,EAEK,GAAS,6BACT,GAAU,qCAKT,SAAS,CAAkB,CAChC,EACA,EACA,EAAsB,KACtB,EAA2B,KACd,CACb,IAAQ,MAAK,QAAO,YAAa,EAGjC,GAAI,IAAQ,IAAO,IAAgB,EACjC,OAAO,GAAoB,EAAU,EAAQ,EAAQ,CAAS,EAKhE,GAAI,IAAQ,IAAQ,IAAQ,GAC1B,OAAO,EAAoB,EAAiB,CAAK,EAAG,EAAQ,EAAQ,CAAS,EAG/E,GAAI,EAAc,CAAO,GAAK,EAAa,CAAO,EAChD,OAAO,GAAuB,EAAS,EAAQ,EAAQ,CAAS,EAIlE,GAAI,OAAO,IAAQ,WACjB,OAAO,GAAqB,EAAK,EAAO,EAAQ,EAAQ,CAAS,EAInE,GAAI,OAAO,IAAQ,SACjB,OAAO,GAAqB,EAAK,EAAO,EAAU,EAAQ,EAAQ,CAAS,EAI7E,OAAO,GAAoB,EAAU,EAAQ,EAAQ,CAAS,EAMhE,SAAS,EAAoB,CAC3B,EACA,EACA,EACA,EACA,EACA,EACgB,CAChB,IAAM,EAAY,GAAoB,EAAK,CAAe,EACpD,EAAK,EACP,EAAO,gBAAgB,EAAW,CAAG,EACrC,EAAO,cAAc,CAAG,EAGtB,EAAgB,EAAgB,EAAI,CAAK,EAGzC,EAAgB,EAAW,EAAI,CAAK,EAGtC,EAAiC,CAAC,EACtC,GAAI,CAAC,GAAc,IAAI,CAAG,EAAG,CAE3B,IAAM,EAAY,EAAM,wBAGxB,GAAI,GAAa,OAAO,EAAU,SAAW,SAC1C,EAAmB,UAAY,EAAU,OAE1C,OAAkB,EAChB,EACA,EACA,GAAkB,EAAK,CAAS,CAClC,EAKJ,GAAI,EACF,EAAO,aAAa,EAAQ,EAAI,CAAM,EAEtC,OAAO,YAAY,EAAQ,CAAE,EAG/B,IAAM,EAAa,GAAS,EAAI,EAAM,GAAG,EAEzC,MAAO,CACL,KAAM,UACN,KAAM,EACN,SAAU,EACV,gBACA,gBACA,YACF,EAUF,SAAS,EAAoB,CAC3B,EACA,EACA,EACA,EACA,EACkB,CAElB,IAAM,EAAiB,EAAmB,EACpC,EAAW,EACf,EACA,EACA,CACF,EAGA,GAAI,EACF,EAAe,SAAS,KAAK,CAAQ,EAKvC,IAAM,EAAe,EAAmB,CAAQ,EAE5C,EACA,EAEJ,GAAI,CAIF,GAHA,EAAS,EAAU,CAAK,EAGpB,GAAU,OAAO,IAAW,UAAY,QAAS,EACnD,EAAQ,EAAmB,EAAyB,EAAQ,EAAQ,CAAS,EAE7E,OAAQ,EAAgB,EAAsB,EAAQ,EAAQ,CAAS,EAEzE,MAAO,EAAK,CAEZ,EAAmB,CAAY,EAC/B,EAAqB,EAAU,CAAY,EAE3C,IAAM,EAAO,EAAO,eAAe,EAAE,EACrC,GAAI,EACF,EAAO,aAAa,EAAQ,EAAM,CAAM,EAExC,OAAO,YAAY,EAAQ,CAAI,EAEjC,MAAO,CACL,KAAM,YACN,SAAU,CAAC,CAAE,KAAM,OAAQ,KAAM,CAAK,CAAC,EACvC,UAAW,CAAC,EACZ,UACF,EAQF,OAJA,EAAmB,CAAY,EAE/B,EAAS,QAAU,EAEZ,CACL,KAAM,YACN,SAAU,CAAC,CAAK,EAChB,UAAW,EAAS,QACpB,UACF,EAMF,SAAS,EAAmB,CAC1B,EACA,EACA,EACA,EACa,CACb,IAAM,EAAgB,EAAO,cAAc,UAAU,EACrD,GAAI,EACF,EAAO,aAAa,EAAQ,EAAe,CAAM,EAEjD,OAAO,YAAY,EAAQ,CAAa,EAG1C,IAAM,EAAyB,CAAC,EAChC,QAAW,KAAS,EAClB,EAAQ,KAAK,EAAgB,EAAO,EAAQ,EAAQ,CAAS,CAAC,EAGhE,MAAO,CAAE,KAAM,WAAY,SAAU,EAAS,OAAQ,CAAc,EAGtE,SAAS,EAAmB,CAAC,EAAa,EAA+C,CACvF,GAAI,IAAQ,MAAO,OAAO,GAC1B,GAAI,IAAQ,OAAQ,OAAO,GAC3B,OAAO,EAGT,SAAS,EAAiB,CAAC,EAAa,EAAyC,CAC/E,GAAI,IAAc,IAAU,IAAQ,gBAClC,OAAO,KAET,OAAO,EAST,SAAS,EAAQ,CAAC,EAAa,EAAgC,CAC7D,IAAM,EAAQ,EACd,GAAI,CAAC,EACH,OAAO,KAGT,GAAI,OAAO,IAAU,WAEnB,OADA,EAAM,CAAE,EACD,IAAM,EAAM,IAAI,EAGzB,GAAI,OAAO,IAAU,UAAY,YAAa,EAE5C,OADA,EAAM,QAAU,EACT,IAAM,CACX,EAAM,QAAU,MAIpB,OAAO,KCjQF,SAAS,CAAe,CAC7B,EACA,EACA,EAAsB,KACtB,EAA2B,KACd,CAEb,GAAI,GAAQ,MAAQ,OAAO,IAAS,UAAW,CAC7C,IAAM,EAAO,EAAO,eAAe,EAAE,EAErC,OADA,EAAW,EAAQ,EAAM,CAAM,EACxB,CAAE,KAAM,OAAQ,KAAM,CAAK,EAIpC,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAO,EAAO,eAAe,CAAI,EAEvC,OADA,EAAW,EAAQ,EAAM,CAAM,EACxB,CAAE,KAAM,OAAQ,KAAM,CAAK,EAIpC,GAAI,OAAO,IAAS,SAAU,CAC5B,IAAM,EAAO,EAAO,eAAe,OAAO,CAAI,CAAC,EAE/C,OADA,EAAW,EAAQ,EAAM,CAAM,EACxB,CAAE,KAAM,OAAQ,KAAM,CAAK,EAIpC,GAAI,aAAgB,EAAmB,CACrC,IAAM,EAAO,EAAO,eAAe,EAAK,KAAK,EAE7C,OADA,EAAW,EAAQ,EAAM,CAAM,EACxB,CAAE,KAAM,OAAQ,KAAM,CAAK,EAIpC,GAAI,EAAS,CAAI,GAAK,EAAW,CAAI,EAAG,CACtC,IAAM,EAAO,EAAO,eAAe,OAAO,EAAK,KAAK,CAAC,EACrD,EAAW,EAAQ,EAAM,CAAM,EAC/B,IAAM,EAAQ,EAAmB,EAC7B,EAAc,GACZ,EAAU,EAAO,IAAM,CAE3B,GADA,EAAO,eAAe,EAAM,OAAQ,EAAa,KAAK,CAAC,EACnD,EACF,EAAkB,CAAK,EAEzB,EAAc,GACf,EACD,MAAO,CAAE,KAAM,gBAAiB,KAAM,EAAM,SAAQ,EAItD,GAAI,MAAM,QAAQ,CAAI,EACpB,OAAO,GAAiB,EAAM,EAAQ,EAAQ,CAAS,EAIzD,GAAI,aAAgB,QAAS,CAC3B,IAAM,EAAc,EAAO,eAAe,EAAE,EAO5C,OANA,EAAW,EAAQ,EAAa,CAAM,EAEtC,EAAK,KAAK,CAAC,IAAa,CACtB,IAAM,EAAU,EAAgB,EAAU,EAAQ,EAAa,CAAS,EACxE,EAAO,OAAO,CAAW,EAC1B,EACM,CAAE,KAAM,OAAQ,KAAM,CAAY,EAI3C,GAAI,OAAO,IAAS,UAAY,QAAS,EACvC,OAAO,EAAmB,EAAM,EAAQ,EAAQ,CAAS,EAI3D,IAAM,EAAO,EAAO,eAAe,OAAO,CAAI,CAAC,EAE/C,OADA,EAAW,EAAQ,EAAM,CAAM,EACxB,CAAE,KAAM,OAAQ,KAAM,CAAK,EAMpC,SAAS,EAAgB,CACvB,EACA,EACA,EACA,EACa,CACb,IAAM,EAAgB,EAAO,cAAc,UAAU,EACrD,EAAW,EAAQ,EAAe,CAAM,EAExC,IAAM,EAA0B,CAAC,EACjC,QAAW,KAAS,EAClB,EAAS,KAAK,EAAgB,EAAO,EAAQ,EAAQ,CAAS,CAAC,EAGjE,MAAO,CAAE,KAAM,WAAY,WAAU,OAAQ,CAAc,EAOtD,SAAS,CAAmB,CACjC,EACA,EACA,EAA2B,KACZ,CACf,IAAM,EAAyB,CAAC,EAChC,QAAW,KAAS,EAClB,EAAQ,KAAK,EAAgB,EAAO,EAAQ,KAAM,CAAS,CAAC,EAE9D,OAAO,EAMT,SAAS,CAAU,CAAC,EAAc,EAAa,EAA2B,CACxE,GAAI,EACF,EAAO,aAAa,EAAQ,EAAO,CAAM,EAEzC,OAAO,YAAY,EAAQ,CAAK,EClH7B,SAAS,EAAK,CACnB,EACA,EACA,EACa,CAEb,EAAU,UAAY,GAEtB,IAAM,EAAc,GAAS,CAAC,EAGxB,EAAW,EAAwB,EAAW,EAAa,IAAI,EAEjE,EACA,EAIJ,EAAmB,CAAQ,EAE3B,GAAI,CAGF,GAFA,EAAS,EAAU,CAAW,EAE1B,aAAkB,QAAS,CAE7B,IAAM,EAAc,SAAS,eAAe,EAAE,EAC9C,EAAU,YAAY,CAAW,EACjC,EAAO,CAAE,KAAM,OAAQ,KAAM,CAAY,EAEzC,EAAO,KAAK,CAAC,IAAa,CACxB,EAAU,UAAY,GACtB,EAAmB,CAAQ,EAC3B,EAAO,EAAmB,EAAU,CAAS,EAC7C,EAAmB,IAAI,EACvB,EAAS,QAAU,EACnB,EAAiB,CAAQ,EAC1B,EACI,QAAI,GAAU,OAAO,IAAW,UAAY,QAAS,EAC1D,EAAO,EAAmB,EAAQ,CAAS,EAE3C,OAAO,EAAgB,EAAsB,CAAS,EAExD,MAAO,EAAK,CAGZ,OAFA,EAAmB,IAAI,EACvB,EAAqB,EAAU,CAAY,EACpC,CACL,KAAM,CAAE,KAAM,OAAQ,KAAM,SAAS,eAAe,EAAE,CAAE,EACxD,OAAO,EAAG,EACZ,EAWF,OAPA,EAAmB,IAAI,EAEvB,EAAS,QAAU,EAGnB,EAAiB,CAAQ,EAElB,CACL,OACA,OAAO,EAAG,CAER,EAAmB,CAAQ,EAE3B,EAAY,CAAI,EAChB,EAAU,UAAY,GAE1B,EAOK,SAAS,EAAM,CAAC,EAAkB,EAAiC,CACxE,EAAU,UAAY,GAEtB,IAAM,EAAO,EAAgB,EAAM,CAAS,EAE5C,MAAO,CACL,OACA,OAAO,EAAG,CACR,EAAY,CAAI,EAChB,EAAU,UAAY,GAE1B",
22
+ "debugId": "9C7A44BD060D1ED664756E2164756E21",
23
+ "names": []
24
+ }