@llui/dom 0.0.1

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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +15 -0
  3. package/dist/addressed.d.ts +16 -0
  4. package/dist/addressed.d.ts.map +1 -0
  5. package/dist/addressed.js +40 -0
  6. package/dist/addressed.js.map +1 -0
  7. package/dist/binding.d.ts +18 -0
  8. package/dist/binding.d.ts.map +1 -0
  9. package/dist/binding.js +62 -0
  10. package/dist/binding.js.map +1 -0
  11. package/dist/chain-update.d.ts +7 -0
  12. package/dist/chain-update.d.ts.map +1 -0
  13. package/dist/chain-update.js +16 -0
  14. package/dist/chain-update.js.map +1 -0
  15. package/dist/component.d.ts +3 -0
  16. package/dist/component.d.ts.map +1 -0
  17. package/dist/component.js +4 -0
  18. package/dist/component.js.map +1 -0
  19. package/dist/devtools.d.ts +113 -0
  20. package/dist/devtools.d.ts.map +1 -0
  21. package/dist/devtools.js +390 -0
  22. package/dist/devtools.js.map +1 -0
  23. package/dist/el-split.d.ts +3 -0
  24. package/dist/el-split.d.ts.map +1 -0
  25. package/dist/el-split.js +54 -0
  26. package/dist/el-split.js.map +1 -0
  27. package/dist/el-template.d.ts +17 -0
  28. package/dist/el-template.d.ts.map +1 -0
  29. package/dist/el-template.js +64 -0
  30. package/dist/el-template.js.map +1 -0
  31. package/dist/elements.d.ts +80 -0
  32. package/dist/elements.d.ts.map +1 -0
  33. package/dist/elements.js +234 -0
  34. package/dist/elements.js.map +1 -0
  35. package/dist/form.d.ts +30 -0
  36. package/dist/form.d.ts.map +1 -0
  37. package/dist/form.js +12 -0
  38. package/dist/form.js.map +1 -0
  39. package/dist/hmr.d.ts +20 -0
  40. package/dist/hmr.d.ts.map +1 -0
  41. package/dist/hmr.js +98 -0
  42. package/dist/hmr.js.map +1 -0
  43. package/dist/hydrate.d.ts +29 -0
  44. package/dist/hydrate.d.ts.map +1 -0
  45. package/dist/hydrate.js +96 -0
  46. package/dist/hydrate.js.map +1 -0
  47. package/dist/index.d.ts +28 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +34 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/merge-handlers.d.ts +7 -0
  52. package/dist/merge-handlers.d.ts.map +1 -0
  53. package/dist/merge-handlers.js +16 -0
  54. package/dist/merge-handlers.js.map +1 -0
  55. package/dist/mount.d.ts +14 -0
  56. package/dist/mount.d.ts.map +1 -0
  57. package/dist/mount.js +182 -0
  58. package/dist/mount.js.map +1 -0
  59. package/dist/primitives/branch.d.ts +3 -0
  60. package/dist/primitives/branch.d.ts.map +1 -0
  61. package/dist/primitives/branch.js +94 -0
  62. package/dist/primitives/branch.js.map +1 -0
  63. package/dist/primitives/child.d.ts +3 -0
  64. package/dist/primitives/child.d.ts.map +1 -0
  65. package/dist/primitives/child.js +77 -0
  66. package/dist/primitives/child.js.map +1 -0
  67. package/dist/primitives/context.d.ts +45 -0
  68. package/dist/primitives/context.d.ts.map +1 -0
  69. package/dist/primitives/context.js +87 -0
  70. package/dist/primitives/context.js.map +1 -0
  71. package/dist/primitives/each.d.ts +3 -0
  72. package/dist/primitives/each.d.ts.map +1 -0
  73. package/dist/primitives/each.js +515 -0
  74. package/dist/primitives/each.js.map +1 -0
  75. package/dist/primitives/error-boundary.d.ts +6 -0
  76. package/dist/primitives/error-boundary.d.ts.map +1 -0
  77. package/dist/primitives/error-boundary.js +32 -0
  78. package/dist/primitives/error-boundary.js.map +1 -0
  79. package/dist/primitives/foreign.d.ts +3 -0
  80. package/dist/primitives/foreign.d.ts.map +1 -0
  81. package/dist/primitives/foreign.js +80 -0
  82. package/dist/primitives/foreign.js.map +1 -0
  83. package/dist/primitives/memo.d.ts +3 -0
  84. package/dist/primitives/memo.d.ts.map +1 -0
  85. package/dist/primitives/memo.js +30 -0
  86. package/dist/primitives/memo.js.map +1 -0
  87. package/dist/primitives/on-mount.d.ts +2 -0
  88. package/dist/primitives/on-mount.d.ts.map +1 -0
  89. package/dist/primitives/on-mount.js +23 -0
  90. package/dist/primitives/on-mount.js.map +1 -0
  91. package/dist/primitives/portal.d.ts +3 -0
  92. package/dist/primitives/portal.d.ts.map +1 -0
  93. package/dist/primitives/portal.js +31 -0
  94. package/dist/primitives/portal.js.map +1 -0
  95. package/dist/primitives/selector.d.ts +22 -0
  96. package/dist/primitives/selector.d.ts.map +1 -0
  97. package/dist/primitives/selector.js +104 -0
  98. package/dist/primitives/selector.js.map +1 -0
  99. package/dist/primitives/show.d.ts +3 -0
  100. package/dist/primitives/show.d.ts.map +1 -0
  101. package/dist/primitives/show.js +12 -0
  102. package/dist/primitives/show.js.map +1 -0
  103. package/dist/primitives/slice.d.ts +23 -0
  104. package/dist/primitives/slice.d.ts.map +1 -0
  105. package/dist/primitives/slice.js +57 -0
  106. package/dist/primitives/slice.js.map +1 -0
  107. package/dist/primitives/text.d.ts +2 -0
  108. package/dist/primitives/text.d.ts.map +1 -0
  109. package/dist/primitives/text.js +35 -0
  110. package/dist/primitives/text.js.map +1 -0
  111. package/dist/render-context.d.ts +14 -0
  112. package/dist/render-context.d.ts.map +1 -0
  113. package/dist/render-context.js +14 -0
  114. package/dist/render-context.js.map +1 -0
  115. package/dist/runtime.d.ts +4 -0
  116. package/dist/runtime.d.ts.map +1 -0
  117. package/dist/runtime.js +14 -0
  118. package/dist/runtime.js.map +1 -0
  119. package/dist/scope.d.ts +24 -0
  120. package/dist/scope.d.ts.map +1 -0
  121. package/dist/scope.js +102 -0
  122. package/dist/scope.js.map +1 -0
  123. package/dist/slice-handler.d.ts +31 -0
  124. package/dist/slice-handler.d.ts.map +1 -0
  125. package/dist/slice-handler.js +34 -0
  126. package/dist/slice-handler.js.map +1 -0
  127. package/dist/ssr-dom.d.ts +12 -0
  128. package/dist/ssr-dom.d.ts.map +1 -0
  129. package/dist/ssr-dom.js +36 -0
  130. package/dist/ssr-dom.js.map +1 -0
  131. package/dist/ssr.d.ts +11 -0
  132. package/dist/ssr.d.ts.map +1 -0
  133. package/dist/ssr.js +127 -0
  134. package/dist/ssr.js.map +1 -0
  135. package/dist/structural.d.ts +4 -0
  136. package/dist/structural.d.ts.map +1 -0
  137. package/dist/structural.js +2 -0
  138. package/dist/structural.js.map +1 -0
  139. package/dist/types.d.ts +145 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +3 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/update-loop.d.ts +31 -0
  144. package/dist/update-loop.d.ts.map +1 -0
  145. package/dist/update-loop.js +236 -0
  146. package/dist/update-loop.js.map +1 -0
  147. package/dist/view-helpers.d.ts +44 -0
  148. package/dist/view-helpers.d.ts.map +1 -0
  149. package/dist/view-helpers.js +24 -0
  150. package/dist/view-helpers.js.map +1 -0
  151. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAoBrE,qEAAqE;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAA;AAEtD,qEAAqE;AAErE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAqB,MAAM,SAAS,CAAA;AAKjE,qEAAqE;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAgB,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAE9C,qEAAqE;AAErE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAE3D,qEAAqE;AAErE,OAAO,EACL,CAAC,EACD,IAAI,EACJ,OAAO,EACP,KAAK,EACL,CAAC,EACD,UAAU,EACV,EAAE,EACF,MAAM,EACN,MAAM,EACN,IAAI,EACJ,EAAE,EACF,OAAO,EACP,MAAM,EACN,GAAG,EACH,EAAE,EACF,EAAE,EACF,EAAE,EACF,QAAQ,EACR,UAAU,EACV,MAAM,EACN,MAAM,EACN,IAAI,EACJ,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,EAAE,EACF,MAAM,EACN,EAAE,EACF,CAAC,EACD,MAAM,EACN,GAAG,EACH,KAAK,EACL,KAAK,EACL,MAAM,EACN,EAAE,EACF,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,EAAE,EACF,QAAQ,EACR,MAAM,EACN,MAAM,EACN,CAAC,EACD,GAAG,EACH,QAAQ,EACR,OAAO,EACP,MAAM,EACN,KAAK,EACL,IAAI,EACJ,MAAM,EACN,GAAG,EACH,OAAO,EACP,GAAG,EACH,KAAK,EACL,KAAK,EACL,EAAE,EACF,QAAQ,EACR,KAAK,EACL,EAAE,EACF,KAAK,EACL,IAAI,EACJ,EAAE,EACF,EAAE,EACF,KAAK,GACN,MAAM,YAAY,CAAA;AAEnB,qEAAqE;AAErE,OAAO,EAAE,UAAU,EAAiB,MAAM,QAAQ,CAAA;AAElD,qEAAqE;AAErE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Compose multiple update handlers into one.
