@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
@@ -0,0 +1,250 @@
1
+ let nextId = 1;
2
+ /**
3
+ * Walk up the scope chain to find the owning ComponentInstance. The
4
+ * instance is stamped onto the rootLifetime by `installDevTools`, so this
5
+ * returns null in production (no devtools) or for scopes that haven't
6
+ * yet been parented to a tracked root (e.g., during initial creation).
7
+ */
8
+ function findInstance(scope) {
9
+ let s = scope;
10
+ while (s) {
11
+ if (s.instance)
12
+ return s.instance;
13
+ s = s.parent;
14
+ }
15
+ return null;
16
+ }
17
+ // Shared empty arrays — avoid allocating per scope when unused
18
+ const EMPTY_LIFETIMES = [];
19
+ const EMPTY_DISPOSERS = [];
20
+ const EMPTY_BINDINGS = [];
21
+ const EMPTY_UPDATERS = [];
22
+ // Lifetime pool — reuse disposed scope objects to reduce GC pressure.
23
+ // Capped to avoid memory leaks in apps that create/destroy thousands of rows.
24
+ const SCOPE_POOL = [];
25
+ const SCOPE_POOL_MAX = 2048;
26
+ // Dev-mode flag. Flipped to true by installDevTools() once any component
27
+ // instance has a disposer log. In production this stays false forever,
28
+ // and disposeLifetime skips findInstance entirely — zero cost.
29
+ let anyDisposerLogInstalled = false;
30
+ /** @internal — called by devtools.ts::installDevTools */
31
+ export function _markDisposerLogInstalled() {
32
+ anyDisposerLogInstalled = true;
33
+ }
34
+ /** @internal Drain the scope pool — for testing only */
35
+ export function _drainScopePool() {
36
+ SCOPE_POOL.length = 0;
37
+ }
38
+ export function createLifetime(parent) {
39
+ let scope;
40
+ if (SCOPE_POOL.length > 0) {
41
+ scope = SCOPE_POOL.pop();
42
+ scope.id = nextId++;
43
+ scope.parent = parent;
44
+ // Arrays already reset to empties by dispose. Reset dev-only hints
45
+ // so recycled scopes don't carry stale tagging/back-refs. Cheap
46
+ // (two undefined writes) and keeps production-identical behavior
47
+ // when these fields are never set.
48
+ scope.disposalCause = undefined;
49
+ scope.instance = undefined;
50
+ scope._kind = undefined;
51
+ }
52
+ else {
53
+ scope = {
54
+ id: nextId++,
55
+ parent,
56
+ children: EMPTY_LIFETIMES,
57
+ disposers: EMPTY_DISPOSERS,
58
+ bindings: EMPTY_BINDINGS,
59
+ itemUpdaters: EMPTY_UPDATERS,
60
+ };
61
+ }
62
+ if (parent) {
63
+ if (parent.children === EMPTY_LIFETIMES)
64
+ parent.children = [];
65
+ parent.children.push(scope);
66
+ }
67
+ return scope;
68
+ }
69
+ /**
70
+ * Dispose a scope and all its children. By default, detaches the scope
71
+ * from its parent's `children` array via `indexOf + splice` — O(N) per
72
+ * call, which becomes O(N²) when disposing many sibling scopes in bulk
73
+ * (e.g. `each` clearing 1000 rows).
74
+ *
75
+ * Pass `skipParentRemoval = true` when the caller will batch-remove
76
+ * children afterwards (see `removeOrphanedFromParent`). The scope's
77
+ * `parent` pointer is still set to `null` so the caller can identify
78
+ * orphaned entries.
79
+ */
80
+ export function disposeLifetime(scope, skipParentRemoval = false) {
81
+ if (scope.disposers.length === 0 && scope.children.length === 0 && scope.bindings.length === 0) {
82
+ // Dev-only: still emit a DisposerEvent for empty scopes — the log
83
+ // is meant to capture every scope the app destroys, not only ones
84
+ // that had attached work. Outer flag check keeps production (no
85
+ // devtools ever installed) at true zero cost — no parent-chain walk.
86
+ if (anyDisposerLogInstalled) {
87
+ const inst = findInstance(scope);
88
+ if (inst?._disposerLog !== undefined) {
89
+ inst._disposerLog.push({
90
+ scopeId: String(scope.id),
91
+ cause: scope.disposalCause ?? 'component-unmount',
92
+ timestamp: Date.now(),
93
+ });
94
+ }
95
+ }
96
+ if (!skipParentRemoval)
97
+ removeFromParent(scope);
98
+ scope.parent = null;
99
+ // Don't pool empty scopes from the early-return path — they may be
100
+ // disposed idempotently (twice), which would create pool duplicates
101
+ return;
102
+ }
103
+ // When skipParentRemoval is true, children don't mutate during disposal —
104
+ // iterate directly without allocating a copy. Otherwise, clone to avoid
105
+ // mutation during iteration.
106
+ const children = skipParentRemoval ? scope.children : scope.children.slice();
107
+ for (const child of children) {
108
+ disposeLifetime(child, skipParentRemoval);
109
+ }
110
+ for (const disposer of scope.disposers) {
111
+ disposer();
112
+ }
113
+ // Dev-only: emit disposer events into the owning instance's log.
114
+ // Outer flag check keeps production (no devtools ever installed) at
115
+ // true zero cost — skips the O(depth) parent-chain walk entirely.
116
+ if (anyDisposerLogInstalled) {
117
+ const inst = findInstance(scope);
118
+ if (inst?._disposerLog !== undefined) {
119
+ inst._disposerLog.push({
120
+ scopeId: String(scope.id),
121
+ cause: scope.disposalCause ?? 'component-unmount',
122
+ timestamp: Date.now(),
123
+ });
124
+ }
125
+ }
126
+ // Mark bindings as dead and break closure/DOM retention
127
+ for (const binding of scope.bindings) {
128
+ binding.dead = true;
129
+ binding.accessor = null;
130
+ binding.node = null;
131
+ binding.lastValue = undefined;
132
+ }
133
+ // Reset to shared empties — don't just truncate, so pooled scopes
134
+ // don't hold allocated-but-empty arrays
135
+ scope.disposers = EMPTY_DISPOSERS;
136
+ scope.bindings = EMPTY_BINDINGS;
137
+ scope.children = EMPTY_LIFETIMES;
138
+ scope.itemUpdaters = EMPTY_UPDATERS;
139
+ if (!skipParentRemoval)
140
+ removeFromParent(scope);
141
+ scope.parent = null;
142
+ // Return to pool for reuse
143
+ if (SCOPE_POOL.length < SCOPE_POOL_MAX)
144
+ SCOPE_POOL.push(scope);
145
+ }
146
+ /**
147
+ * Batch-remove children with `parent === null` from `parent.children`.
148
+ * Called after a bulk `disposeLifetime(child, true)` pass to collapse the
149
+ * individual O(N) splice operations into one O(N) scan.
150
+ */
151
+ export function removeOrphanedChildren(parent) {
152
+ const children = parent.children;
153
+ let w = 0;
154
+ for (let r = 0; r < children.length; r++) {
155
+ if (children[r].parent !== null)
156
+ children[w++] = children[r];
157
+ }
158
+ children.length = w;
159
+ }
160
+ /**
161
+ * Bulk dispose an array of sibling scopes — avoids per-scope function call
162
+ * overhead. Used by each() clear path where 1000+ scopes are disposed at once.
163
+ * Caller must call removeOrphanedChildren(parent) afterwards.
164
+ */
165
+ export function disposeLifetimesBulk(scopes) {
166
+ for (let i = 0; i < scopes.length; i++) {
167
+ const scope = scopes[i];
168
+ // Recursively dispose children
169
+ const children = scope.children;
170
+ if (children.length > 0) {
171
+ disposeLifetimesBulk(children);
172
+ }
173
+ // Run disposers
174
+ const disposers = scope.disposers;
175
+ for (let d = 0; d < disposers.length; d++)
176
+ disposers[d]();
177
+ // Dev-only: emit disposer events — same guard as disposeLifetime.
178
+ if (anyDisposerLogInstalled) {
179
+ const inst = findInstance(scope);
180
+ if (inst?._disposerLog !== undefined) {
181
+ inst._disposerLog.push({
182
+ scopeId: String(scope.id),
183
+ cause: scope.disposalCause ?? 'component-unmount',
184
+ timestamp: Date.now(),
185
+ });
186
+ }
187
+ }
188
+ // Mark bindings dead
189
+ const bindings = scope.bindings;
190
+ for (let b = 0; b < bindings.length; b++) {
191
+ const binding = bindings[b];
192
+ binding.dead = true;
193
+ binding.accessor = null;
194
+ binding.node = null;
195
+ binding.lastValue = undefined;
196
+ }
197
+ // Reset to shared empties + detach from parent + return to pool
198
+ scope.disposers = EMPTY_DISPOSERS;
199
+ scope.bindings = EMPTY_BINDINGS;
200
+ scope.children = EMPTY_LIFETIMES;
201
+ scope.itemUpdaters = EMPTY_UPDATERS;
202
+ scope.parent = null;
203
+ if (SCOPE_POOL.length < SCOPE_POOL_MAX)
204
+ SCOPE_POOL.push(scope);
205
+ }
206
+ }
207
+ export function addBinding(scope, binding) {
208
+ binding.ownerLifetime = scope;
209
+ if (scope.bindings === EMPTY_BINDINGS)
210
+ scope.bindings = [];
211
+ scope.bindings.push(binding);
212
+ }
213
+ export function addItemUpdater(scope, updater) {
214
+ if (scope.itemUpdaters === EMPTY_UPDATERS)
215
+ scope.itemUpdaters = [];
216
+ scope.itemUpdaters.push(updater);
217
+ }
218
+ /**
219
+ * Register a per-item updater that compares the new value against the last
220
+ * value before applying. Shared by `text()`, `elSplit()`, and `elTemplate()`
221
+ * so the equality-check logic lives in one place.
222
+ *
223
+ * @param apply - DOM write: receives the new value when it differs
224
+ * @returns the initial value (caller should apply it to the DOM)
225
+ */
226
+ export function addCheckedItemUpdater(scope, get, apply) {
227
+ let last = get();
228
+ addItemUpdater(scope, () => {
229
+ const v = get();
230
+ if (v === last || (v !== v && last !== last))
231
+ return;
232
+ last = v;
233
+ apply(v);
234
+ });
235
+ return last;
236
+ }
237
+ export function addDisposer(scope, disposer) {
238
+ if (scope.disposers === EMPTY_DISPOSERS)
239
+ scope.disposers = [];
240
+ scope.disposers.push(disposer);
241
+ }
242
+ function removeFromParent(scope) {
243
+ if (scope.parent) {
244
+ const idx = scope.parent.children.indexOf(scope);
245
+ if (idx !== -1) {
246
+ scope.parent.children.splice(idx, 1);
247
+ }
248
+ }
249
+ }
250
+ //# sourceMappingURL=lifetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifetime.js","sourceRoot":"","sources":["../src/lifetime.ts"],"names":[],"mappings":"AAGA,IAAI,MAAM,GAAG,CAAC,CAAA;AAEd;;;;;GAKG;AACH,SAAS,YAAY,CAAC,KAAe;IACnC,IAAI,CAAC,GAAoB,KAAK,CAAA;IAC9B,OAAO,CAAC,EAAE,CAAC;QACT,IAAI,CAAC,CAAC,QAAQ;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAA;QACjC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAA;IACd,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,+DAA+D;AAC/D,MAAM,eAAe,GAAe,EAAE,CAAA;AACtC,MAAM,eAAe,GAAsB,EAAE,CAAA;AAC7C,MAAM,cAAc,GAAc,EAAE,CAAA;AACpC,MAAM,cAAc,GAAsB,EAAE,CAAA;AAE5C,sEAAsE;AACtE,8EAA8E;AAC9E,MAAM,UAAU,GAAe,EAAE,CAAA;AACjC,MAAM,cAAc,GAAG,IAAI,CAAA;AAE3B,yEAAyE;AACzE,uEAAuE;AACvE,+DAA+D;AAC/D,IAAI,uBAAuB,GAAG,KAAK,CAAA;AAEnC,yDAAyD;AACzD,MAAM,UAAU,yBAAyB;IACvC,uBAAuB,GAAG,IAAI,CAAA;AAChC,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,eAAe;IAC7B,UAAU,CAAC,MAAM,GAAG,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAuB;IACpD,IAAI,KAAe,CAAA;IACnB,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAG,CAAA;QACzB,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,CAAA;QACnB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;QACrB,mEAAmE;QACnE,gEAAgE;QAChE,iEAAiE;QACjE,mCAAmC;QACnC,KAAK,CAAC,aAAa,GAAG,SAAS,CAAA;QAC/B,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAA;QAC1B,KAAK,CAAC,KAAK,GAAG,SAAS,CAAA;IACzB,CAAC;SAAM,CAAC;QACN,KAAK,GAAG;YACN,EAAE,EAAE,MAAM,EAAE;YACZ,MAAM;YACN,QAAQ,EAAE,eAAe;YACzB,SAAS,EAAE,eAAe;YAC1B,QAAQ,EAAE,cAAc;YACxB,YAAY,EAAE,cAAc;SAC7B,CAAA;IACH,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe;YAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAA;QAC7D,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,iBAAiB,GAAG,KAAK;IACxE,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/F,kEAAkE;QAClE,kEAAkE;QAClE,gEAAgE;QAChE,qEAAqE;QACrE,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,EAAE,KAAK,CAAC,aAAa,IAAI,mBAAmB;oBACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB;YAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;QAC/C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;QACnB,mEAAmE;QACnE,oEAAoE;QACpE,OAAM;IACR,CAAC;IAED,0EAA0E;IAC1E,wEAAwE;IACxE,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IAC5E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,QAAQ,EAAE,CAAA;IACZ,CAAC;IAED,iEAAiE;IACjE,oEAAoE;IACpE,kEAAkE;IAClE,IAAI,uBAAuB,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;QAChC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;gBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,KAAK,EAAE,KAAK,CAAC,aAAa,IAAI,mBAAmB;gBACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;aACtB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;QACnB,OAAO,CAAC,QAAQ,GAAG,IAAK,CAAA;QACxB,OAAO,CAAC,IAAI,GAAG,IAAK,CAAA;QACpB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;IAC/B,CAAC;IAED,kEAAkE;IAClE,wCAAwC;IACxC,KAAK,CAAC,SAAS,GAAG,eAAe,CAAA;IACjC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAA;IAC/B,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAA;IAChC,KAAK,CAAC,YAAY,GAAG,cAAc,CAAA;IAEnC,IAAI,CAAC,iBAAiB;QAAE,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC/C,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;IAEnB,2BAA2B;IAC3B,IAAI,UAAU,CAAC,MAAM,GAAG,cAAc;QAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAChE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAgB;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAA;IAChC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,CAAC,CAAE,CAAC,MAAM,KAAK,IAAI;YAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;IAChE,CAAC;IACD,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QACxB,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;QAC/B,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,oBAAoB,CAAC,QAAQ,CAAC,CAAA;QAChC,CAAC;QACD,gBAAgB;QAChB,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAA;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,SAAS,CAAC,CAAC,CAAE,EAAE,CAAA;QAC1D,kEAAkE;QAClE,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;YAChC,IAAI,IAAI,EAAE,YAAY,KAAK,SAAS,EAAE,CAAC;gBACrC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBACrB,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;oBACzB,KAAK,EAAE,KAAK,CAAC,aAAa,IAAI,mBAAmB;oBACjD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,qBAAqB;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAA;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;YAC5B,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;YACnB,OAAO,CAAC,QAAQ,GAAG,IAAK,CAAA;YACxB,OAAO,CAAC,IAAI,GAAG,IAAK,CAAA;YACpB,OAAO,CAAC,SAAS,GAAG,SAAS,CAAA;QAC/B,CAAC;QACD,gEAAgE;QAChE,KAAK,CAAC,SAAS,GAAG,eAAe,CAAA;QACjC,KAAK,CAAC,QAAQ,GAAG,cAAc,CAAA;QAC/B,KAAK,CAAC,QAAQ,GAAG,eAAe,CAAA;QAChC,KAAK,CAAC,YAAY,GAAG,cAAc,CAAA;QACnC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;QACnB,IAAI,UAAU,CAAC,MAAM,GAAG,cAAc;YAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAe,EAAE,OAAgB;IAC1D,OAAO,CAAC,aAAa,GAAG,KAAK,CAAA;IAC7B,IAAI,KAAK,CAAC,QAAQ,KAAK,cAAc;QAAE,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAA;IAC1D,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAe,EAAE,OAAmB;IACjE,IAAI,KAAK,CAAC,YAAY,KAAK,cAAc;QAAE,KAAK,CAAC,YAAY,GAAG,EAAE,CAAA;IAClE,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AAClC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,KAAe,EACf,GAAY,EACZ,KAAyB;IAEzB,IAAI,IAAI,GAAM,GAAG,EAAE,CAAA;IACnB,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC;YAAE,OAAM;QACpD,IAAI,GAAG,CAAC,CAAA;QACR,KAAK,CAAC,CAAC,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAe,EAAE,QAAoB;IAC/D,IAAI,KAAK,CAAC,SAAS,KAAK,eAAe;QAAE,KAAK,CAAC,SAAS,GAAG,EAAE,CAAA;IAC7D,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;AAChC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAChD,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { Lifetime, Binding } from './types.js'\nimport type { ComponentInstance } from './update-loop.js'\n\nlet nextId = 1\n\n/**\n * Walk up the scope chain to find the owning ComponentInstance. The\n * instance is stamped onto the rootLifetime by `installDevTools`, so this\n * returns null in production (no devtools) or for scopes that haven't\n * yet been parented to a tracked root (e.g., during initial creation).\n */\nfunction findInstance(scope: Lifetime): ComponentInstance | null {\n let s: Lifetime | null = scope\n while (s) {\n if (s.instance) return s.instance\n s = s.parent\n }\n return null\n}\n\n// Shared empty arrays — avoid allocating per scope when unused\nconst EMPTY_LIFETIMES: Lifetime[] = []\nconst EMPTY_DISPOSERS: Array<() => void> = []\nconst EMPTY_BINDINGS: Binding[] = []\nconst EMPTY_UPDATERS: Array<() => void> = []\n\n// Lifetime pool — reuse disposed scope objects to reduce GC pressure.\n// Capped to avoid memory leaks in apps that create/destroy thousands of rows.\nconst SCOPE_POOL: Lifetime[] = []\nconst SCOPE_POOL_MAX = 2048\n\n// Dev-mode flag. Flipped to true by installDevTools() once any component\n// instance has a disposer log. In production this stays false forever,\n// and disposeLifetime skips findInstance entirely — zero cost.\nlet anyDisposerLogInstalled = false\n\n/** @internal — called by devtools.ts::installDevTools */\nexport function _markDisposerLogInstalled(): void {\n anyDisposerLogInstalled = true\n}\n\n/** @internal Drain the scope pool — for testing only */\nexport function _drainScopePool(): void {\n SCOPE_POOL.length = 0\n}\n\nexport function createLifetime(parent: Lifetime | null): Lifetime {\n let scope: Lifetime\n if (SCOPE_POOL.length > 0) {\n scope = SCOPE_POOL.pop()!\n scope.id = nextId++\n scope.parent = parent\n // Arrays already reset to empties by dispose. Reset dev-only hints\n // so recycled scopes don't carry stale tagging/back-refs. Cheap\n // (two undefined writes) and keeps production-identical behavior\n // when these fields are never set.\n scope.disposalCause = undefined\n scope.instance = undefined\n scope._kind = undefined\n } else {\n scope = {\n id: nextId++,\n parent,\n children: EMPTY_LIFETIMES,\n disposers: EMPTY_DISPOSERS,\n bindings: EMPTY_BINDINGS,\n itemUpdaters: EMPTY_UPDATERS,\n }\n }\n\n if (parent) {\n if (parent.children === EMPTY_LIFETIMES) parent.children = []\n parent.children.push(scope)\n }\n\n return scope\n}\n\n/**\n * Dispose a scope and all its children. By default, detaches the scope\n * from its parent's `children` array via `indexOf + splice` — O(N) per\n * call, which becomes O(N²) when disposing many sibling scopes in bulk\n * (e.g. `each` clearing 1000 rows).\n *\n * Pass `skipParentRemoval = true` when the caller will batch-remove\n * children afterwards (see `removeOrphanedFromParent`). The scope's\n * `parent` pointer is still set to `null` so the caller can identify\n * orphaned entries.\n */\nexport function disposeLifetime(scope: Lifetime, skipParentRemoval = false): void {\n if (scope.disposers.length === 0 && scope.children.length === 0 && scope.bindings.length === 0) {\n // Dev-only: still emit a DisposerEvent for empty scopes — the log\n // is meant to capture every scope the app destroys, not only ones\n // that had attached work. Outer flag check keeps production (no\n // devtools ever installed) at true zero cost — no parent-chain walk.\n if (anyDisposerLogInstalled) {\n const inst = findInstance(scope)\n if (inst?._disposerLog !== undefined) {\n inst._disposerLog.push({\n scopeId: String(scope.id),\n cause: scope.disposalCause ?? 'component-unmount',\n timestamp: Date.now(),\n })\n }\n }\n if (!skipParentRemoval) removeFromParent(scope)\n scope.parent = null\n // Don't pool empty scopes from the early-return path — they may be\n // disposed idempotently (twice), which would create pool duplicates\n return\n }\n\n // When skipParentRemoval is true, children don't mutate during disposal —\n // iterate directly without allocating a copy. Otherwise, clone to avoid\n // mutation during iteration.\n const children = skipParentRemoval ? scope.children : scope.children.slice()\n for (const child of children) {\n disposeLifetime(child, skipParentRemoval)\n }\n\n for (const disposer of scope.disposers) {\n disposer()\n }\n\n // Dev-only: emit disposer events into the owning instance's log.\n // Outer flag check keeps production (no devtools ever installed) at\n // true zero cost — skips the O(depth) parent-chain walk entirely.\n if (anyDisposerLogInstalled) {\n const inst = findInstance(scope)\n if (inst?._disposerLog !== undefined) {\n inst._disposerLog.push({\n scopeId: String(scope.id),\n cause: scope.disposalCause ?? 'component-unmount',\n timestamp: Date.now(),\n })\n }\n }\n\n // Mark bindings as dead and break closure/DOM retention\n for (const binding of scope.bindings) {\n binding.dead = true\n binding.accessor = null!\n binding.node = null!\n binding.lastValue = undefined\n }\n\n // Reset to shared empties — don't just truncate, so pooled scopes\n // don't hold allocated-but-empty arrays\n scope.disposers = EMPTY_DISPOSERS\n scope.bindings = EMPTY_BINDINGS\n scope.children = EMPTY_LIFETIMES\n scope.itemUpdaters = EMPTY_UPDATERS\n\n if (!skipParentRemoval) removeFromParent(scope)\n scope.parent = null\n\n // Return to pool for reuse\n if (SCOPE_POOL.length < SCOPE_POOL_MAX) SCOPE_POOL.push(scope)\n}\n\n/**\n * Batch-remove children with `parent === null` from `parent.children`.\n * Called after a bulk `disposeLifetime(child, true)` pass to collapse the\n * individual O(N) splice operations into one O(N) scan.\n */\nexport function removeOrphanedChildren(parent: Lifetime): void {\n const children = parent.children\n let w = 0\n for (let r = 0; r < children.length; r++) {\n if (children[r]!.parent !== null) children[w++] = children[r]!\n }\n children.length = w\n}\n\n/**\n * Bulk dispose an array of sibling scopes — avoids per-scope function call\n * overhead. Used by each() clear path where 1000+ scopes are disposed at once.\n * Caller must call removeOrphanedChildren(parent) afterwards.\n */\nexport function disposeLifetimesBulk(scopes: Lifetime[]): void {\n for (let i = 0; i < scopes.length; i++) {\n const scope = scopes[i]!\n // Recursively dispose children\n const children = scope.children\n if (children.length > 0) {\n disposeLifetimesBulk(children)\n }\n // Run disposers\n const disposers = scope.disposers\n for (let d = 0; d < disposers.length; d++) disposers[d]!()\n // Dev-only: emit disposer events — same guard as disposeLifetime.\n if (anyDisposerLogInstalled) {\n const inst = findInstance(scope)\n if (inst?._disposerLog !== undefined) {\n inst._disposerLog.push({\n scopeId: String(scope.id),\n cause: scope.disposalCause ?? 'component-unmount',\n timestamp: Date.now(),\n })\n }\n }\n // Mark bindings dead\n const bindings = scope.bindings\n for (let b = 0; b < bindings.length; b++) {\n const binding = bindings[b]!\n binding.dead = true\n binding.accessor = null!\n binding.node = null!\n binding.lastValue = undefined\n }\n // Reset to shared empties + detach from parent + return to pool\n scope.disposers = EMPTY_DISPOSERS\n scope.bindings = EMPTY_BINDINGS\n scope.children = EMPTY_LIFETIMES\n scope.itemUpdaters = EMPTY_UPDATERS\n scope.parent = null\n if (SCOPE_POOL.length < SCOPE_POOL_MAX) SCOPE_POOL.push(scope)\n }\n}\n\nexport function addBinding(scope: Lifetime, binding: Binding): void {\n binding.ownerLifetime = scope\n if (scope.bindings === EMPTY_BINDINGS) scope.bindings = []\n scope.bindings.push(binding)\n}\n\nexport function addItemUpdater(scope: Lifetime, updater: () => void): void {\n if (scope.itemUpdaters === EMPTY_UPDATERS) scope.itemUpdaters = []\n scope.itemUpdaters.push(updater)\n}\n\n/**\n * Register a per-item updater that compares the new value against the last\n * value before applying. Shared by `text()`, `elSplit()`, and `elTemplate()`\n * so the equality-check logic lives in one place.\n *\n * @param apply - DOM write: receives the new value when it differs\n * @returns the initial value (caller should apply it to the DOM)\n */\nexport function addCheckedItemUpdater<V>(\n scope: Lifetime,\n get: () => V,\n apply: (value: V) => void,\n): V {\n let last: V = get()\n addItemUpdater(scope, () => {\n const v = get()\n if (v === last || (v !== v && last !== last)) return\n last = v\n apply(v)\n })\n return last\n}\n\nexport function addDisposer(scope: Lifetime, disposer: () => void): void {\n if (scope.disposers === EMPTY_DISPOSERS) scope.disposers = []\n scope.disposers.push(disposer)\n}\n\nfunction removeFromParent(scope: Lifetime): void {\n if (scope.parent) {\n const idx = scope.parent.children.indexOf(scope)\n if (idx !== -1) {\n scope.parent.children.splice(idx, 1)\n }\n }\n}\n"]}
@@ -25,7 +25,7 @@ function createMathmlElement(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":"mathml-elements.js","sourceRoot":"","sources":["../src/mathml-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 MATHML_NS = 'http://www.w3.org/1998/Math/MathML'\n\ntype ElementProps = Record<string, unknown>\ntype Child = Node | string | Node[]\ntype Children = Child[]\n\nfunction createMathmlElement(\n tag: string,\n propsOrChildren?: ElementProps | Children,\n maybeChildren?: Children,\n): MathMLElement {\n const el = document.createElementNS(MATHML_NS, tag) as MathMLElement\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 MathElFn = {\n (): MathMLElement\n (props: ElementProps, children?: Children): MathMLElement\n (children: Children): MathMLElement\n}\n\ntype MathVoidElFn = {\n (): MathMLElement\n (props: ElementProps): MathMLElement\n}\n\n/* v8 ignore start — mechanical tag wrappers */\n// Top-level\n// prettier-ignore\nexport const math = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('math', p, c)) as MathElFn\n\n// Token elements\n// prettier-ignore\nexport const mi = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mi', p, c)) as MathElFn\n// prettier-ignore\nexport const mn = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mn', p, c)) as MathElFn\n// prettier-ignore\nexport const mo = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mo', p, c)) as MathElFn\n// prettier-ignore\nexport const ms = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('ms', p, c)) as MathElFn\n// prettier-ignore\nexport const mtext = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtext', p, c)) as MathElFn\n\n// Layout\n// prettier-ignore\nexport const mrow = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mrow', p, c)) as MathElFn\n// prettier-ignore\nexport const mfrac = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mfrac', p, c)) as MathElFn\n// prettier-ignore\nexport const msqrt = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msqrt', p, c)) as MathElFn\n// prettier-ignore\nexport const mroot = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mroot', p, c)) as MathElFn\n// prettier-ignore\nexport const msup = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msup', p, c)) as MathElFn\n// prettier-ignore\nexport const msub = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msub', p, c)) as MathElFn\n// prettier-ignore\nexport const msubsup = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msubsup', p, c)) as MathElFn\n// prettier-ignore\nexport const munder = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('munder', p, c)) as MathElFn\n// prettier-ignore\nexport const mover = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mover', p, c)) as MathElFn\n// prettier-ignore\nexport const munderover = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('munderover', p, c)) as MathElFn\n// prettier-ignore\nexport const mmultiscripts = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mmultiscripts', p, c)) as MathElFn\n// prettier-ignore\nexport const mprescripts = ((p?: ElementProps) => createMathmlElement('mprescripts', p)) as MathVoidElFn\n// prettier-ignore\nexport const mnone = ((p?: ElementProps) => createMathmlElement('none', p)) as MathVoidElFn\n\n// Table\n// prettier-ignore\nexport const mtable = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtable', p, c)) as MathElFn\n// prettier-ignore\nexport const mtr = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtr', p, c)) as MathElFn\n// prettier-ignore\nexport const mtd = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtd', p, c)) as MathElFn\n\n// Spacing / visual\n// prettier-ignore\nexport const mspace = ((p?: ElementProps) => createMathmlElement('mspace', p)) as MathVoidElFn\n// prettier-ignore\nexport const mpadded = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mpadded', p, c)) as MathElFn\n// prettier-ignore\nexport const mphantom = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mphantom', p, c)) as MathElFn\n// prettier-ignore\nexport const menclose = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('menclose', p, c)) as MathElFn\n// prettier-ignore\nexport const merror = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('merror', p, c)) as MathElFn\n\n// Interactive\n// prettier-ignore\nexport const maction = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('maction', p, c)) as MathElFn\n\n// Semantics\n// prettier-ignore\nexport const semantics = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('semantics', p, c)) as MathElFn\n// prettier-ignore\nexport const annotation = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('annotation', p, c)) as MathElFn\n// prettier-ignore\nexport const annotationXml = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('annotation-xml', p, c)) as MathElFn\n/* v8 ignore stop */\n"]}
1
+ {"version":3,"file":"mathml-elements.js","sourceRoot":"","sources":["../src/mathml-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 MATHML_NS = 'http://www.w3.org/1998/Math/MathML'\n\ntype ElementProps = Record<string, unknown>\ntype Child = Node | string | Node[]\ntype Children = Child[]\n\nfunction createMathmlElement(\n tag: string,\n propsOrChildren?: ElementProps | Children,\n maybeChildren?: Children,\n): MathMLElement {\n const el = document.createElementNS(MATHML_NS, tag) as MathMLElement\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 MathElFn = {\n (): MathMLElement\n (props: ElementProps, children?: Children): MathMLElement\n (children: Children): MathMLElement\n}\n\ntype MathVoidElFn = {\n (): MathMLElement\n (props: ElementProps): MathMLElement\n}\n\n/* v8 ignore start — mechanical tag wrappers */\n// Top-level\n// prettier-ignore\nexport const math = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('math', p, c)) as MathElFn\n\n// Token elements\n// prettier-ignore\nexport const mi = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mi', p, c)) as MathElFn\n// prettier-ignore\nexport const mn = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mn', p, c)) as MathElFn\n// prettier-ignore\nexport const mo = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mo', p, c)) as MathElFn\n// prettier-ignore\nexport const ms = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('ms', p, c)) as MathElFn\n// prettier-ignore\nexport const mtext = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtext', p, c)) as MathElFn\n\n// Layout\n// prettier-ignore\nexport const mrow = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mrow', p, c)) as MathElFn\n// prettier-ignore\nexport const mfrac = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mfrac', p, c)) as MathElFn\n// prettier-ignore\nexport const msqrt = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msqrt', p, c)) as MathElFn\n// prettier-ignore\nexport const mroot = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mroot', p, c)) as MathElFn\n// prettier-ignore\nexport const msup = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msup', p, c)) as MathElFn\n// prettier-ignore\nexport const msub = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msub', p, c)) as MathElFn\n// prettier-ignore\nexport const msubsup = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('msubsup', p, c)) as MathElFn\n// prettier-ignore\nexport const munder = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('munder', p, c)) as MathElFn\n// prettier-ignore\nexport const mover = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mover', p, c)) as MathElFn\n// prettier-ignore\nexport const munderover = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('munderover', p, c)) as MathElFn\n// prettier-ignore\nexport const mmultiscripts = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mmultiscripts', p, c)) as MathElFn\n// prettier-ignore\nexport const mprescripts = ((p?: ElementProps) => createMathmlElement('mprescripts', p)) as MathVoidElFn\n// prettier-ignore\nexport const mnone = ((p?: ElementProps) => createMathmlElement('none', p)) as MathVoidElFn\n\n// Table\n// prettier-ignore\nexport const mtable = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtable', p, c)) as MathElFn\n// prettier-ignore\nexport const mtr = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtr', p, c)) as MathElFn\n// prettier-ignore\nexport const mtd = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mtd', p, c)) as MathElFn\n\n// Spacing / visual\n// prettier-ignore\nexport const mspace = ((p?: ElementProps) => createMathmlElement('mspace', p)) as MathVoidElFn\n// prettier-ignore\nexport const mpadded = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mpadded', p, c)) as MathElFn\n// prettier-ignore\nexport const mphantom = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('mphantom', p, c)) as MathElFn\n// prettier-ignore\nexport const menclose = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('menclose', p, c)) as MathElFn\n// prettier-ignore\nexport const merror = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('merror', p, c)) as MathElFn\n\n// Interactive\n// prettier-ignore\nexport const maction = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('maction', p, c)) as MathElFn\n\n// Semantics\n// prettier-ignore\nexport const semantics = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('semantics', p, c)) as MathElFn\n// prettier-ignore\nexport const annotation = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('annotation', p, c)) as MathElFn\n// prettier-ignore\nexport const annotationXml = ((p?: ElementProps | Children, c?: Children) => createMathmlElement('annotation-xml', p, c)) as MathElFn\n/* v8 ignore stop */\n"]}
package/dist/mount.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { ComponentDef, AppHandle, Scope } from './types.js';
1
+ import type { ComponentDef, AppHandle, Lifetime } from './types.js';
2
2
  declare global {
3
3
  interface ImportMeta {
4
4
  env?: {
@@ -9,19 +9,53 @@ declare global {
9
9
  export interface MountOptions {
10
10
  devTools?: boolean;
11
11
  /**
12
- * Parent scope for the mounted component's rootScope. When provided,
13
- * the rootScope is created as a child of this scope — context lookups
12
+ * Parent scope for the mounted component's rootLifetime. When provided,
13
+ * the rootLifetime is created as a child of this scope — context lookups
14
14
  * from within the component walk up through the parent's scope tree,
15
15
  * and disposing the parent scope cascades into this instance's scope.
16
16
  * Used by `@llui/vike`'s persistent-layout machinery to mount a page
17
17
  * as a true scope-tree child of its enclosing layout, so layout-
18
18
  * provided contexts flow naturally into pages via `useContext`.
19
19
  *
20
- * When omitted (the default), the rootScope is detached — same as
20
+ * When omitted (the default), the rootLifetime is detached — same as
21
21
  * every `mountApp` call before persistent layouts existed.
22
22
  */
23
- parentScope?: Scope;
23
+ parentLifetime?: Lifetime;
24
24
  }
25
- export declare function mountApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, data?: unknown, options?: MountOptions): AppHandle;
26
- export declare function hydrateApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, serverState: S, options?: MountOptions): AppHandle;
25
+ export declare function mountApp<S, M, E>(container: HTMLElement, def: ComponentDef<S, M, E>, data?: undefined, options?: MountOptions): AppHandle;
26
+ export declare function mountApp<S, M, E, D>(container: HTMLElement, def: ComponentDef<S, M, E, D>, data: D, options?: MountOptions): AppHandle;
27
+ /**
28
+ * Mount a component relative to a comment anchor rather than inside a
29
+ * container element. Inserts a synthesized end sentinel (`<!-- llui-mount-end -->`)
30
+ * immediately after the anchor and places the component's nodes between
31
+ * the pair. The anchor must already be attached to a live DOM tree.
32
+ *
33
+ * Unlike `mountApp`, the caller's anchor node is preserved across the
34
+ * handle's lifetime — only the content between the pair (and the end
35
+ * sentinel itself) is disposed. Used by `@llui/vike` persistent layouts
36
+ * to mount chain layers without a wrapper element.
37
+ *
38
+ * If a pre-existing `<!-- llui-mount-end -->` is found after the anchor
39
+ * (e.g. stale from an undisposed prior mount), the content between the
40
+ * anchor and that sentinel is swept and the sentinel is reused. Dev mode
41
+ * warns in that case.
42
+ */
43
+ export declare function mountAtAnchor<S, M, E>(anchor: Comment, def: ComponentDef<S, M, E>, data?: undefined, options?: MountOptions): AppHandle;
44
+ export declare function mountAtAnchor<S, M, E, D>(anchor: Comment, def: ComponentDef<S, M, E, D>, data: D, options?: MountOptions): AppHandle;
45
+ /**
46
+ * Hydrate a component relative to a comment anchor rather than inside a
47
+ * container element. Analogous to `hydrateApp` — uses `serverState` as
48
+ * the initial state (not `init()`'s output) while preserving `init()`'s
49
+ * effects for post-mount dispatch.
50
+ *
51
+ * The DOM-handling path is identical to `mountAtAnchor`: reuses a
52
+ * pre-existing end sentinel when present, synthesizes one otherwise.
53
+ * Atomic-swaps the owned region whether or not server content is there
54
+ * to replace. No error for a missing end sentinel — the vike chain's
55
+ * outer `hydrateApp`'s `replaceChildren` wipes inner layers' sentinels,
56
+ * so inner-layer `hydrateAtAnchor` calls routinely find nothing to
57
+ * reuse, and that's normal.
58
+ */
59
+ export declare function hydrateAtAnchor<S, M, E, D = void>(anchor: Comment, def: ComponentDef<S, M, E, D>, serverState: S, options?: MountOptions): AppHandle;
60
+ export declare function hydrateApp<S, M, E, D = void>(container: HTMLElement, def: ComponentDef<S, M, E, D>, serverState: S, options?: MountOptions): AppHandle;
27
61
  //# sourceMappingURL=mount.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAUhE,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;IAClB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,EAAE,KAAK,CAAA;CACpB;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,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CA6FX;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,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAqEX"}
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../src/mount.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AA2CnE,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;IAClB;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,QAAQ,CAAA;CAC1B;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,SAAS,EAChB,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAAA;AACZ,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACjC,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAAA;AAsJZ;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,EAAE,SAAS,EAChB,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAAA;AACZ,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACtC,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,IAAI,EAAE,CAAC,EACP,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAAA;AAqGZ;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAC/C,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,WAAW,EAAE,CAAC,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CA+EX;AAYD,wBAAgB,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,EAC1C,SAAS,EAAE,WAAW,EACtB,GAAG,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAC7B,WAAW,EAAE,CAAC,EACd,OAAO,CAAC,EAAE,YAAY,GACrB,SAAS,CAqEX"}