@llui/dom 0.0.19 → 0.0.21

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 (109) hide show
  1. package/README.md +25 -21
  2. package/dist/addressed.d.ts +1 -1
  3. package/dist/addressed.d.ts.map +1 -1
  4. package/dist/addressed.js.map +1 -1
  5. package/dist/binding.d.ts +2 -2
  6. package/dist/binding.d.ts.map +1 -1
  7. package/dist/binding.js +2 -2
  8. package/dist/binding.js.map +1 -1
  9. package/dist/devtools.d.ts +3 -3
  10. package/dist/devtools.d.ts.map +1 -1
  11. package/dist/devtools.js +14 -12
  12. package/dist/devtools.js.map +1 -1
  13. package/dist/el-split.js +3 -3
  14. package/dist/el-split.js.map +1 -1
  15. package/dist/el-template.js +3 -3
  16. package/dist/el-template.js.map +1 -1
  17. package/dist/elements.js +1 -1
  18. package/dist/elements.js.map +1 -1
  19. package/dist/hmr.d.ts +2 -1
  20. package/dist/hmr.d.ts.map +1 -1
  21. package/dist/hmr.js +74 -34
  22. package/dist/hmr.js.map +1 -1
  23. package/dist/index.d.ts +7 -3
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +4 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/internal.d.ts +1 -1
  28. package/dist/internal.d.ts.map +1 -1
  29. package/dist/internal.js +1 -1
  30. package/dist/internal.js.map +1 -1
  31. package/dist/lifetime.d.ts +39 -0
  32. package/dist/lifetime.d.ts.map +1 -0
  33. package/dist/lifetime.js +250 -0
  34. package/dist/lifetime.js.map +1 -0
  35. package/dist/mathml-elements.js +1 -1
  36. package/dist/mathml-elements.js.map +1 -1
  37. package/dist/mount.d.ts +41 -7
  38. package/dist/mount.d.ts.map +1 -1
  39. package/dist/mount.js +216 -9
  40. package/dist/mount.js.map +1 -1
  41. package/dist/primitives/branch.d.ts.map +1 -1
  42. package/dist/primitives/branch.js +30 -20
  43. package/dist/primitives/branch.js.map +1 -1
  44. package/dist/primitives/child.js +12 -12
  45. package/dist/primitives/child.js.map +1 -1
  46. package/dist/primitives/context.js +6 -6
  47. package/dist/primitives/context.js.map +1 -1
  48. package/dist/primitives/each.d.ts.map +1 -1
  49. package/dist/primitives/each.js +37 -32
  50. package/dist/primitives/each.js.map +1 -1
  51. package/dist/primitives/error-boundary.js +7 -7
  52. package/dist/primitives/error-boundary.js.map +1 -1
  53. package/dist/primitives/foreign.js +3 -3
  54. package/dist/primitives/foreign.js.map +1 -1
  55. package/dist/primitives/lazy.js +11 -11
  56. package/dist/primitives/lazy.js.map +1 -1
  57. package/dist/primitives/on-mount.js +2 -2
  58. package/dist/primitives/on-mount.js.map +1 -1
  59. package/dist/primitives/portal.js +4 -4
  60. package/dist/primitives/portal.js.map +1 -1
  61. package/dist/primitives/sample.d.ts +18 -0
  62. package/dist/primitives/sample.d.ts.map +1 -0
  63. package/dist/primitives/sample.js +22 -0
  64. package/dist/primitives/sample.js.map +1 -0
  65. package/dist/primitives/scope.d.ts +25 -0
  66. package/dist/primitives/scope.d.ts.map +1 -0
  67. package/dist/primitives/scope.js +36 -0
  68. package/dist/primitives/scope.js.map +1 -0
  69. package/dist/primitives/selector.js +4 -4
  70. package/dist/primitives/selector.js.map +1 -1
  71. package/dist/primitives/show.d.ts.map +1 -1
  72. package/dist/primitives/show.js +4 -1
  73. package/dist/primitives/show.js.map +1 -1
  74. package/dist/primitives/slice.d.ts.map +1 -1
  75. package/dist/primitives/slice.js +16 -1
  76. package/dist/primitives/slice.js.map +1 -1
  77. package/dist/primitives/text.js +3 -3
  78. package/dist/primitives/text.js.map +1 -1
  79. package/dist/primitives/unsafe-html.d.ts +28 -0
  80. package/dist/primitives/unsafe-html.d.ts.map +1 -0
  81. package/dist/primitives/unsafe-html.js +82 -0
  82. package/dist/primitives/unsafe-html.js.map +1 -0
  83. package/dist/primitives/virtual-each.d.ts.map +1 -1
  84. package/dist/primitives/virtual-each.js +9 -9
  85. package/dist/primitives/virtual-each.js.map +1 -1
  86. package/dist/render-context.d.ts +2 -2
  87. package/dist/render-context.d.ts.map +1 -1
  88. package/dist/render-context.js.map +1 -1
  89. package/dist/ssr.d.ts +4 -4
  90. package/dist/ssr.d.ts.map +1 -1
  91. package/dist/ssr.js +3 -3
  92. package/dist/ssr.js.map +1 -1
  93. package/dist/svg-elements.js +1 -1
  94. package/dist/svg-elements.js.map +1 -1
  95. package/dist/tracking/disposer-log.d.ts +4 -4
  96. package/dist/tracking/disposer-log.d.ts.map +1 -1
  97. package/dist/tracking/disposer-log.js.map +1 -1
  98. package/dist/types.d.ts +50 -9
  99. package/dist/types.d.ts.map +1 -1
  100. package/dist/types.js.map +1 -1
  101. package/dist/update-loop.d.ts +3 -3
  102. package/dist/update-loop.d.ts.map +1 -1
  103. package/dist/update-loop.js +12 -8
  104. package/dist/update-loop.js.map +1 -1
  105. package/dist/view-helpers.d.ts +15 -1
  106. package/dist/view-helpers.d.ts.map +1 -1
  107. package/dist/view-helpers.js +6 -0
  108. package/dist/view-helpers.js.map +1 -1
  109. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"render-context.js","sourceRoot":"","sources":["../src/render-context.ts"],"names":[],"mappings":"AAkBA,IAAI,cAAc,GAAyB,IAAI,CAAA;AAE/C,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,cAAc,GAAG,GAAG,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,aAAsB;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,YAAY,CAAA;QAChE,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,4DAA4D;YACxE,0DAA0D;YAC1D,sEAAsE;YACtE,yEAAyE;YACzE,0EAA0E;YAC1E,0EAA0E;YAC1E,gCAAgC;YAChC,yEAAyE;YACzE,sEAAsE,CACzE,CAAA;IACH,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC","sourcesContent":["import type { Scope, Binding } from './types.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { ComponentInstance } from './update-loop.js'\n\nexport interface RenderContext {\n rootScope: Scope\n state: unknown\n allBindings: Binding[]\n structuralBlocks: StructuralBlock[]\n container?: Element\n send?: (msg: unknown) => void\n /** @internal dev-only — the owning ComponentInstance. Set by mount /\n * hydrate / child to let primitives (currently `each`) emit tracker\n * data to `inst._eachDiffLog`. Nested contexts pass through via\n * spread (e.g. `{ ...ctx, rootScope }`). Undefined outside dev. */\n instance?: ComponentInstance\n}\n\nlet currentContext: RenderContext | null = null\n\nexport function setRenderContext(ctx: RenderContext): void {\n currentContext = ctx\n}\n\nexport function clearRenderContext(): void {\n currentContext = null\n}\n\nexport function getRenderContext(primitiveName?: string): RenderContext {\n if (!currentContext) {\n const name = primitiveName ? `${primitiveName}()` : 'primitives'\n throw new Error(\n `[LLui] ${name} can only be called inside a component's view() function. ` +\n `It was called outside a render context. Common causes:\\n` +\n ` 1. Calling a primitive at module scope instead of inside view().\\n` +\n ` 2. Calling an overlay helper (dialog.overlay, popover.overlay, …) at ` +\n `module scope — these internally use show()/branch() and must be invoked ` +\n `from inside the component's view callback so their result can be spread ` +\n `into the returned node tree.\\n` +\n ` 3. Calling a primitive from a setTimeout / Promise / event handler — ` +\n `the render context only persists during the synchronous view() call.`,\n )\n }\n return currentContext\n}\n"]}
1
+ {"version":3,"file":"render-context.js","sourceRoot":"","sources":["../src/render-context.ts"],"names":[],"mappings":"AAkBA,IAAI,cAAc,GAAyB,IAAI,CAAA;AAE/C,MAAM,UAAU,gBAAgB,CAAC,GAAkB;IACjD,cAAc,GAAG,GAAG,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,aAAsB;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,CAAC,CAAC,CAAC,YAAY,CAAA;QAChE,MAAM,IAAI,KAAK,CACb,UAAU,IAAI,4DAA4D;YACxE,0DAA0D;YAC1D,sEAAsE;YACtE,yEAAyE;YACzE,0EAA0E;YAC1E,0EAA0E;YAC1E,gCAAgC;YAChC,yEAAyE;YACzE,sEAAsE,CACzE,CAAA;IACH,CAAC;IACD,OAAO,cAAc,CAAA;AACvB,CAAC","sourcesContent":["import type { Lifetime, Binding } from './types.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { ComponentInstance } from './update-loop.js'\n\nexport interface RenderContext {\n rootLifetime: Lifetime\n state: unknown\n allBindings: Binding[]\n structuralBlocks: StructuralBlock[]\n container?: Element\n send?: (msg: unknown) => void\n /** @internal dev-only — the owning ComponentInstance. Set by mount /\n * hydrate / child to let primitives (currently `each`) emit tracker\n * data to `inst._eachDiffLog`. Nested contexts pass through via\n * spread (e.g. `{ ...ctx, rootLifetime }`). Undefined outside dev. */\n instance?: ComponentInstance\n}\n\nlet currentContext: RenderContext | null = null\n\nexport function setRenderContext(ctx: RenderContext): void {\n currentContext = ctx\n}\n\nexport function clearRenderContext(): void {\n currentContext = null\n}\n\nexport function getRenderContext(primitiveName?: string): RenderContext {\n if (!currentContext) {\n const name = primitiveName ? `${primitiveName}()` : 'primitives'\n throw new Error(\n `[LLui] ${name} can only be called inside a component's view() function. ` +\n `It was called outside a render context. Common causes:\\n` +\n ` 1. Calling a primitive at module scope instead of inside view().\\n` +\n ` 2. Calling an overlay helper (dialog.overlay, popover.overlay, …) at ` +\n `module scope — these internally use show()/branch() and must be invoked ` +\n `from inside the component's view callback so their result can be spread ` +\n `into the returned node tree.\\n` +\n ` 3. Calling a primitive from a setTimeout / Promise / event handler — ` +\n `the render context only persists during the synchronous view() call.`,\n )\n }\n return currentContext\n}\n"]}
package/dist/ssr.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ComponentDef, Scope, Binding } from './types.js';
1
+ import type { ComponentDef, Lifetime, Binding } from './types.js';
2
2
  import { type ComponentInstance } from './update-loop.js';