3
+ * Each handler returns [newState, effects] if it handled the message, or null to pass through.
4
+ * The first handler that returns non-null wins.
5
+ */
6
+ export declare function mergeHandlers<S, M, E>(...handlers: Array<(state: S, msg: M) => [S, E[]] | null>): (state: S, msg: M) => [S, E[]];
7
+ //# sourceMappingURL=merge-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-handlers.d.ts","sourceRoot":"","sources":["../src/merge-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,GAAG,QAAQ,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GACxD,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAQhC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Compose multiple update handlers into one.
3
+ * Each handler returns [newState, effects] if it handled the message, or null to pass through.
4
+ * The first handler that returns non-null wins.
5
+ */
6
+ export function mergeHandlers(...handlers) {
7
+ return (state, msg) => {
8
+ for (const handler of handlers) {
9
+ const result = handler(state, msg);
10
+ if (result)
11
+ return result;
12
+ }
13
+ return [state, []];
14
+ };
15
+ }
16
+ //# sourceMappingURL=merge-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-handlers.js","sourceRoot":"","sources":["../src/merge-handlers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAG,QAAsD;IAEzD,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACpB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YAClC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAA;QAC3B,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACpB,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ComponentDef, AppHandle } from './types';
2
+ declare global {
3
+ interface ImportMeta {
4
+ env?: {
5
+ DEV?: boolean;
6
+ };
7
+ }
8
+ }
9
+ export interface MountOptions {
10
+ devTools?: boolean;
11
+ }
12
+ export declare function mountApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, data?: unknown, _options?: MountOptions): AppHandle;
13
+ export declare function hydrateApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, serverState: S): AppHandle;
14
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAStD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,UAAU;QAClB,GAAG,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KACxB;CACF;AAsBD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAC9B,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,YAAY,GACtB,SAAS,CAuEX;AA6DD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,WAAW,EAAE,CAAC,GACb,SAAS,CAoCX"}
package/dist/mount.js ADDED
@@ -0,0 +1,182 @@
1
+ import { createComponentInstance, flushInstance } from './update-loop';
2
+ import { disposeScope } from './scope';
3
+ import { setRenderContext, clearRenderContext } from './render-context';
4
+ import { setFlatBindings } from './binding';
5
+ import { registerInstance, unregisterInstance } from './runtime';
6
+ // ── HMR (dev only) ──────────────────────────────────────────────
7
+ // Set by enableHmr() from '@llui/dom/hmr' — never imported in production.
8
+ let hmrModule = null;
9
+ /** @internal Called by enableHmr in the hmr module */
10
+ export function _setHmrModule(m) {
11
+ hmrModule = m;
12
+ }
13
+ // ── DevTools auto-install (dev only) ────────────────────────────
14
+ // Set by enableDevTools() from '@llui/dom/devtools' — never imported in production.
15
+ let devToolsInstall = null;
16
+ /** @internal Called by enableDevTools in the devtools module */
17
+ export function _setDevToolsInstall(fn) {
18
+ devToolsInstall = fn;
19
+ }
20
+ export function mountApp(container, def, data, _options) {
21
+ // HMR: if this component is already mounted (module re-execution
22
+ // during hot update), swap the definition instead of creating a new instance.
23
+ if (hmrModule && def.name) {
24
+ const swapped = hmrModule.replaceComponent(def.name, def);
25
+ if (swapped)
26
+ return swapped;
27
+ }
28
+ const inst = createComponentInstance(def, data);
29
+ // Dev-only: auto-install devtools if enabled via '@llui/dom/devtools' import
30
+ if (devToolsInstall)
31
+ devToolsInstall(inst);
32
+ // Dev-only: warn if initial state contains non-serializable values.
33
+ // Silent bug-bomb: Date/Map/Set/class instances break SSR, hydration, replay tools.
34
+ if (import.meta.env?.DEV) {
35
+ const offender = findNonSerializable(inst.state);
36
+ if (offender) {
37
+ console.warn(`[LLui] Non-serializable value in ${def.name} initial state at ${offender.path}:`, offender.value, '\nState must be plain JSON (no Date/Map/Set/class instances/functions).');
38
+ }
39
+ }
40
+ // Run view() within a render context so primitives can register bindings
41
+ setFlatBindings(inst.allBindings);
42
+ setRenderContext({ ...inst, container, send: inst.send });
43
+ // Pass a minimal View bundle with just `send`. State-bound helpers
44
+ // (show/text/each/...) are resolved by the compiler: it rewrites
45
+ // destructured aliases to direct imports from @llui/dom, so the view
46
+ // callback never needs them on h at runtime. createView() remains a
47
+ // public export for users who need the full bundle in dynamic / test
48
+ // scenarios — they call it explicitly.
49
+ const nodes = def.view({ send: inst.send });
50
+ clearRenderContext();
51
+ setFlatBindings(null);
52
+ // Batch-insert via DocumentFragment — one layout-invalidating operation
53
+ // instead of N individual appendChild calls on a live container element.
54
+ if (nodes.length > 1) {
55
+ const frag = document.createDocumentFragment();
56
+ for (const node of nodes)
57
+ frag.appendChild(node);
58
+ container.appendChild(frag);
59
+ }
60
+ else if (nodes.length === 1) {
61
+ container.appendChild(nodes[0]);
62
+ }
63
+ registerInstance(inst);
64
+ if (hmrModule && def.name) {
65
+ hmrModule.registerForHmr(def.name, inst, container);
66
+ }
67
+ dispatchInitialEffects(inst);
68
+ let disposed = false;
69
+ return {
70
+ dispose() {
71
+ if (disposed)
72
+ return;
73
+ disposed = true;
74
+ if (hmrModule && def.name)
75
+ hmrModule.unregisterForHmr(def.name, inst);
76
+ inst.abortController.abort();
77
+ unregisterInstance(inst);
78
+ disposeScope(inst.rootScope);
79
+ container.textContent = '';
80
+ },
81
+ flush() {
82
+ if (disposed)
83
+ return;
84
+ flushInstance(inst);
85
+ },
86
+ };
87
+ }
88
+ // Walks an object graph looking for non-JSON-serializable values. Returns the
89
+ // first offender found (depth-first), or null if everything is fine. Stops at
90
+ // depth 6 to bound runtime cost for large states.
91
+ function findNonSerializable(v, path = 'state', depth = 0, seen = new WeakSet()) {
92
+ if (depth > 6)
93
+ return null;
94
+ if (v === null || v === undefined)
95
+ return null;
96
+ const t = typeof v;
97
+ if (t === 'string' || t === 'number' || t === 'boolean')
98
+ return null;
99
+ if (t === 'function')
100
+ return { path, value: v };
101
+ if (t === 'symbol' || t === 'bigint')
102
+ return { path, value: v };
103
+ if (t !== 'object')
104
+ return null;
105
+ const obj = v;
106
+ if (seen.has(obj))
107
+ return null;
108
+ seen.add(obj);
109
+ if (obj instanceof Date)
110
+ return { path: `${path} (Date)`, value: v };
111
+ if (obj instanceof Map)
112
+ return { path: `${path} (Map)`, value: v };
113
+ if (obj instanceof Set)
114
+ return { path: `${path} (Set)`, value: v };
115
+ if (obj instanceof RegExp)
116
+ return { path: `${path} (RegExp)`, value: v };
117
+ if (obj instanceof Promise)
118
+ return { path: `${path} (Promise)`, value: v };
119
+ // Plain objects/arrays have Object.prototype / Array.prototype. Class instances
120
+ // have a different prototype.
121
+ const proto = Object.getPrototypeOf(obj);
122
+ if (proto !== null && proto !== Object.prototype && proto !== Array.prototype) {
123
+ return { path: `${path} (${proto?.constructor?.name ?? 'class instance'})`, value: v };
124
+ }
125
+ if (Array.isArray(v)) {
126
+ for (let i = 0; i < v.length; i++) {
127
+ const r = findNonSerializable(v[i], `${path}[${i}]`, depth + 1, seen);
128
+ if (r)
129
+ return r;
130
+ }
131
+ return null;
132
+ }
133
+ for (const k of Object.keys(obj)) {
134
+ const r = findNonSerializable(obj[k], `${path}.${k}`, depth + 1, seen);
135
+ if (r)
136
+ return r;
137
+ }
138
+ return null;
139
+ }
140
+ function dispatchInitialEffects(inst) {
141
+ if (inst.initialEffects.length === 0 || !inst.def.onEffect)
142
+ return;
143
+ for (const effect of inst.initialEffects) {
144
+ inst.def.onEffect({ effect, send: inst.send, signal: inst.signal });
145
+ }
146
+ inst.initialEffects = [];
147
+ }
148
+ export function hydrateApp(container, def, serverState) {
149
+ const hydrateDef = {
150
+ ...def,
151
+ init: () => [serverState, []],
152
+ };
153
+ const inst = createComponentInstance(hydrateDef);
154
+ // Build the component DOM and swap atomically with server HTML.
155
+ // Server HTML remains visible until JS finishes — no flash.
156
+ setFlatBindings(inst.allBindings);
157
+ setRenderContext({ ...inst, container, send: inst.send });
158
+ const nodes = hydrateDef.view({ send: inst.send });
159
+ clearRenderContext();
160
+ setFlatBindings(null);
161
+ // Atomic swap — replaces server HTML with client DOM in one operation
162
+ container.replaceChildren(...nodes);
163
+ registerInstance(inst);
164
+ let disposed = false;
165
+ return {
166
+ dispose() {
167
+ if (disposed)
168
+ return;
169
+ disposed = true;
170
+ inst.abortController.abort();
171
+ unregisterInstance(inst);
172
+ disposeScope(inst.rootScope);
173
+ container.textContent = '';
174
+ },
175
+ flush() {
176
+ if (disposed)
177
+ return;
178
+ flushInstance(inst);
179
+ },
180
+ };
181
+ }
182
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { BranchOptions } from '../types';
2
+ export declare function branch<S, M = unknown>(opts: BranchOptions<S, M>): Node[];
3
+ //# sourceMappingURL=branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.d.ts","sourceRoot":"","sources":["../../src/primitives/branch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAS,MAAM,UAAU,CAAA;AAMpD,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAiGxE"}
@@ -0,0 +1,94 @@
1
+ import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
2
+ import { createScope, disposeScope, addDisposer } from '../scope';
3
+ import { setFlatBindings } from '../binding';
4
+ export function branch(opts) {
5
+ const ctx = getRenderContext();
6
+ const parentScope = ctx.rootScope;
7
+ const blocks = ctx.structuralBlocks;
8
+ const send = ctx.send;
9
+ const anchor = document.createComment('branch');
10
+ let currentKey = opts.on(ctx.state);
11
+ let currentScope = null;
12
+ let currentNodes = [];
13
+ const caseKey = String(currentKey);
14
+ const builder = opts.cases[caseKey];
15
+ if (builder) {
16
+ currentScope = createScope(parentScope);
17
+ setRenderContext({ ...ctx, rootScope: currentScope });
18
+ currentNodes = builder(send);
19
+ clearRenderContext();
20
+ setRenderContext(ctx);
21
+ // Fire enter on initial mount
22
+ if (opts.enter && currentNodes.length > 0) {
23
+ opts.enter(currentNodes);
24
+ }
25
+ }
26
+ const block = {
27
+ reconcile(state) {
28
+ const newKey = opts.on(state);
29
+ if (Object.is(newKey, currentKey))
30
+ return;
31
+ const parent = anchor.parentNode;
32
+ if (!parent)
33
+ return;
34
+ const leavingNodes = currentNodes;
35
+ const leavingScope = currentScope;
36
+ // Build new arm first (before removing old — for FLIP animations)
37
+ currentNodes = [];
38
+ currentScope = null;
39
+ currentKey = newKey;
40
+ const newCaseKey = String(newKey);
41
+ const newBuilder = opts.cases[newCaseKey];
42
+ if (newBuilder) {
43
+ currentScope = createScope(parentScope);
44
+ setFlatBindings(ctx.allBindings);
45
+ setRenderContext({ ...ctx, rootScope: currentScope, state });
46
+ currentNodes = newBuilder(send);
47
+ clearRenderContext();
48
+ setFlatBindings(null);
49
+ const ref = anchor.nextSibling;
50
+ for (const node of currentNodes) {
51
+ parent.insertBefore(node, ref);
52
+ }
53
+ }
54
+ // Fire enter for new nodes
55
+ if (opts.enter && currentNodes.length > 0) {
56
+ opts.enter(currentNodes);
57
+ }
58
+ // Handle leave — may be deferred via Promise
59
+ const removeOld = () => {
60
+ for (const node of leavingNodes) {
61
+ if (node.parentNode)
62
+ node.parentNode.removeChild(node);
63
+ }
64
+ if (leavingScope)
65
+ disposeScope(leavingScope);
66
+ };
67
+ if (leavingNodes.length > 0 && opts.leave) {
68
+ const result = opts.leave(leavingNodes);
69
+ if (result && typeof result.then === 'function') {
70
+ ;
71
+ result.then(removeOld);
72
+ }
73
+ else {
74
+ removeOld();
75
+ }
76
+ }
77
+ else {
78
+ removeOld();
79
+ }
80
+ },
81
+ };
82
+ blocks.push(block);
83
+ addDisposer(parentScope, () => {
84
+ const idx = blocks.indexOf(block);
85
+ if (idx !== -1)
86
+ blocks.splice(idx, 1);
87
+ if (currentScope) {
88
+ disposeScope(currentScope);
89
+ currentScope = null;
90
+ }
91
+ });
92
+ return [anchor, ...currentNodes];
93
+ }
94
+ //# sourceMappingURL=branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch.js","sourceRoot":"","sources":["../../src/primitives/branch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAG5C,MAAM,UAAU,MAAM,CAAiB,IAAyB;IAC9D,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAA;IAC9B,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAA;IACjC,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAA;IACnC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAwB,CAAA;IAEzC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAE/C,IAAI,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAU,CAAC,CAAA;IACxC,IAAI,YAAY,GAAiB,IAAI,CAAA;IACrC,IAAI,YAAY,GAAW,EAAE,CAAA;IAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAA;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACnC,IAAI,OAAO,EAAE,CAAC;QACZ,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;QACvC,gBAAgB,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;QACrD,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B,kBAAkB,EAAE,CAAA;QACpB,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAErB,8BAA8B;QAC9B,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAoB;QAC7B,SAAS,CAAC,KAAc;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,KAAU,CAAC,CAAA;YAClC,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;gBAAE,OAAM;YAEzC,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAA;YAChC,IAAI,CAAC,MAAM;gBAAE,OAAM;YAEnB,MAAM,YAAY,GAAG,YAAY,CAAA;YACjC,MAAM,YAAY,GAAG,YAAY,CAAA;YAEjC,kEAAkE;YAClE,YAAY,GAAG,EAAE,CAAA;YACjB,YAAY,GAAG,IAAI,CAAA;YACnB,UAAU,GAAG,MAAM,CAAA;YAEnB,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YACzC,IAAI,UAAU,EAAE,CAAC;gBACf,YAAY,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;gBACvC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;gBAChC,gBAAgB,CAAC,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAA;gBAC5D,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;gBAC/B,kBAAkB,EAAE,CAAA;gBACpB,eAAe,CAAC,IAAI,CAAC,CAAA;gBAErB,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAA;gBAC9B,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;gBAChC,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC1B,CAAC;YAED,6CAA6C;YAC7C,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;oBAChC,IAAI,IAAI,CAAC,UAAU;wBAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBACxD,CAAC;gBACD,IAAI,YAAY;oBAAE,YAAY,CAAC,YAAY,CAAC,CAAA;YAC9C,CAAC,CAAA;YAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;gBACvC,IAAI,MAAM,IAAI,OAAQ,MAAwB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACnE,CAAC;oBAAC,MAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAC5C,CAAC;qBAAM,CAAC;oBACN,SAAS,EAAE,CAAA;gBACb,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,SAAS,EAAE,CAAA;YACb,CAAC;QACH,CAAC;KACF,CAAA;IAED,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAElB,WAAW,CAAC,WAAW,EAAE,GAAG,EAAE;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACrC,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,YAAY,CAAC,CAAA;YAC1B,YAAY,GAAG,IAAI,CAAA;QACrB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAA;AAClC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ChildOptions } from '../types';
2
+ export declare function child<S, ChildM>(opts: ChildOptions<S, ChildM>): Node[];
3
+ //# sourceMappingURL=child.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child.d.ts","sourceRoot":"","sources":["../../src/primitives/child.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,UAAU,CAAA;AAU1D,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE,CAmFtE"}
@@ -0,0 +1,77 @@
1
+ import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
2
+ import { createScope, disposeScope, addDisposer } from '../scope';
3
+ import { createComponentInstance, flushInstance } from '../update-loop';
4
+ import { createBinding, setFlatBindings } from '../binding';
5
+ import { registerChild, unregisterChild } from '../addressed';
6
+ const FULL_MASK = 0xffffffff;
7
+ export function child(opts) {
8
+ // Dev-mode guard: props must be a function, not a static object
9
+ if (typeof opts.props !== 'function') {
10
+ throw new Error(`child("${String(opts.key)}"): props must be a reactive accessor function ` +
11
+ `(s => ({ ... })), not a static object. Static props are captured once at mount ` +
12
+ `and never update.`);
13
+ }
14
+ const parentCtx = getRenderContext();
15
+ const parentScope = parentCtx.rootScope;
16
+ const childScope = createScope(parentScope);
17
+ const parentSend = parentCtx.send;
18
+ const childDef = opts.def;
19
+ const initialProps = opts.props(parentCtx.state);
20
+ const childInst = createComponentInstance(childDef, initialProps);
21
+ // Wrap child's send to intercept messages for onMsg → parent
22
+ const originalSend = childInst.send;
23
+ childInst.send = (msg) => {
24
+ originalSend(msg);
25
+ if (opts.onMsg && parentSend) {
26
+ // Defer to after the child processes — use microtask
27
+ queueMicrotask(() => {
28
+ const parentMsg = opts.onMsg(msg);
29
+ if (parentMsg != null) {
30
+ parentSend(parentMsg);
31
+ }
32
+ });
33
+ }
34
+ };
35
+ // Track props for shallow-diff
36
+ let prevProps = { ...initialProps };
37
+ // Register a binding on the child scope that watches parent props changes
38
+ createBinding(childScope, {
39
+ mask: FULL_MASK,
40
+ accessor: ((parentState) => {
41
+ const newProps = opts.props(parentState);
42
+ let changed = false;
43
+ for (const key of Object.keys(newProps)) {
44
+ if (!Object.is(newProps[key], prevProps[key])) {
45
+ changed = true;
46
+ break;
47
+ }
48
+ }
49
+ if (changed && childDef.propsMsg) {
50
+ const msg = childDef.propsMsg(newProps);
51
+ childInst.send(msg);
52
+ flushInstance(childInst);
53
+ }
54
+ prevProps = { ...newProps };
55
+ return newProps;
56
+ }),
57
+ kind: 'text',
58
+ node: document.createComment('child:' + opts.key),
59
+ perItem: false,
60
+ });
61
+ // Run the child's view within the child's render context
62
+ setFlatBindings(childInst.allBindings);
63
+ setRenderContext({ ...childInst, send: childInst.send });
64
+ const nodes = childDef.view({ send: childInst.send });
65
+ clearRenderContext();
66
+ setFlatBindings(parentCtx.allBindings);
67
+ setRenderContext(parentCtx);
68
+ // Register in component registry for addressed effects
69
+ registerChild(opts.key, { send: childInst.send });
70
+ // Cleanup: dispose child instance when parent scope disposes
71
+ addDisposer(childScope, () => {
72
+ unregisterChild(opts.key);
73
+ disposeScope(childInst.rootScope);
74
+ });
75
+ return nodes;
76
+ }
77
+ //# sourceMappingURL=child.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child.js","sourceRoot":"","sources":["../../src/primitives/child.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ export interface Context<T> {
2
+ readonly _id: symbol;
3
+ readonly _default: T | undefined;
4
+ }
5
+ /**
6
+ * Create a typed context key. Pass a default value to make consumers without a
7
+ * provider resolve to it; omit to make unprovided consumption throw.
8
+ *
9
+ * ```ts
10
+ * const ThemeContext = createContext<'light' | 'dark'>('light')
11
+ * ```
12
+ */
13
+ export declare function createContext<T>(defaultValue?: T): Context<T>;
14
+ /**
15
+ * Provide a reactive value for `ctx` to every descendant rendered inside `children`.
16
+ * The accessor `(s: S) => T` is evaluated lazily at binding read time, so providers
17
+ * can thread state slices down without prop drilling.
18
+ *
19
+ * ```ts
20
+ * view: ({ send }) => [
21
+ * provide(ThemeContext, (s: State) => s.theme, () => [
22
+ * header(send),
23
+ * main(send),
24
+ * ]),
25
+ * ]
26
+ * ```
27
+ *
28
+ * Nested providers shadow outer ones within their subtree. The outer value is
29
+ * restored after `children()` returns, so sibling subtrees aren't affected.
30
+ */
31
+ export declare function provide<S, T>(ctx: Context<T>, accessor: (s: S) => T, children: () => Node[]): Node[];
32
+ /**
33
+ * Read a context accessor within a view or view-function. Walks the scope chain
34
+ * from the current render point to find the nearest provider. Returns an
35
+ * `(s: S) => T` accessor that can be passed to bindings (text/class/etc.).
36
+ *
37
+ * ```ts
38
+ * export function themedCard(): Node[] {
39
+ * const theme = useContext(ThemeContext)
40
+ * return div({ class: (s) => `card theme-${theme(s)}` }, [...])
41
+ * }
42
+ * ```
43
+ */
44
+ export declare function useContext<S, T>(ctx: Context<T>): (s: S) => T;
45
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/primitives/context.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,SAAS,CAAA;CACjC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAE7D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EACrB,QAAQ,EAAE,MAAM,IAAI,EAAE,GACrB,IAAI,EAAE,CAoBR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAgB7D"}
@@ -0,0 +1,87 @@
1
+ import { getRenderContext, setRenderContext, clearRenderContext } from '../render-context';
2
+ import { createScope } from '../scope';
3
+ /**
4
+ * Per-scope storage: scope → (context-id → accessor).
5
+ * WeakMap so disposed scopes are GC'd.
6
+ */
7
+ const contextMap = new WeakMap();
8
+ /**
9
+ * Create a typed context key. Pass a default value to make consumers without a
10
+ * provider resolve to it; omit to make unprovided consumption throw.
11
+ *
12
+ * ```ts
13
+ * const ThemeContext = createContext<'light' | 'dark'>('light')
14
+ * ```
15
+ */
16
+ export function createContext(defaultValue) {
17
+ return { _id: Symbol('llui-ctx'), _default: defaultValue };
18
+ }
19
+ /**
20
+ * Provide a reactive value for `ctx` to every descendant rendered inside `children`.
21
+ * The accessor `(s: S) => T` is evaluated lazily at binding read time, so providers
22
+ * can thread state slices down without prop drilling.
23
+ *
24
+ * ```ts
25
+ * view: ({ send }) => [
26
+ * provide(ThemeContext, (s: State) => s.theme, () => [
27
+ * header(send),
28
+ * main(send),
29
+ * ]),
30
+ * ]
31
+ * ```
32
+ *
33
+ * Nested providers shadow outer ones within their subtree. The outer value is
34
+ * restored after `children()` returns, so sibling subtrees aren't affected.
35
+ */
36
+ export function provide(ctx, accessor, children) {
37
+ const renderCtx = getRenderContext();
38
+ const parentScope = renderCtx.rootScope;
39
+ // Create a sub-scope so the context is attached to THIS provider alone.
40
+ // Descendants (including those mounted later via show/branch/each) walk
41
+ // up to this scope via their own parent chain and find the accessor.
42
+ // Nested providers create their own sub-scope, shadowing outer values.
43
+ const providerScope = createScope(parentScope);
44
+ const map = new Map();
45
+ map.set(ctx._id, accessor);
46
+ contextMap.set(providerScope, map);
47
+ // Render children with the provider scope as the new rootScope so any
48
+ // primitives (bindings, structural blocks, nested providers) attach here.
49
+ setRenderContext({ ...renderCtx, rootScope: providerScope });
50
+ try {
51
+ return children();
52
+ }
53
+ finally {
54
+ clearRenderContext();
55
+ setRenderContext(renderCtx);
56
+ }
57
+ }
58
+ /**
59
+ * Read a context accessor within a view or view-function. Walks the scope chain
60
+ * from the current render point to find the nearest provider. Returns an
61
+ * `(s: S) => T` accessor that can be passed to bindings (text/class/etc.).
62
+ *
63
+ * ```ts
64
+ * export function themedCard(): Node[] {
65
+ * const theme = useContext(ThemeContext)
66
+ * return div({ class: (s) => `card theme-${theme(s)}` }, [...])
67
+ * }
68
+ * ```
69
+ */
70
+ export function useContext(ctx) {
71
+ const renderCtx = getRenderContext();
72
+ let scope = renderCtx.rootScope;
73
+ while (scope) {
74
+ const map = contextMap.get(scope);
75
+ if (map?.has(ctx._id)) {
76
+ const accessor = map.get(ctx._id);
77
+ return accessor;
78
+ }
79
+ scope = scope.parent;
80
+ }
81
+ if (ctx._default !== undefined) {
82
+ const d = ctx._default;
83
+ return () => d;
84
+ }
85
+ throw new Error('[LLui] useContext: no provider found for context');
86
+ }
87
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/primitives/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAEtC;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA+C,CAAA;AAO7E;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAI,YAAgB;IAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAA;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,OAAO,CACrB,GAAe,EACf,QAAqB,EACrB,QAAsB;IAEtB,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAA;IACpC,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAA;IACvC,wEAAwE;IACxE,wEAAwE;IACxE,qEAAqE;IACrE,uEAAuE;IACvE,MAAM,aAAa,GAAG,WAAW,CAAC,WAAW,CAAC,CAAA;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmC,CAAA;IACtD,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,QAAmC,CAAC,CAAA;IACrD,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAA;IAClC,sEAAsE;IACtE,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,GAAG,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;IAC5D,IAAI,CAAC;QACH,OAAO,QAAQ,EAAE,CAAA;IACnB,CAAC;YAAS,CAAC;QACT,kBAAkB,EAAE,CAAA;QACpB,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC7B,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CAAO,GAAe;IAC9C,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAA;IACpC,IAAI,KAAK,GAAiB,SAAS,CAAC,SAAS,CAAA;IAC7C,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACjC,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAE,CAAA;YAClC,OAAO,QAAuB,CAAA;QAChC,CAAC;QACD,KAAK,GAAG,KAAK,CAAC,MAAM,CAAA;IACtB,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAA;QACtB,OAAO,GAAG,EAAE,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;AACrE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EachOptions } from '../types';
2
+ export declare function each<S, T, M = unknown>(opts: EachOptions<S, T, M>): Node[];
3
+ //# sourceMappingURL=each.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"each.d.ts","sourceRoot":"","sources":["../../src/primitives/each.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,UAAU,CAAA;AA4BhE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAuF1E"}