3
3
  /**
4
4
  * Render a component to DOM nodes for SSR, returning both the produced
@@ -6,14 +6,14 @@ import { type ComponentInstance } from './update-loop.js';
6
6
  * serializing — e.g. `@llui/vike` stitches layout + page nodes at the
7
7
  * `pageSlot()` marker position before one final serialization pass).
8
8
  *
9
- * Accepts an optional `parentScope` so the rendered instance's rootScope
9
+ * Accepts an optional `parentLifetime` so the rendered instance's rootLifetime
10
10
  * becomes a child of an existing scope tree — used by persistent layouts
11
11
  * so contexts provided by an outer layout are reachable from an inner
12
12
  * page via `useContext`.
13
13
  *
14
14
  * Call `initSsrDom()` once before using this on the server.
15
15
  */
16
- export declare function renderNodes<S, M, E>(def: ComponentDef<S, M, E>, initialState?: S, parentScope?: Scope): {
16
+ export declare function renderNodes<S, M, E, D = void>(def: ComponentDef<S, M, E, D>, initialState?: S, parentLifetime?: Lifetime): {
17
17
  nodes: Node[];
18
18
  inst: ComponentInstance<S, M, E>;
19
19
  };
@@ -38,5 +38,5 @@ export declare function serializeNodes(nodes: Node[], bindings: Binding[]): stri
38
38
  * For persistent layouts, use `renderNodes` + `serializeNodes` directly
39
39
  * so layout and page nodes can be composed before serialization.
40
40
  */
41
- export declare function renderToString<S, M, E>(def: ComponentDef<S, M, E>, initialState?: S): string;
41
+ export declare function renderToString<S, M, E, D = void>(def: ComponentDef<S, M, E, D>, initialState?: S): string;
42
42
  //# sourceMappingURL=ssr.d.ts.map
package/dist/ssr.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAKlF;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,YAAY,CAAC,EAAE,CAAC,EAChB,WAAW,CAAC,EAAE,KAAK,GAClB;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAiBrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAezE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,MAAM,CAG5F"}
1
+ {"version":3,"file":"ssr.d.ts","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAKlF;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAC3C,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,YAAY,CAAC,EAAE,CAAC,EAChB,cAAc,CAAC,EAAE,QAAQ,GACxB;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAAE,CAiBrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM,CAezE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAC9C,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,YAAY,CAAC,EAAE,CAAC,GACf,MAAM,CAGR"}
package/dist/ssr.js CHANGED
@@ -8,15 +8,15 @@ import { createView } from './view-helpers.js';
8
8
  * serializing — e.g. `@llui/vike` stitches layout + page nodes at the
9
9
  * `pageSlot()` marker position before one final serialization pass).
10
10
  *
11
- * Accepts an optional `parentScope` so the rendered instance's rootScope
11
+ * Accepts an optional `parentLifetime` so the rendered instance's rootLifetime
12
12
  * becomes a child of an existing scope tree — used by persistent layouts
13
13
  * so contexts provided by an outer layout are reachable from an inner
14
14
  * page via `useContext`.
15
15
  *
16
16
  * Call `initSsrDom()` once before using this on the server.
17
17
  */
18
- export function renderNodes(def, initialState, parentScope) {
19
- const inst = createComponentInstance(def, undefined, parentScope ?? null);
18
+ export function renderNodes(def, initialState, parentLifetime) {
19
+ const inst = createComponentInstance(def, undefined, parentLifetime ?? null);
20
20
  if (initialState !== undefined) {
21
21
  inst.state = initialState;
22
22
  }
package/dist/ssr.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ssr.js","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, Scope, Binding } from './types.js'\nimport { createComponentInstance, type ComponentInstance } from './update-loop.js'\nimport { setRenderContext, clearRenderContext } from './render-context.js'\nimport { setFlatBindings } from './binding.js'\nimport { createView } from './view-helpers.js'\n\n/**\n * Render a component to DOM nodes for SSR, returning both the produced\n * nodes and the component instance (so callers can compose trees before\n * serializing — e.g. `@llui/vike` stitches layout + page nodes at the\n * `pageSlot()` marker position before one final serialization pass).\n *\n * Accepts an optional `parentScope` so the rendered instance's rootScope\n * becomes a child of an existing scope tree — used by persistent layouts\n * so contexts provided by an outer layout are reachable from an inner\n * page via `useContext`.\n *\n * Call `initSsrDom()` once before using this on the server.\n */\nexport function renderNodes<S, M, E>(\n def: ComponentDef<S, M, E>,\n initialState?: S,\n parentScope?: Scope,\n): { nodes: Node[]; inst: ComponentInstance<S, M, E> } {\n const inst = createComponentInstance(def, undefined, parentScope ?? null)\n if (initialState !== undefined) {\n inst.state = initialState\n }\n\n setFlatBindings(inst.allBindings)\n setRenderContext({\n ...inst,\n send: inst.send as (msg: unknown) => void,\n instance: inst as ComponentInstance,\n })\n const nodes = def.view(createView<S, M>(inst.send))\n clearRenderContext()\n setFlatBindings(null)\n\n return { nodes, inst }\n}\n\n/**\n * Serialize an array of DOM nodes to an HTML string, adding\n * `data-llui-hydrate` markers on elements that own reactive bindings.\n *\n * Accepts a flat binding list so compositions of multiple instances\n * (layout + page, for persistent-layout SSR) produce correct markers\n * across the whole tree. Pass the union of every composed instance's\n * `allBindings`.\n */\nexport function serializeNodes(nodes: Node[], bindings: Binding[]): string {\n const hydrateElements = new Set<Node>()\n for (const binding of bindings) {\n const node = binding.node\n if (node.nodeType === 1) {\n hydrateElements.add(node)\n } else if (node.parentNode && node.parentNode.nodeType === 1) {\n hydrateElements.add(node.parentNode)\n }\n }\n let html = ''\n for (const node of nodes) {\n html += nodeToStringWithMarkers(node, hydrateElements)\n }\n return html\n}\n\n/**\n * Render a component to an HTML string for SSR.\n * Evaluates view() against the initial state (or provided data),\n * serializes the DOM to HTML, and adds data-llui-hydrate markers\n * on nodes with reactive bindings.\n *\n * Call initSsrDom() once before using this on the server.\n *\n * For persistent layouts, use `renderNodes` + `serializeNodes` directly\n * so layout and page nodes can be composed before serialization.\n */\nexport function renderToString<S, M, E>(def: ComponentDef<S, M, E>, initialState?: S): string {\n const { nodes, inst } = renderNodes(def, initialState)\n return serializeNodes(nodes, inst.allBindings)\n}\n\nfunction nodeToStringWithMarkers(node: Node, bindingNodes: Set<Node>): string {\n if (node.nodeType === 3) {\n return escapeHtml(node.textContent ?? '')\n }\n if (node.nodeType === 8) {\n return `<!--${node.textContent ?? ''}-->`\n }\n if (node.nodeType === 1) {\n const el = node as Element\n return elementToString(el, bindingNodes)\n }\n return ''\n}\n\nfunction elementToString(el: Element, bindingNodes: Set<Node>): string {\n const tag = el.tagName.toLowerCase()\n let attrs = ''\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!\n // Skip event handler attributes\n if (attr.name.startsWith('on')) continue\n attrs += ` ${attr.name}=\"${escapeAttr(attr.value)}\"`\n }\n\n // Add hydrate marker if this element or any of its text children have bindings\n if (bindingNodes.has(el)) {\n attrs += ' data-llui-hydrate'\n }\n\n // Void elements\n if (isVoidElement(tag)) {\n return `<${tag}${attrs} />`\n }\n\n let children = ''\n for (let i = 0; i < el.childNodes.length; i++) {\n children += nodeToStringWithMarkers(el.childNodes[i]!, bindingNodes)\n }\n\n return `<${tag}${attrs}>${children}</${tag}>`\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;')\n}\n\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\nfunction isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag)\n}\n"]}
1
+ {"version":3,"file":"ssr.js","sourceRoot":"","sources":["../src/ssr.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ComponentDef, Lifetime, Binding } from './types.js'\nimport { createComponentInstance, type ComponentInstance } from './update-loop.js'\nimport { setRenderContext, clearRenderContext } from './render-context.js'\nimport { setFlatBindings } from './binding.js'\nimport { createView } from './view-helpers.js'\n\n/**\n * Render a component to DOM nodes for SSR, returning both the produced\n * nodes and the component instance (so callers can compose trees before\n * serializing — e.g. `@llui/vike` stitches layout + page nodes at the\n * `pageSlot()` marker position before one final serialization pass).\n *\n * Accepts an optional `parentLifetime` so the rendered instance's rootLifetime\n * becomes a child of an existing scope tree — used by persistent layouts\n * so contexts provided by an outer layout are reachable from an inner\n * page via `useContext`.\n *\n * Call `initSsrDom()` once before using this on the server.\n */\nexport function renderNodes<S, M, E, D = void>(\n def: ComponentDef<S, M, E, D>,\n initialState?: S,\n parentLifetime?: Lifetime,\n): { nodes: Node[]; inst: ComponentInstance<S, M, E> } {\n const inst = createComponentInstance(def, undefined, parentLifetime ?? null)\n if (initialState !== undefined) {\n inst.state = initialState\n }\n\n setFlatBindings(inst.allBindings)\n setRenderContext({\n ...inst,\n send: inst.send as (msg: unknown) => void,\n instance: inst as ComponentInstance,\n })\n const nodes = def.view(createView<S, M>(inst.send))\n clearRenderContext()\n setFlatBindings(null)\n\n return { nodes, inst }\n}\n\n/**\n * Serialize an array of DOM nodes to an HTML string, adding\n * `data-llui-hydrate` markers on elements that own reactive bindings.\n *\n * Accepts a flat binding list so compositions of multiple instances\n * (layout + page, for persistent-layout SSR) produce correct markers\n * across the whole tree. Pass the union of every composed instance's\n * `allBindings`.\n */\nexport function serializeNodes(nodes: Node[], bindings: Binding[]): string {\n const hydrateElements = new Set<Node>()\n for (const binding of bindings) {\n const node = binding.node\n if (node.nodeType === 1) {\n hydrateElements.add(node)\n } else if (node.parentNode && node.parentNode.nodeType === 1) {\n hydrateElements.add(node.parentNode)\n }\n }\n let html = ''\n for (const node of nodes) {\n html += nodeToStringWithMarkers(node, hydrateElements)\n }\n return html\n}\n\n/**\n * Render a component to an HTML string for SSR.\n * Evaluates view() against the initial state (or provided data),\n * serializes the DOM to HTML, and adds data-llui-hydrate markers\n * on nodes with reactive bindings.\n *\n * Call initSsrDom() once before using this on the server.\n *\n * For persistent layouts, use `renderNodes` + `serializeNodes` directly\n * so layout and page nodes can be composed before serialization.\n */\nexport function renderToString<S, M, E, D = void>(\n def: ComponentDef<S, M, E, D>,\n initialState?: S,\n): string {\n const { nodes, inst } = renderNodes(def, initialState)\n return serializeNodes(nodes, inst.allBindings)\n}\n\nfunction nodeToStringWithMarkers(node: Node, bindingNodes: Set<Node>): string {\n if (node.nodeType === 3) {\n return escapeHtml(node.textContent ?? '')\n }\n if (node.nodeType === 8) {\n return `<!--${node.textContent ?? ''}-->`\n }\n if (node.nodeType === 1) {\n const el = node as Element\n return elementToString(el, bindingNodes)\n }\n return ''\n}\n\nfunction elementToString(el: Element, bindingNodes: Set<Node>): string {\n const tag = el.tagName.toLowerCase()\n let attrs = ''\n\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i]!\n // Skip event handler attributes\n if (attr.name.startsWith('on')) continue\n attrs += ` ${attr.name}=\"${escapeAttr(attr.value)}\"`\n }\n\n // Add hydrate marker if this element or any of its text children have bindings\n if (bindingNodes.has(el)) {\n attrs += ' data-llui-hydrate'\n }\n\n // Void elements\n if (isVoidElement(tag)) {\n return `<${tag}${attrs} />`\n }\n\n let children = ''\n for (let i = 0; i < el.childNodes.length; i++) {\n children += nodeToStringWithMarkers(el.childNodes[i]!, bindingNodes)\n }\n\n return `<${tag}${attrs}>${children}</${tag}>`\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/\"/g, '&quot;')\n}\n\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\nfunction isVoidElement(tag: string): boolean {\n return VOID_ELEMENTS.has(tag)\n}\n"]}
@@ -25,7 +25,7 @@ function createSvgElement(tag, propsOrChildren, maybeChildren) {
25
25
  const key = kind === 'class' ? undefined : rawKey;
26
26
  const accessor = value;
27
27
  const perItem = value.length === 0;
28
- const binding = createBinding(ctx.rootScope, {
28
+ const binding = createBinding(ctx.rootLifetime, {
29
29
  mask: FULL_MASK,
30
30
  accessor,
31
31
  kind,
@@ -1 +1 @@
1
- {"version":3,"file":"svg-elements.js","sourceRoot":"","sources":["../src/svg-elements.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BindingKind } from './types.js'\nimport { getRenderContext } from './render-context.js'\nimport { createBinding, applyBinding } from './binding.js'\nimport { FULL_MASK } from './update-loop.js'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\n\ntype ElementProps = Record<string, unknown>\ntype Child = Node | string | Node[]\ntype Children = Child[]\n\nfunction createSvgElement(\n tag: string,\n propsOrChildren?: ElementProps | Children,\n maybeChildren?: Children,\n): SVGElement {\n const el = document.createElementNS(SVG_NS, tag)\n const ctx = getRenderContext()\n\n const props: ElementProps | undefined = Array.isArray(propsOrChildren)\n ? undefined\n : propsOrChildren\n const children: Children | undefined = Array.isArray(propsOrChildren)\n ? propsOrChildren\n : maybeChildren\n\n if (props) {\n for (const [rawKey, value] of Object.entries(props)) {\n if (rawKey === 'key') continue\n\n if (/^on[A-Z]/.test(rawKey)) {\n const eventName = rawKey.slice(2).toLowerCase()\n el.addEventListener(eventName, value as EventListener)\n continue\n }\n\n if (typeof value === 'function') {\n const kind: BindingKind = rawKey === 'class' || rawKey === 'className' ? 'class' : 'attr'\n const key = kind === 'class' ? undefined : rawKey\n const accessor = value as (state: never) => unknown\n const perItem = value.length === 0\n\n const binding = createBinding(ctx.rootScope, {\n mask: FULL_MASK,\n accessor,\n kind,\n node: el,\n key,\n perItem,\n })\n\n const initialValue = perItem ? (value as () => unknown)() : accessor(ctx.state as never)\n binding.lastValue = initialValue\n applyBinding({ kind, node: el, key }, initialValue)\n continue\n }\n\n if (rawKey === 'class' || rawKey === 'className') {\n applyBinding({ kind: 'class', node: el, key: undefined }, value)\n } else {\n applyBinding({ kind: 'attr', node: el, key: rawKey }, value)\n }\n }\n }\n\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else if (Array.isArray(child)) {\n for (const node of child) el.appendChild(node)\n } else {\n el.appendChild(child)\n }\n }\n }\n\n return el\n}\n\ntype SvgElFn = {\n (): SVGElement\n (props: ElementProps, children?: Children): SVGElement\n (children: Children): SVGElement\n}\n\ntype SvgVoidElFn = {\n (): SVGElement\n (props: ElementProps): SVGElement\n}\n\n/* v8 ignore start — mechanical tag wrappers */\n// Container / structural\n// prettier-ignore\nexport const svg = ((p?: ElementProps | Children, c?: Children) => createSvgElement('svg', p, c)) as SvgElFn\n// prettier-ignore\nexport const g = ((p?: ElementProps | Children, c?: Children) => createSvgElement('g', p, c)) as SvgElFn\n// prettier-ignore\nexport const defs = ((p?: ElementProps | Children, c?: Children) => createSvgElement('defs', p, c)) as SvgElFn\n// prettier-ignore\nexport const symbol = ((p?: ElementProps | Children, c?: Children) => createSvgElement('symbol', p, c)) as SvgElFn\n// prettier-ignore\nexport const use = ((p?: ElementProps | Children, c?: Children) => createSvgElement('use', p, c)) as SvgElFn\n\n// Shapes\n// prettier-ignore\nexport const circle = ((p?: ElementProps | Children, c?: Children) => createSvgElement('circle', p, c)) as SvgElFn\n// prettier-ignore\nexport const ellipse = ((p?: ElementProps | Children, c?: Children) => createSvgElement('ellipse', p, c)) as SvgElFn\n// prettier-ignore\nexport const line = ((p?: ElementProps | Children, c?: Children) => createSvgElement('line', p, c)) as SvgElFn\n// prettier-ignore\nexport const path = ((p?: ElementProps | Children, c?: Children) => createSvgElement('path', p, c)) as SvgElFn\n// prettier-ignore\nexport const polygon = ((p?: ElementProps) => createSvgElement('polygon', p)) as SvgVoidElFn\n// prettier-ignore\nexport const polyline = ((p?: ElementProps) => createSvgElement('polyline', p)) as SvgVoidElFn\n// prettier-ignore\nexport const rect = ((p?: ElementProps | Children, c?: Children) => createSvgElement('rect', p, c)) as SvgElFn\n\n// Text\n// prettier-ignore\nexport const text = ((p?: ElementProps | Children, c?: Children) => createSvgElement('text', p, c)) as SvgElFn\n// prettier-ignore\nexport const tspan = ((p?: ElementProps | Children, c?: Children) => createSvgElement('tspan', p, c)) as SvgElFn\n// prettier-ignore\nexport const textPath = ((p?: ElementProps | Children, c?: Children) => createSvgElement('textPath', p, c)) as SvgElFn\n\n// Paint server / clipping / masking\n// prettier-ignore\nexport const clipPath = ((p?: ElementProps | Children, c?: Children) => createSvgElement('clipPath', p, c)) as SvgElFn\n// prettier-ignore\nexport const linearGradient = ((p?: ElementProps | Children, c?: Children) => createSvgElement('linearGradient', p, c)) as SvgElFn\n// prettier-ignore\nexport const radialGradient = ((p?: ElementProps | Children, c?: Children) => createSvgElement('radialGradient', p, c)) as SvgElFn\n// prettier-ignore\nexport const stop = ((p?: ElementProps) => createSvgElement('stop', p)) as SvgVoidElFn\n// prettier-ignore\nexport const mask = ((p?: ElementProps | Children, c?: Children) => createSvgElement('mask', p, c)) as SvgElFn\n// prettier-ignore\nexport const pattern = ((p?: ElementProps | Children, c?: Children) => createSvgElement('pattern', p, c)) as SvgElFn\n// prettier-ignore\nexport const marker = ((p?: ElementProps | Children, c?: Children) => createSvgElement('marker', p, c)) as SvgElFn\n\n// Filters\n// prettier-ignore\nexport const filter = ((p?: ElementProps | Children, c?: Children) => createSvgElement('filter', p, c)) as SvgElFn\n// prettier-ignore\nexport const feBlend = ((p?: ElementProps) => createSvgElement('feBlend', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feColorMatrix = ((p?: ElementProps) => createSvgElement('feColorMatrix', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feComponentTransfer = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feComponentTransfer', p, c)) as SvgElFn\n// prettier-ignore\nexport const feComposite = ((p?: ElementProps) => createSvgElement('feComposite', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feConvolveMatrix = ((p?: ElementProps) => createSvgElement('feConvolveMatrix', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDiffuseLighting = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feDiffuseLighting', p, c)) as SvgElFn\n// prettier-ignore\nexport const feDisplacementMap = ((p?: ElementProps) => createSvgElement('feDisplacementMap', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDropShadow = ((p?: ElementProps) => createSvgElement('feDropShadow', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFlood = ((p?: ElementProps) => createSvgElement('feFlood', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feGaussianBlur = ((p?: ElementProps) => createSvgElement('feGaussianBlur', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feImage = ((p?: ElementProps) => createSvgElement('feImage', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feMerge = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feMerge', p, c)) as SvgElFn\n// prettier-ignore\nexport const feMergeNode = ((p?: ElementProps) => createSvgElement('feMergeNode', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feMorphology = ((p?: ElementProps) => createSvgElement('feMorphology', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feOffset = ((p?: ElementProps) => createSvgElement('feOffset', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feSpecularLighting = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feSpecularLighting', p, c)) as SvgElFn\n// prettier-ignore\nexport const feTile = ((p?: ElementProps) => createSvgElement('feTile', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feTurbulence = ((p?: ElementProps) => createSvgElement('feTurbulence', p)) as SvgVoidElFn\n// prettier-ignore\nexport const fePointLight = ((p?: ElementProps) => createSvgElement('fePointLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feSpotLight = ((p?: ElementProps) => createSvgElement('feSpotLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDistantLight = ((p?: ElementProps) => createSvgElement('feDistantLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncR = ((p?: ElementProps) => createSvgElement('feFuncR', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncG = ((p?: ElementProps) => createSvgElement('feFuncG', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncB = ((p?: ElementProps) => createSvgElement('feFuncB', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncA = ((p?: ElementProps) => createSvgElement('feFuncA', p)) as SvgVoidElFn\n\n// Embedded content\n// prettier-ignore\nexport const image = ((p?: ElementProps | Children, c?: Children) => createSvgElement('image', p, c)) as SvgElFn\n// prettier-ignore\nexport const foreignObject = ((p?: ElementProps | Children, c?: Children) => createSvgElement('foreignObject', p, c)) as SvgElFn\n\n// Animation\n// prettier-ignore\nexport const animate = ((p?: ElementProps) => createSvgElement('animate', p)) as SvgVoidElFn\n// prettier-ignore\nexport const animateMotion = ((p?: ElementProps | Children, c?: Children) => createSvgElement('animateMotion', p, c)) as SvgElFn\n// prettier-ignore\nexport const animateTransform = ((p?: ElementProps) => createSvgElement('animateTransform', p)) as SvgVoidElFn\n// prettier-ignore\nexport const set = ((p?: ElementProps) => createSvgElement('set', p)) as SvgVoidElFn\n// prettier-ignore\nexport const mpath = ((p?: ElementProps) => createSvgElement('mpath', p)) as SvgVoidElFn\n\n// Descriptive\n// prettier-ignore\nexport const desc = ((p?: ElementProps | Children, c?: Children) => createSvgElement('desc', p, c)) as SvgElFn\n// prettier-ignore\nexport const title = ((p?: ElementProps | Children, c?: Children) => createSvgElement('title', p, c)) as SvgElFn\n// prettier-ignore\nexport const metadata = ((p?: ElementProps | Children, c?: Children) => createSvgElement('metadata', p, c)) as SvgElFn\n/* v8 ignore stop */\n"]}
1
+ {"version":3,"file":"svg-elements.js","sourceRoot":"","sources":["../src/svg-elements.ts"],"names":[],"mappings":"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","sourcesContent":["import type { BindingKind } from './types.js'\nimport { getRenderContext } from './render-context.js'\nimport { createBinding, applyBinding } from './binding.js'\nimport { FULL_MASK } from './update-loop.js'\n\nconst SVG_NS = 'http://www.w3.org/2000/svg'\n\ntype ElementProps = Record<string, unknown>\ntype Child = Node | string | Node[]\ntype Children = Child[]\n\nfunction createSvgElement(\n tag: string,\n propsOrChildren?: ElementProps | Children,\n maybeChildren?: Children,\n): SVGElement {\n const el = document.createElementNS(SVG_NS, tag)\n const ctx = getRenderContext()\n\n const props: ElementProps | undefined = Array.isArray(propsOrChildren)\n ? undefined\n : propsOrChildren\n const children: Children | undefined = Array.isArray(propsOrChildren)\n ? propsOrChildren\n : maybeChildren\n\n if (props) {\n for (const [rawKey, value] of Object.entries(props)) {\n if (rawKey === 'key') continue\n\n if (/^on[A-Z]/.test(rawKey)) {\n const eventName = rawKey.slice(2).toLowerCase()\n el.addEventListener(eventName, value as EventListener)\n continue\n }\n\n if (typeof value === 'function') {\n const kind: BindingKind = rawKey === 'class' || rawKey === 'className' ? 'class' : 'attr'\n const key = kind === 'class' ? undefined : rawKey\n const accessor = value as (state: never) => unknown\n const perItem = value.length === 0\n\n const binding = createBinding(ctx.rootLifetime, {\n mask: FULL_MASK,\n accessor,\n kind,\n node: el,\n key,\n perItem,\n })\n\n const initialValue = perItem ? (value as () => unknown)() : accessor(ctx.state as never)\n binding.lastValue = initialValue\n applyBinding({ kind, node: el, key }, initialValue)\n continue\n }\n\n if (rawKey === 'class' || rawKey === 'className') {\n applyBinding({ kind: 'class', node: el, key: undefined }, value)\n } else {\n applyBinding({ kind: 'attr', node: el, key: rawKey }, value)\n }\n }\n }\n\n if (children) {\n for (const child of children) {\n if (typeof child === 'string') {\n el.appendChild(document.createTextNode(child))\n } else if (Array.isArray(child)) {\n for (const node of child) el.appendChild(node)\n } else {\n el.appendChild(child)\n }\n }\n }\n\n return el\n}\n\ntype SvgElFn = {\n (): SVGElement\n (props: ElementProps, children?: Children): SVGElement\n (children: Children): SVGElement\n}\n\ntype SvgVoidElFn = {\n (): SVGElement\n (props: ElementProps): SVGElement\n}\n\n/* v8 ignore start — mechanical tag wrappers */\n// Container / structural\n// prettier-ignore\nexport const svg = ((p?: ElementProps | Children, c?: Children) => createSvgElement('svg', p, c)) as SvgElFn\n// prettier-ignore\nexport const g = ((p?: ElementProps | Children, c?: Children) => createSvgElement('g', p, c)) as SvgElFn\n// prettier-ignore\nexport const defs = ((p?: ElementProps | Children, c?: Children) => createSvgElement('defs', p, c)) as SvgElFn\n// prettier-ignore\nexport const symbol = ((p?: ElementProps | Children, c?: Children) => createSvgElement('symbol', p, c)) as SvgElFn\n// prettier-ignore\nexport const use = ((p?: ElementProps | Children, c?: Children) => createSvgElement('use', p, c)) as SvgElFn\n\n// Shapes\n// prettier-ignore\nexport const circle = ((p?: ElementProps | Children, c?: Children) => createSvgElement('circle', p, c)) as SvgElFn\n// prettier-ignore\nexport const ellipse = ((p?: ElementProps | Children, c?: Children) => createSvgElement('ellipse', p, c)) as SvgElFn\n// prettier-ignore\nexport const line = ((p?: ElementProps | Children, c?: Children) => createSvgElement('line', p, c)) as SvgElFn\n// prettier-ignore\nexport const path = ((p?: ElementProps | Children, c?: Children) => createSvgElement('path', p, c)) as SvgElFn\n// prettier-ignore\nexport const polygon = ((p?: ElementProps) => createSvgElement('polygon', p)) as SvgVoidElFn\n// prettier-ignore\nexport const polyline = ((p?: ElementProps) => createSvgElement('polyline', p)) as SvgVoidElFn\n// prettier-ignore\nexport const rect = ((p?: ElementProps | Children, c?: Children) => createSvgElement('rect', p, c)) as SvgElFn\n\n// Text\n// prettier-ignore\nexport const text = ((p?: ElementProps | Children, c?: Children) => createSvgElement('text', p, c)) as SvgElFn\n// prettier-ignore\nexport const tspan = ((p?: ElementProps | Children, c?: Children) => createSvgElement('tspan', p, c)) as SvgElFn\n// prettier-ignore\nexport const textPath = ((p?: ElementProps | Children, c?: Children) => createSvgElement('textPath', p, c)) as SvgElFn\n\n// Paint server / clipping / masking\n// prettier-ignore\nexport const clipPath = ((p?: ElementProps | Children, c?: Children) => createSvgElement('clipPath', p, c)) as SvgElFn\n// prettier-ignore\nexport const linearGradient = ((p?: ElementProps | Children, c?: Children) => createSvgElement('linearGradient', p, c)) as SvgElFn\n// prettier-ignore\nexport const radialGradient = ((p?: ElementProps | Children, c?: Children) => createSvgElement('radialGradient', p, c)) as SvgElFn\n// prettier-ignore\nexport const stop = ((p?: ElementProps) => createSvgElement('stop', p)) as SvgVoidElFn\n// prettier-ignore\nexport const mask = ((p?: ElementProps | Children, c?: Children) => createSvgElement('mask', p, c)) as SvgElFn\n// prettier-ignore\nexport const pattern = ((p?: ElementProps | Children, c?: Children) => createSvgElement('pattern', p, c)) as SvgElFn\n// prettier-ignore\nexport const marker = ((p?: ElementProps | Children, c?: Children) => createSvgElement('marker', p, c)) as SvgElFn\n\n// Filters\n// prettier-ignore\nexport const filter = ((p?: ElementProps | Children, c?: Children) => createSvgElement('filter', p, c)) as SvgElFn\n// prettier-ignore\nexport const feBlend = ((p?: ElementProps) => createSvgElement('feBlend', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feColorMatrix = ((p?: ElementProps) => createSvgElement('feColorMatrix', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feComponentTransfer = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feComponentTransfer', p, c)) as SvgElFn\n// prettier-ignore\nexport const feComposite = ((p?: ElementProps) => createSvgElement('feComposite', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feConvolveMatrix = ((p?: ElementProps) => createSvgElement('feConvolveMatrix', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDiffuseLighting = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feDiffuseLighting', p, c)) as SvgElFn\n// prettier-ignore\nexport const feDisplacementMap = ((p?: ElementProps) => createSvgElement('feDisplacementMap', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDropShadow = ((p?: ElementProps) => createSvgElement('feDropShadow', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFlood = ((p?: ElementProps) => createSvgElement('feFlood', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feGaussianBlur = ((p?: ElementProps) => createSvgElement('feGaussianBlur', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feImage = ((p?: ElementProps) => createSvgElement('feImage', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feMerge = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feMerge', p, c)) as SvgElFn\n// prettier-ignore\nexport const feMergeNode = ((p?: ElementProps) => createSvgElement('feMergeNode', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feMorphology = ((p?: ElementProps) => createSvgElement('feMorphology', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feOffset = ((p?: ElementProps) => createSvgElement('feOffset', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feSpecularLighting = ((p?: ElementProps | Children, c?: Children) => createSvgElement('feSpecularLighting', p, c)) as SvgElFn\n// prettier-ignore\nexport const feTile = ((p?: ElementProps) => createSvgElement('feTile', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feTurbulence = ((p?: ElementProps) => createSvgElement('feTurbulence', p)) as SvgVoidElFn\n// prettier-ignore\nexport const fePointLight = ((p?: ElementProps) => createSvgElement('fePointLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feSpotLight = ((p?: ElementProps) => createSvgElement('feSpotLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feDistantLight = ((p?: ElementProps) => createSvgElement('feDistantLight', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncR = ((p?: ElementProps) => createSvgElement('feFuncR', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncG = ((p?: ElementProps) => createSvgElement('feFuncG', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncB = ((p?: ElementProps) => createSvgElement('feFuncB', p)) as SvgVoidElFn\n// prettier-ignore\nexport const feFuncA = ((p?: ElementProps) => createSvgElement('feFuncA', p)) as SvgVoidElFn\n\n// Embedded content\n// prettier-ignore\nexport const image = ((p?: ElementProps | Children, c?: Children) => createSvgElement('image', p, c)) as SvgElFn\n// prettier-ignore\nexport const foreignObject = ((p?: ElementProps | Children, c?: Children) => createSvgElement('foreignObject', p, c)) as SvgElFn\n\n// Animation\n// prettier-ignore\nexport const animate = ((p?: ElementProps) => createSvgElement('animate', p)) as SvgVoidElFn\n// prettier-ignore\nexport const animateMotion = ((p?: ElementProps | Children, c?: Children) => createSvgElement('animateMotion', p, c)) as SvgElFn\n// prettier-ignore\nexport const animateTransform = ((p?: ElementProps) => createSvgElement('animateTransform', p)) as SvgVoidElFn\n// prettier-ignore\nexport const set = ((p?: ElementProps) => createSvgElement('set', p)) as SvgVoidElFn\n// prettier-ignore\nexport const mpath = ((p?: ElementProps) => createSvgElement('mpath', p)) as SvgVoidElFn\n\n// Descriptive\n// prettier-ignore\nexport const desc = ((p?: ElementProps | Children, c?: Children) => createSvgElement('desc', p, c)) as SvgElFn\n// prettier-ignore\nexport const title = ((p?: ElementProps | Children, c?: Children) => createSvgElement('title', p, c)) as SvgElFn\n// prettier-ignore\nexport const metadata = ((p?: ElementProps | Children, c?: Children) => createSvgElement('metadata', p, c)) as SvgElFn\n/* v8 ignore stop */\n"]}
@@ -1,12 +1,12 @@
1
1
  import { createRingBuffer, type RingBuffer } from './each-diff.js';
2
2
  /**
3
- * Dev-only disposer log entry, emitted once per `disposeScope` call
3
+ * Dev-only disposer log entry, emitted once per `disposeLifetime` call
4
4
  * when the owning component instance has an `_disposerLog` ring buffer
5
5
  * installed by `installDevTools`.
6
6
  *
7
7
  * `cause` is set by the structural primitive (each / branch / child)
8
- * immediately before calling `disposeScope`. When no cause was
9
- * explicitly set, `disposeScope` falls back to `'component-unmount'`.
8
+ * immediately before calling `disposeLifetime`. When no cause was
9
+ * explicitly set, `disposeLifetime` falls back to `'component-unmount'`.
10
10
  * `'app-unmount'` is reserved for the top-level `mountApp` teardown.
11
11
  *
12
12
  * Used by the `llui_disposer_log` MCP tool to diagnose leaks on
@@ -15,7 +15,7 @@ import { createRingBuffer, type RingBuffer } from './each-diff.js';
15
15
  */
16
16
  export interface DisposerEvent {
17
17
  scopeId: string;
18
- cause: 'branch-swap' | 'each-remove' | 'show-hide' | 'child-unmount' | 'app-unmount' | 'component-unmount';
18
+ cause: 'branch-swap' | 'each-remove' | 'show-hide' | 'scope-rebuild' | 'child-unmount' | 'app-unmount' | 'component-unmount';
19
19
  timestamp: number;
20
20
  }
21
21
  export { createRingBuffer, type RingBuffer };
@@ -1 +1 @@
1
- {"version":3,"file":"disposer-log.d.ts","sourceRoot":"","sources":["../../src/tracking/disposer-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EACD,aAAa,GACb,aAAa,GACb,WAAW,GACX,eAAe,GACf,aAAa,GACb,mBAAmB,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,CAAA"}
1
+ {"version":3,"file":"disposer-log.d.ts","sourceRoot":"","sources":["../../src/tracking/disposer-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAElE;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EACD,aAAa,GACb,aAAa,GACb,WAAW,GACX,eAAe,GACf,eAAe,GACf,aAAa,GACb,mBAAmB,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"disposer-log.js","sourceRoot":"","sources":["../../src/tracking/disposer-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,gBAAgB,CAAA;AA4BlE,OAAO,EAAE,gBAAgB,EAAmB,CAAA","sourcesContent":["import { createRingBuffer, type RingBuffer } from './each-diff.js'\n\n/**\n * Dev-only disposer log entry, emitted once per `disposeScope` call\n * when the owning component instance has an `_disposerLog` ring buffer\n * installed by `installDevTools`.\n *\n * `cause` is set by the structural primitive (each / branch / child)\n * immediately before calling `disposeScope`. When no cause was\n * explicitly set, `disposeScope` falls back to `'component-unmount'`.\n * `'app-unmount'` is reserved for the top-level `mountApp` teardown.\n *\n * Used by the `llui_disposer_log` MCP tool to diagnose leaks on\n * structural transitions (e.g., branch swap that fails to release a\n * subscription registered in the old arm).\n */\nexport interface DisposerEvent {\n scopeId: string\n cause:\n | 'branch-swap'\n | 'each-remove'\n | 'show-hide'\n | 'child-unmount'\n | 'app-unmount'\n | 'component-unmount'\n timestamp: number\n}\n\nexport { createRingBuffer, type RingBuffer }\n"]}
1
+ {"version":3,"file":"disposer-log.js","sourceRoot":"","sources":["../../src/tracking/disposer-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmB,MAAM,gBAAgB,CAAA;AA6BlE,OAAO,EAAE,gBAAgB,EAAmB,CAAA","sourcesContent":["import { createRingBuffer, type RingBuffer } from './each-diff.js'\n\n/**\n * Dev-only disposer log entry, emitted once per `disposeLifetime` call\n * when the owning component instance has an `_disposerLog` ring buffer\n * installed by `installDevTools`.\n *\n * `cause` is set by the structural primitive (each / branch / child)\n * immediately before calling `disposeLifetime`. When no cause was\n * explicitly set, `disposeLifetime` falls back to `'component-unmount'`.\n * `'app-unmount'` is reserved for the top-level `mountApp` teardown.\n *\n * Used by the `llui_disposer_log` MCP tool to diagnose leaks on\n * structural transitions (e.g., branch swap that fails to release a\n * subscription registered in the old arm).\n */\nexport interface DisposerEvent {\n scopeId: string\n cause:\n | 'branch-swap'\n | 'each-remove'\n | 'show-hide'\n | 'scope-rebuild'\n | 'child-unmount'\n | 'app-unmount'\n | 'component-unmount'\n timestamp: number\n}\n\nexport { createRingBuffer, type RingBuffer }\n"]}
package/dist/types.d.ts CHANGED
@@ -128,20 +128,20 @@ export interface AppHandle {
128
128
  */
129
129
  send(msg: unknown): void;
130
130
  }
131
- export interface Scope {
131
+ export interface Lifetime {
132
132
  id: number;
133
- parent: Scope | null;
134
- children: Scope[];
133
+ parent: Lifetime | null;
134
+ children: Lifetime[];
135
135
  disposers: Array<() => void>;
136
136
  bindings: Binding[];
137
137
  /** Per-item updaters — called directly by each() when item changes, bypassing Phase 2 */
138
138
  itemUpdaters: Array<() => void>;
139
139
  }
140
- export interface ScopeNode {
140
+ export interface LifetimeNode {
141
141
  scopeId: string;
142
- kind: 'root' | 'show' | 'each' | 'branch' | 'child' | 'portal' | 'foreign';
142
+ kind: 'root' | 'show' | 'each' | 'branch' | 'scope' | 'child' | 'portal' | 'foreign';
143
143
  active: boolean;
144
- children: ScopeNode[];
144
+ children: LifetimeNode[];
145
145
  }
146
146
  /**
147
147
  * Binding output kinds.
@@ -162,7 +162,7 @@ export interface Binding {
162
162
  kind: BindingKind;
163
163
  node: Node;
164
164
  key?: string;
165
- ownerScope: Scope;
165
+ ownerLifetime: Lifetime;
166
166
  perItem: boolean;
167
167
  dead: boolean;
168
168
  }
@@ -175,15 +175,46 @@ export interface TransitionOptions {
175
175
  parent: Node;
176
176
  }) => void | Promise<void>;
177
177
  }
178
+ /**
179
+ * Options for `branch()`.
180
+ *
181
+ * `on(state)` returns a string-valued discriminant. The reconciler looks
182
+ * up `cases[on(state)]` on each change; falls back to `default` when no
183
+ * case matches, or renders nothing if no `default` is provided.
184
+ *
185
+ * `cases` is optional — `branch({ on, default })` is the canonical
186
+ * dynamic-rebuild shape. `scope()` sugar wraps exactly this form.
187
+ */
178
188
  export interface BranchOptions<S, M = unknown> extends TransitionOptions {
179
- on: (s: S) => string | number | boolean;
180
- cases: Record<string | number, (h: View<S, M>) => Node[]>;
189
+ on: (s: S) => string;
190
+ cases?: Record<string, (h: View<S, M>) => Node[]>;
191
+ /**
192
+ * Fallback builder. Runs when `on(state)` returns a key not present in
193
+ * `cases`, or when `cases` is omitted entirely. A future type-level
194
+ * pass may make this required-or-disallowed by inferring exhaustiveness
195
+ * against the literal union returned by `on`; today it is always
196
+ * optional.
197
+ */
198
+ default?: (h: View<S, M>) => Node[];
181
199
  }
182
200
  export interface ShowOptions<S, M = unknown> extends TransitionOptions {
183
201
  when: (s: S) => boolean;
184
202
  render: (h: View<S, M>) => Node[];
185
203
  fallback?: (h: View<S, M>) => Node[];
186
204
  }
205
+ /**
206
+ * Options for `scope()` — rebuilds a subtree when `on(state)` changes.
207
+ *
208
+ * Sugar over `branch({ on, cases: {}, default: render, __disposalCause: 'scope-rebuild' })`.
209
+ * Use when the key is dynamic (e.g. an epoch counter bumped from the
210
+ * outside) and you want a fresh arm — fresh lifetime, fresh bindings —
211
+ * each time it changes. Combine with `sample()` inside `render` for a
212
+ * one-shot current-state read.
213
+ */
214
+ export interface ScopeOptions<S, M = unknown> extends TransitionOptions {
215
+ on: (s: S) => string;
216
+ render: (h: View<S, M>) => Node[];
217
+ }
187
218
  /**
188
219
  * Options for `each()`. The inherited `enter` / `leave` callbacks fire **per item**:
189
220
  * `enter(nodes)` runs after an item's DOM is inserted (including initial mount);
@@ -203,6 +234,16 @@ export type ItemAccessor<T> = {
203
234
  <R>(selector: (t: T) => R): () => R;
204
235
  } & {
205
236
  [K in keyof T]-?: () => T[K];
237
+ } & {
238
+ /**
239
+ * Read the whole current item. Needed when T is a primitive (where the
240
+ * field-map branch collapses to method names like `toString`) or when
241
+ * you want to sample the entire record rather than a single field.
242
+ *
243
+ * Shadows any literal `current` field on T — if T has such a field,
244
+ * use `item(r => r.current)` to disambiguate.
245
+ */
246
+ current(): T;
206
247
  };
207
248
  export interface EachOptions<S, T, M = unknown> extends TransitionOptions {
208
249
  items: (s: S) => T[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qEAAqE","sourcesContent":["// ── Component Definition ──────────────────────────────────────────\n\nimport type { View } from './view-helpers.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { ComponentInstance } from './update-loop.js'\nimport type { DisposerEvent } from './tracking/disposer-log.js'\n\nexport interface ComponentDef<S, M, E = never, D = void> {\n name: string\n init: (data: D) => [S, E[]]\n update: (state: S, msg: M) => [S, E[]]\n view: (h: View<S, M>) => Node[]\n onEffect?: (ctx: { effect: E; send: Send<M>; signal: AbortSignal }) => void\n\n // Level 2 composition\n propsMsg?: (props: Record<string, unknown>) => M\n receives?: Record<string, (params: unknown) => M>\n\n /** @internal Compiler-injected */\n __dirty?: (oldState: S, newState: S) => number | [number, number]\n /** @internal Compiler-injected */\n __renderToString?: (state: S) => string\n /** @internal Compiler-injected */\n __msgSchema?: object\n /** @internal Compiler-injected — maps top-level state field → dirty-mask bit(s) */\n __maskLegend?: Record<string, number>\n /** @internal Compiler-injected — source-file location of the component() call */\n __componentMeta?: { file: string; line: number }\n /** @internal Compiler-injected — shape of the State type (for introspection) */\n __stateSchema?: object\n /** @internal Compiler-injected — Effect union schema (for introspection) */\n __effectSchema?: object\n /** @internal Compiler-injected — replaces generic Phase 1 + Phase 2 loop */\n __update?: (\n state: S,\n dirty: number,\n bindings: Binding[],\n blocks: StructuralBlock[],\n bindingsBeforePhase1: number,\n ) => void\n /** @internal Compiler-injected — per-message-type specialized handlers.\n * Bypass the entire processMessages pipeline for single-message updates. */\n __handlers?: Record<string, (inst: object, msg: unknown) => [S, E[]]>\n}\n\nexport type Send<M> = (msg: M) => void\n\n/**\n * Type-erased component definition for use at module boundaries where\n * the consumer's `S`, `M`, `E` are internal and invisible to the caller.\n *\n * Why this exists: `ComponentDef<S, M, E, D>` uses property syntax for\n * its callable fields (`init: (data: D) => ...`), and TypeScript\n * checks property syntax with strict (contravariant) variance. That's\n * the right call for user-facing type safety when authoring a\n * component (a narrower `Msg` type can't accidentally satisfy the\n * `update`'s param), but it means `ComponentDef<MyState, MyMsg, MyEffect, MyData>`\n * is NOT structurally assignable to `ComponentDef<unknown, unknown, unknown, unknown>`\n * — the `init: (data: MyData) => ...` field is contravariant in `MyData`,\n * so widening to `unknown` is rejected.\n *\n * `AnyComponentDef` (and `LazyDef<D>` below) declare the same fields\n * using **method syntax** (`init(data: D): ...`), which TypeScript\n * checks bivariantly. Concrete `ComponentDef<S, M, E, D>` assigns into\n * these structurally without any `widenDef` helper at the callsite.\n *\n * Used by every API that accepts an opaque component definition at a\n * module boundary:\n *\n * - `child({ def })`\n * - `lazy({ loader })` — returns `LazyDef<D>` so the loader's `D` survives\n * - `createOnRenderClient({ Layout })` (from `@llui/vike`)\n * - `createOnRenderHtml({ Layout })` (from `@llui/vike`)\n *\n * The `D` parameter is `unknown` here — `child()` doesn't pass init\n * data through, and `Layout` callers pass route-supplied data whose\n * shape is unknown at the type-erased boundary. Use `LazyDef<D>` when\n * you need to preserve the init data shape (the lazy loader case).\n */\nexport interface AnyComponentDef {\n name: string\n init(data: unknown): [unknown, unknown[]]\n update(state: unknown, msg: unknown): [unknown, unknown[]]\n view(h: unknown): Node[]\n onEffect?: unknown\n propsMsg?: unknown\n receives?: unknown\n __dirty?: unknown\n __renderToString?: unknown\n __msgSchema?: unknown\n __maskLegend?: unknown\n __componentMeta?: unknown\n __stateSchema?: unknown\n __effectSchema?: unknown\n __update?: unknown\n __handlers?: unknown\n}\n\n/**\n * Type-erased component definition for use at module boundaries where the\n * loaded component's S, M, E are internal and invisible to the caller.\n * Only `D` (init data) survives because the caller provides it.\n *\n * `ComponentDef<S, M, E, D>` is structurally assignable to `LazyDef<D>`\n * for any S, M, E — `view: (h: unknown) => Node[]` accepts any View via\n * contravariance, and all other fields widen to `unknown` return types.\n *\n * Used by `lazy()` as the loader's return type. Use `AnyComponentDef`\n * (above) when D is also opaque — most other adapter-layer APIs.\n */\nexport interface LazyDef<D = void> {\n name: string\n // Method syntax — TypeScript checks methods bivariantly, so\n // ComponentDef<S, M, E, D>'s concrete (state: S, msg: M) => ...\n // assigns here even though S/M ≠ unknown. Property syntax would\n // be contravariant and reject the assignment.\n init(data: D): [unknown, unknown[]]\n update(state: unknown, msg: unknown): [unknown, unknown[]]\n view(h: unknown): Node[]\n onEffect?: unknown\n propsMsg?: unknown\n receives?: unknown\n __dirty?: unknown\n __renderToString?: unknown\n __msgSchema?: unknown\n __maskLegend?: unknown\n __componentMeta?: unknown\n __stateSchema?: unknown\n __effectSchema?: unknown\n __update?: unknown\n __handlers?: unknown\n}\n\n/**\n * Maps a value shape to a reactive-props shape: every field becomes an accessor\n * `(s: S) => V`. Use for Level-1 view function signatures.\n *\n * ```ts\n * type ToolbarData = { tools: Tool[]; theme: 'light' | 'dark' }\n *\n * export function toolbar<S>(props: Props<ToolbarData, S>, send: Send<Msg>) {\n * return [div({ class: props.theme }, [each({ items: props.tools, ... })])]\n * }\n *\n * // Caller — TypeScript enforces per-field accessors; passing a raw value errors:\n * toolbar({ tools: (s: State) => s.tools, theme: (s) => s.theme }, send)\n * ```\n */\nexport type Props<T, S> = {\n [K in keyof T]: (s: S) => T[K]\n}\n\n// ── App Handle ────────────────────────────────────────────────────\n\nexport interface AppHandle {\n dispose(): void\n flush(): void\n /**\n * Dispatch a message into the mounted instance from outside its\n * normal view-bound `send` channel. Useful for adapter layers that\n * need to push updates into a long-lived instance — e.g.\n * `@llui/vike`'s persistent-layout chain pushes layout-data updates\n * into surviving layer instances on client navigation when their\n * `propsMsg` translates the new data into a state-update message.\n *\n * Messages are queued through the same path as `view`-side `send`\n * calls — they batch into the next microtask and process via the\n * normal update loop. Calling `send` after `dispose` is a no-op.\n */\n send(msg: unknown): void\n}\n\n// ── Scope ─────────────────────────────────────────────────────────\n\nexport interface Scope {\n id: number\n parent: Scope | null\n children: Scope[]\n disposers: Array<() => void>\n bindings: Binding[]\n /** Per-item updaters — called directly by each() when item changes, bypassing Phase 2 */\n itemUpdaters: Array<() => void>\n /**\n * @internal dev-only back-reference to the owning ComponentInstance.\n * Populated on the root scope by `installDevTools` so `disposeScope`\n * can walk up the scope chain and emit DisposerEvents into the\n * instance's `_disposerLog`. Undefined in production.\n */\n instance?: ComponentInstance\n /**\n * @internal dev-only cause hint. Structural primitives (branch, each,\n * child, mountApp teardown) set this field immediately before calling\n * `disposeScope`; the dispose path reads it once to stamp the emitted\n * DisposerEvent. Left undefined, `disposeScope` falls back to\n * `'component-unmount'`. Undefined in production.\n */\n disposalCause?: DisposerEvent['cause']\n /** @internal dev-only — populated by structural primitives for scope-tree classification */\n _kind?: 'root' | 'show' | 'each' | 'branch' | 'child' | 'portal' | 'foreign'\n}\n\nexport interface ScopeNode {\n scopeId: string\n kind: 'root' | 'show' | 'each' | 'branch' | 'child' | 'portal' | 'foreign'\n active: boolean\n children: ScopeNode[]\n}\n\n// ── Binding ───────────────────────────────────────────────────────\n\n/**\n * Binding output kinds.\n *\n * `'text' | 'prop' | 'attr' | 'class' | 'style'` write their accessor's\n * return value to the DOM. `'effect'` is a side-effect-only watcher:\n * the accessor is invoked every Phase 2 tick its mask is hit, but its\n * return value is discarded and `applyBinding` is a no-op. Used by\n * `child()` to fire the prop-diff/propsMsg cascade on parent updates\n * without the cost of stringifying the returned props bag onto a\n * detached anchor node every render.\n */\nexport type BindingKind = 'text' | 'prop' | 'attr' | 'class' | 'style' | 'effect'\n\nexport interface Binding {\n mask: number\n accessor: (state: unknown) => unknown\n lastValue: unknown\n kind: BindingKind\n node: Node\n key?: string\n ownerScope: Scope\n perItem: boolean\n dead: boolean\n}\n\n// ── Structural Primitives ─────────────────────────────────────────\n\nexport interface TransitionOptions {\n enter?: (nodes: Node[]) => void | Promise<void>\n leave?: (nodes: Node[]) => void | Promise<void>\n onTransition?: (ctx: { entering: Node[]; leaving: Node[]; parent: Node }) => void | Promise<void>\n}\n\nexport interface BranchOptions<S, M = unknown> extends TransitionOptions {\n on: (s: S) => string | number | boolean\n cases: Record<string | number, (h: View<S, M>) => Node[]>\n /**\n * @internal Set by `show()` when it delegates to `branch()`, so the\n * dev-only disposer log can report `'show-hide'` instead of the\n * default `'branch-swap'` for the leaving arm. User code should not\n * set this directly.\n */\n __disposalCause?: DisposerEvent['cause']\n}\n\nexport interface ShowOptions<S, M = unknown> extends TransitionOptions {\n when: (s: S) => boolean\n render: (h: View<S, M>) => Node[]\n fallback?: (h: View<S, M>) => Node[]\n}\n\n/**\n * Options for `each()`. The inherited `enter` / `leave` callbacks fire **per item**:\n * `enter(nodes)` runs after an item's DOM is inserted (including initial mount);\n * `leave(nodes)` runs before an item's DOM is removed and may return a Promise\n * to hold the DOM until the animation resolves. Setting `leave` disables the\n * bulk-clear / full-replace fast paths.\n */\n/**\n * Per-item accessor. Two access forms:\n * - `item.field` — shorthand, returns accessor for `item.current[field]`\n * - `item(t => t.expr)` — computed expressions\n *\n * In both cases the returned value is a `() => V` accessor.\n * Invoke it (`item.field()`) to read the current value imperatively.\n */\nexport type ItemAccessor<T> = {\n <R>(selector: (t: T) => R): () => R\n} & {\n [K in keyof T]-?: () => T[K]\n}\n\nexport interface EachOptions<S, T, M = unknown> extends TransitionOptions {\n items: (s: S) => T[]\n key: (item: T) => string | number\n render: (opts: {\n send: Send<M>\n item: ItemAccessor<T>\n /**\n * Plain (non-Proxy) accessor factory. Compiler-output path; avoid in user code\n * (use `item.field` / `item(fn)` — more ergonomic and bypasses Proxy when compiled).\n */\n acc: <R>(selector: (t: T) => R) => () => R\n index: () => number\n /** @internal Compiler-injected — entry reference for row factory */\n entry?: Record<string, unknown>\n }) => Node[]\n}\n\nexport interface PortalOptions {\n target: HTMLElement | string\n render: () => Node[]\n}\n\nexport interface ForeignOptions<S, M, T extends Record<string, unknown>, Instance> {\n mount: (ctx: { container: HTMLElement; send: Send<M> }) => Instance\n props: (s: S) => T\n sync:\n | ((ctx: { instance: Instance; props: T; prev: T | undefined }) => void)\n | {\n [K in keyof T]?: (ctx: { instance: Instance; value: T[K]; prev: T[K] | undefined }) => void\n }\n destroy: (instance: Instance) => void\n container?: { tag?: string; attrs?: Record<string, string> }\n}\n\nexport interface ChildOptions<S, ChildM> {\n // Type-erased via AnyComponentDef so callers can pass any concrete\n // ComponentDef<S, M, E, D> without a widening helper. The runtime\n // narrows the message shape via the user-supplied `onMsg` callback,\n // which keeps `ChildM` typed at this boundary even though the def\n // itself is opaque.\n def: AnyComponentDef\n key: string | number\n props: (s: S) => Record<string, unknown>\n onMsg?: (msg: ChildM) => unknown | null\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,qEAAqE","sourcesContent":["// ── Component Definition ──────────────────────────────────────────\n\nimport type { View } from './view-helpers.js'\nimport type { StructuralBlock } from './structural.js'\nimport type { ComponentInstance } from './update-loop.js'\nimport type { DisposerEvent } from './tracking/disposer-log.js'\n\nexport interface ComponentDef<S, M, E = never, D = void> {\n name: string\n init: (data: D) => [S, E[]]\n update: (state: S, msg: M) => [S, E[]]\n view: (h: View<S, M>) => Node[]\n onEffect?: (ctx: { effect: E; send: Send<M>; signal: AbortSignal }) => void\n\n // Level 2 composition\n propsMsg?: (props: Record<string, unknown>) => M\n receives?: Record<string, (params: unknown) => M>\n\n /** @internal Compiler-injected */\n __dirty?: (oldState: S, newState: S) => number | [number, number]\n /** @internal Compiler-injected */\n __renderToString?: (state: S) => string\n /** @internal Compiler-injected */\n __msgSchema?: object\n /** @internal Compiler-injected — maps top-level state field → dirty-mask bit(s) */\n __maskLegend?: Record<string, number>\n /** @internal Compiler-injected — source-file location of the component() call */\n __componentMeta?: { file: string; line: number }\n /** @internal Compiler-injected — shape of the State type (for introspection) */\n __stateSchema?: object\n /** @internal Compiler-injected — Effect union schema (for introspection) */\n __effectSchema?: object\n /** @internal Compiler-injected — replaces generic Phase 1 + Phase 2 loop */\n __update?: (\n state: S,\n dirty: number,\n bindings: Binding[],\n blocks: StructuralBlock[],\n bindingsBeforePhase1: number,\n ) => void\n /** @internal Compiler-injected — per-message-type specialized handlers.\n * Bypass the entire processMessages pipeline for single-message updates. */\n __handlers?: Record<string, (inst: object, msg: unknown) => [S, E[]]>\n}\n\nexport type Send<M> = (msg: M) => void\n\n/**\n * Type-erased component definition for use at module boundaries where\n * the consumer's `S`, `M`, `E` are internal and invisible to the caller.\n *\n * Why this exists: `ComponentDef<S, M, E, D>` uses property syntax for\n * its callable fields (`init: (data: D) => ...`), and TypeScript\n * checks property syntax with strict (contravariant) variance. That's\n * the right call for user-facing type safety when authoring a\n * component (a narrower `Msg` type can't accidentally satisfy the\n * `update`'s param), but it means `ComponentDef<MyState, MyMsg, MyEffect, MyData>`\n * is NOT structurally assignable to `ComponentDef<unknown, unknown, unknown, unknown>`\n * — the `init: (data: MyData) => ...` field is contravariant in `MyData`,\n * so widening to `unknown` is rejected.\n *\n * `AnyComponentDef` (and `LazyDef<D>` below) declare the same fields\n * using **method syntax** (`init(data: D): ...`), which TypeScript\n * checks bivariantly. Concrete `ComponentDef<S, M, E, D>` assigns into\n * these structurally without any `widenDef` helper at the callsite.\n *\n * Used by every API that accepts an opaque component definition at a\n * module boundary:\n *\n * - `child({ def })`\n * - `lazy({ loader })` — returns `LazyDef<D>` so the loader's `D` survives\n * - `createOnRenderClient({ Layout })` (from `@llui/vike`)\n * - `createOnRenderHtml({ Layout })` (from `@llui/vike`)\n *\n * The `D` parameter is `unknown` here — `child()` doesn't pass init\n * data through, and `Layout` callers pass route-supplied data whose\n * shape is unknown at the type-erased boundary. Use `LazyDef<D>` when\n * you need to preserve the init data shape (the lazy loader case).\n */\nexport interface AnyComponentDef {\n name: string\n init(data: unknown): [unknown, unknown[]]\n update(state: unknown, msg: unknown): [unknown, unknown[]]\n view(h: unknown): Node[]\n onEffect?: unknown\n propsMsg?: unknown\n receives?: unknown\n __dirty?: unknown\n __renderToString?: unknown\n __msgSchema?: unknown\n __maskLegend?: unknown\n __componentMeta?: unknown\n __stateSchema?: unknown\n __effectSchema?: unknown\n __update?: unknown\n __handlers?: unknown\n}\n\n/**\n * Type-erased component definition for use at module boundaries where the\n * loaded component's S, M, E are internal and invisible to the caller.\n * Only `D` (init data) survives because the caller provides it.\n *\n * `ComponentDef<S, M, E, D>` is structurally assignable to `LazyDef<D>`\n * for any S, M, E — `view: (h: unknown) => Node[]` accepts any View via\n * contravariance, and all other fields widen to `unknown` return types.\n *\n * Used by `lazy()` as the loader's return type. Use `AnyComponentDef`\n * (above) when D is also opaque — most other adapter-layer APIs.\n */\nexport interface LazyDef<D = void> {\n name: string\n // Method syntax — TypeScript checks methods bivariantly, so\n // ComponentDef<S, M, E, D>'s concrete (state: S, msg: M) => ...\n // assigns here even though S/M ≠ unknown. Property syntax would\n // be contravariant and reject the assignment.\n init(data: D): [unknown, unknown[]]\n update(state: unknown, msg: unknown): [unknown, unknown[]]\n view(h: unknown): Node[]\n onEffect?: unknown\n propsMsg?: unknown\n receives?: unknown\n __dirty?: unknown\n __renderToString?: unknown\n __msgSchema?: unknown\n __maskLegend?: unknown\n __componentMeta?: unknown\n __stateSchema?: unknown\n __effectSchema?: unknown\n __update?: unknown\n __handlers?: unknown\n}\n\n/**\n * Maps a value shape to a reactive-props shape: every field becomes an accessor\n * `(s: S) => V`. Use for Level-1 view function signatures.\n *\n * ```ts\n * type ToolbarData = { tools: Tool[]; theme: 'light' | 'dark' }\n *\n * export function toolbar<S>(props: Props<ToolbarData, S>, send: Send<Msg>) {\n * return [div({ class: props.theme }, [each({ items: props.tools, ... })])]\n * }\n *\n * // Caller — TypeScript enforces per-field accessors; passing a raw value errors:\n * toolbar({ tools: (s: State) => s.tools, theme: (s) => s.theme }, send)\n * ```\n */\nexport type Props<T, S> = {\n [K in keyof T]: (s: S) => T[K]\n}\n\n// ── App Handle ────────────────────────────────────────────────────\n\nexport interface AppHandle {\n dispose(): void\n flush(): void\n /**\n * Dispatch a message into the mounted instance from outside its\n * normal view-bound `send` channel. Useful for adapter layers that\n * need to push updates into a long-lived instance — e.g.\n * `@llui/vike`'s persistent-layout chain pushes layout-data updates\n * into surviving layer instances on client navigation when their\n * `propsMsg` translates the new data into a state-update message.\n *\n * Messages are queued through the same path as `view`-side `send`\n * calls — they batch into the next microtask and process via the\n * normal update loop. Calling `send` after `dispose` is a no-op.\n */\n send(msg: unknown): void\n}\n\n// ── Lifetime ─────────────────────────────────────────────────────────\n\nexport interface Lifetime {\n id: number\n parent: Lifetime | null\n children: Lifetime[]\n disposers: Array<() => void>\n bindings: Binding[]\n /** Per-item updaters — called directly by each() when item changes, bypassing Phase 2 */\n itemUpdaters: Array<() => void>\n /**\n * @internal dev-only back-reference to the owning ComponentInstance.\n * Populated on the root scope by `installDevTools` so `disposeLifetime`\n * can walk up the scope chain and emit DisposerEvents into the\n * instance's `_disposerLog`. Undefined in production.\n */\n instance?: ComponentInstance\n /**\n * @internal dev-only cause hint. Structural primitives (branch, each,\n * child, mountApp teardown) set this field immediately before calling\n * `disposeLifetime`; the dispose path reads it once to stamp the emitted\n * DisposerEvent. Left undefined, `disposeLifetime` falls back to\n * `'component-unmount'`. Undefined in production.\n */\n disposalCause?: DisposerEvent['cause']\n /** @internal dev-only — populated by structural primitives for scope-tree classification */\n _kind?: 'root' | 'show' | 'each' | 'branch' | 'scope' | 'child' | 'portal' | 'foreign'\n}\n\nexport interface LifetimeNode {\n scopeId: string\n kind: 'root' | 'show' | 'each' | 'branch' | 'scope' | 'child' | 'portal' | 'foreign'\n active: boolean\n children: LifetimeNode[]\n}\n\n// ── Binding ───────────────────────────────────────────────────────\n\n/**\n * Binding output kinds.\n *\n * `'text' | 'prop' | 'attr' | 'class' | 'style'` write their accessor's\n * return value to the DOM. `'effect'` is a side-effect-only watcher:\n * the accessor is invoked every Phase 2 tick its mask is hit, but its\n * return value is discarded and `applyBinding` is a no-op. Used by\n * `child()` to fire the prop-diff/propsMsg cascade on parent updates\n * without the cost of stringifying the returned props bag onto a\n * detached anchor node every render.\n */\nexport type BindingKind = 'text' | 'prop' | 'attr' | 'class' | 'style' | 'effect'\n\nexport interface Binding {\n mask: number\n accessor: (state: unknown) => unknown\n lastValue: unknown\n kind: BindingKind\n node: Node\n key?: string\n ownerLifetime: Lifetime\n perItem: boolean\n dead: boolean\n}\n\n// ── Structural Primitives ─────────────────────────────────────────\n\nexport interface TransitionOptions {\n enter?: (nodes: Node[]) => void | Promise<void>\n leave?: (nodes: Node[]) => void | Promise<void>\n onTransition?: (ctx: { entering: Node[]; leaving: Node[]; parent: Node }) => void | Promise<void>\n}\n\n/**\n * Options for `branch()`.\n *\n * `on(state)` returns a string-valued discriminant. The reconciler looks\n * up `cases[on(state)]` on each change; falls back to `default` when no\n * case matches, or renders nothing if no `default` is provided.\n *\n * `cases` is optional — `branch({ on, default })` is the canonical\n * dynamic-rebuild shape. `scope()` sugar wraps exactly this form.\n */\nexport interface BranchOptions<S, M = unknown> extends TransitionOptions {\n on: (s: S) => string\n cases?: Record<string, (h: View<S, M>) => Node[]>\n /**\n * Fallback builder. Runs when `on(state)` returns a key not present in\n * `cases`, or when `cases` is omitted entirely. A future type-level\n * pass may make this required-or-disallowed by inferring exhaustiveness\n * against the literal union returned by `on`; today it is always\n * optional.\n */\n default?: (h: View<S, M>) => Node[]\n /**\n * @internal Set by `show()` / `scope()` sugar when delegating to\n * `branch()`, so the dev-only disposer log can report `'show-hide'` /\n * `'scope-rebuild'` instead of the default `'branch-swap'` for the\n * leaving arm. User code should not set this directly.\n */\n __disposalCause?: DisposerEvent['cause']\n /** @internal Compiler-injected mask of paths read by `on`. */\n __mask?: number\n}\n\nexport interface ShowOptions<S, M = unknown> extends TransitionOptions {\n when: (s: S) => boolean\n render: (h: View<S, M>) => Node[]\n fallback?: (h: View<S, M>) => Node[]\n}\n\n/**\n * Options for `scope()` — rebuilds a subtree when `on(state)` changes.\n *\n * Sugar over `branch({ on, cases: {}, default: render, __disposalCause: 'scope-rebuild' })`.\n * Use when the key is dynamic (e.g. an epoch counter bumped from the\n * outside) and you want a fresh arm — fresh lifetime, fresh bindings —\n * each time it changes. Combine with `sample()` inside `render` for a\n * one-shot current-state read.\n */\nexport interface ScopeOptions<S, M = unknown> extends TransitionOptions {\n on: (s: S) => string\n render: (h: View<S, M>) => Node[]\n /** @internal Compiler-injected mask of paths read by `on`. */\n __mask?: number\n}\n\n/**\n * Options for `each()`. The inherited `enter` / `leave` callbacks fire **per item**:\n * `enter(nodes)` runs after an item's DOM is inserted (including initial mount);\n * `leave(nodes)` runs before an item's DOM is removed and may return a Promise\n * to hold the DOM until the animation resolves. Setting `leave` disables the\n * bulk-clear / full-replace fast paths.\n */\n/**\n * Per-item accessor. Two access forms:\n * - `item.field` — shorthand, returns accessor for `item.current[field]`\n * - `item(t => t.expr)` — computed expressions\n *\n * In both cases the returned value is a `() => V` accessor.\n * Invoke it (`item.field()`) to read the current value imperatively.\n */\nexport type ItemAccessor<T> = {\n <R>(selector: (t: T) => R): () => R\n} & {\n [K in keyof T]-?: () => T[K]\n} & {\n /**\n * Read the whole current item. Needed when T is a primitive (where the\n * field-map branch collapses to method names like `toString`) or when\n * you want to sample the entire record rather than a single field.\n *\n * Shadows any literal `current` field on T — if T has such a field,\n * use `item(r => r.current)` to disambiguate.\n */\n current(): T\n}\n\nexport interface EachOptions<S, T, M = unknown> extends TransitionOptions {\n items: (s: S) => T[]\n key: (item: T) => string | number\n render: (opts: {\n send: Send<M>\n item: ItemAccessor<T>\n /**\n * Plain (non-Proxy) accessor factory. Compiler-output path; avoid in user code\n * (use `item.field` / `item(fn)` — more ergonomic and bypasses Proxy when compiled).\n */\n acc: <R>(selector: (t: T) => R) => () => R\n index: () => number\n /** @internal Compiler-injected — entry reference for row factory */\n entry?: Record<string, unknown>\n }) => Node[]\n}\n\nexport interface PortalOptions {\n target: HTMLElement | string\n render: () => Node[]\n}\n\nexport interface ForeignOptions<S, M, T extends Record<string, unknown>, Instance> {\n mount: (ctx: { container: HTMLElement; send: Send<M> }) => Instance\n props: (s: S) => T\n sync:\n | ((ctx: { instance: Instance; props: T; prev: T | undefined }) => void)\n | {\n [K in keyof T]?: (ctx: { instance: Instance; value: T[K]; prev: T[K] | undefined }) => void\n }\n destroy: (instance: Instance) => void\n container?: { tag?: string; attrs?: Record<string, string> }\n}\n\nexport interface ChildOptions<S, ChildM> {\n // Type-erased via AnyComponentDef so callers can pass any concrete\n // ComponentDef<S, M, E, D> without a widening helper. The runtime\n // narrows the message shape via the user-supplied `onMsg` callback,\n // which keeps `ChildM` typed at this boundary even though the def\n // itself is opaque.\n def: AnyComponentDef\n key: string | number\n props: (s: S) => Record<string, unknown>\n onMsg?: (msg: ChildM) => unknown | null\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { ComponentDef, Scope, Binding } from './types.js';
1
+ import type { ComponentDef, Lifetime, Binding } from './types.js';
2
2
  import type { StructuralBlock } from './structural.js';
3
3
  export declare const FULL_MASK: number;
4
4
  export declare function setAddressedDispatcher(fn: (eff: {
@@ -9,7 +9,7 @@ export interface ComponentInstance<S = unknown, M = unknown, E = unknown> {
9
9
  def: ComponentDef<S, M, E>;
10
10
  state: S;
11
11
  initialEffects: E[];
12
- rootScope: Scope;
12
+ rootLifetime: Lifetime;
13
13
  allBindings: Binding[];
14
14
  structuralBlocks: StructuralBlock[];
15
15
  queue: M[];
@@ -20,7 +20,7 @@ export interface ComponentInstance<S = unknown, M = unknown, E = unknown> {
20
20
  signal: AbortSignal;
21
21
  abortController: AbortController;
22
22
  }
23
- export declare function createComponentInstance<S, M, E>(def: ComponentDef<S, M, E>, data?: unknown, parentScope?: Scope | null): ComponentInstance<S, M, E>;
23
+ export declare function createComponentInstance<S, M, E, D = void>(def: ComponentDef<S, M, E, D>, data?: D, parentLifetime?: Lifetime | null): ComponentInstance<S, M, E>;
24
24
  export declare function flushInstance<S, M, E>(inst: ComponentInstance<S, M, E>): void;
25
25
  /**
26
26
  * Dev-only: overwrite instance state and re-run both phases with FULL_MASK
@@ -1 +1 @@
1
- {"version":3,"file":"update-loop.d.ts","sourceRoot":"","sources":["../src/update-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAatD,eAAO,MAAM,SAAS,QAAiB,CAAA;AAMvC,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,CAAC,GAAG,EAAE;IAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,KAAK,IAAI,GAClE,IAAI,CAEN;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACtE,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,KAAK,EAAE,CAAC,CAAA;IACR,cAAc,EAAE,CAAC,EAAE,CAAA;IACnB,SAAS,EAAE,KAAK,CAAA;IAChB,WAAW,EAAE,OAAO,EAAE,CAAA;IACtB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,kBAAkB,EAAE,OAAO,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,CAAC,EAAE,CAAA;IAChB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,eAAe,CAAA;CAiCjC;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC7C,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,OAAO,EACd,WAAW,GAAE,KAAK,GAAG,IAAW,GAC/B,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAwC5B;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAI7E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAqCxF;AA0GD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAoCtB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,oBAAoB,EAAE,MAAM,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAuDN"}
1
+ {"version":3,"file":"update-loop.d.ts","sourceRoot":"","sources":["../src/update-loop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAatD,eAAO,MAAM,SAAS,QAAiB,CAAA;AAMvC,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,CAAC,GAAG,EAAE;IAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,KAAK,IAAI,GAClE,IAAI,CAEN;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO;IACtE,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1B,KAAK,EAAE,CAAC,CAAA;IACR,cAAc,EAAE,CAAC,EAAE,CAAA;IACnB,YAAY,EAAE,QAAQ,CAAA;IACtB,WAAW,EAAE,OAAO,EAAE,CAAA;IACtB,gBAAgB,EAAE,eAAe,EAAE,CAAA;IACnC,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,kBAAkB,EAAE,OAAO,CAAA;IAC3B,aAAa,EAAE,MAAM,CAAA;IACrB,WAAW,EAAE,CAAC,EAAE,CAAA;IAChB,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,eAAe,EAAE,eAAe,CAAA;CAiCjC;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EACvD,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,IAAI,CAAC,EAAE,CAAC,EACR,cAAc,GAAE,QAAQ,GAAG,IAAW,GACrC,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CA4C5B;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAI7E;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAqCxF;AA0GD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,iBAAiB,EACvB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAoCtB;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,EAAE,EACnB,oBAAoB,EAAE,MAAM,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAuDN"}
@@ -1,4 +1,4 @@
1
- import { createScope } from './scope.js';
1
+ import { createLifetime } from './lifetime.js';
2
2
  import { applyBinding } from './binding.js';
3
3
  import { setCurrentDirtyMask } from './primitives/memo.js';
4
4
  export const FULL_MASK = 0xffffffff | 0;
@@ -7,20 +7,24 @@ let addressedDispatcher = null;
7
7
  export function setAddressedDispatcher(fn) {
8
8
  addressedDispatcher = fn;
9
9
  }
10
- export function createComponentInstance(def, data, parentScope = null) {
10
+ export function createComponentInstance(def, data, parentLifetime = null) {
11
11
  const [initialState, initialEffects] = def.init(data);
12
12
  const controller = new AbortController();
13
13
  const inst = {
14
- def,
14
+ // `def` carries an arbitrary `D` for typed init data, but after init
15
+ // has run the runtime never touches `def.init` again — update/view/
16
+ // onEffect and HMR replacement don't depend on D. Cast to the
17
+ // D=void instance storage shape here.
18
+ def: def,
15
19
  state: initialState,
16
20
  initialEffects,
17
- // When `parentScope` is provided the instance's rootScope becomes a
21
+ // When `parentLifetime` is provided the instance's rootLifetime becomes a
18
22
  // child of that scope. This is how persistent layouts wire pages
19
- // into the layout's scope tree: the page's rootScope is parented at
23
+ // into the layout's scope tree: the page's rootLifetime is parented at
20
24
  // the layout's pageSlot() point so `useContext` lookups flow layout
21
25
  // → page, and scope disposal cascades correctly. Mount paths that
22
- // don't pass parentScope get the classic detached root.
23
- rootScope: createScope(parentScope),
26
+ // don't pass parentLifetime get the classic detached root.
27
+ rootLifetime: createLifetime(parentLifetime),
24
28
  allBindings: [],
25
29
  structuralBlocks: [],
26
30
  queue: [],
@@ -40,7 +44,7 @@ export function createComponentInstance(def, data, parentScope = null) {
40
44
  }
41
45
  },
42
46
  };
43
- inst.rootScope._kind = 'root';
47
+ inst.rootLifetime._kind = 'root';
44
48
  return inst;
45
49
  }
46
50
  export function flushInstance(inst) {