@thyn/core 0.0.227 → 0.0.229

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.
package/dist/element.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export declare function mount(app: any, parent: any): void;
2
2
  export declare function collectEffect(effectFn: any): void;
3
- export declare function createReactiveTextNode(v: any): any;
3
+ export declare function createReactiveTextNode(v: any): Text;
4
4
  export declare function component(name: any, props?: any): any;
5
5
  export declare function setAttribute(el: any, key: any, val: any): any;
6
6
  export declare function setProperty(el: any, key: any, val: any): any;
package/dist/element.js CHANGED
@@ -9,15 +9,21 @@ export function collectEffect(effectFn) {
9
9
  }
10
10
  collectingHead = effectFn;
11
11
  }
12
+ // export function createReactiveTextNode(v) {
13
+ // let n;
14
+ // staticEffect(() => {
15
+ // if (n) {
16
+ // n.nodeValue = v();
17
+ // } else {
18
+ // n = document.createTextNode(v());
19
+ // }
20
+ // });
21
+ // return n;
22
+ // }
12
23
  export function createReactiveTextNode(v) {
13
- let n;
24
+ const n = document.createTextNode(v());
14
25
  staticEffect(() => {
15
- if (n) {
16
- n.nodeValue = v();
17
- }
18
- else {
19
- n = document.createTextNode(v());
20
- }
26
+ n.nodeValue = v();
21
27
  });
22
28
  return n;
23
29
  }
@@ -75,7 +81,7 @@ export function setReactiveAttribute(el, key, val) {
75
81
  return;
76
82
  }
77
83
  if (v !== undefined)
78
- el.setAttribute(key, val());
84
+ el.setAttribute(key, v);
79
85
  ran = true;
80
86
  }));
81
87
  }
@@ -246,7 +252,9 @@ export function list(props, terminal = false) {
246
252
  const teardownNode = terminal ? shallowTeardown : teardown;
247
253
  let parent;
248
254
  let outlet = document.createDocumentFragment();
249
- let prevItems;
255
+ // State
256
+ let prevItems = [];
257
+ let rowNodes = []; // The "Shadow Array" - avoids reading DOM
250
258
  const startBookend = document.createComment("");
251
259
  const endBookend = document.createComment("");
252
260
  startBookend.$frag = outlet;
@@ -254,149 +262,156 @@ export function list(props, terminal = false) {
254
262
  const render = props.render;
255
263
  staticEffect(() => {
256
264
  parent = startBookend.parentNode;
265
+ // 1. Initialization / First Render
257
266
  if (!parent) {
258
- prevItems = props.items();
259
- outlet.append(startBookend, ...prevItems.map(render), endBookend);
267
+ const items = props.items();
268
+ // Render all items
269
+ const newNodes = items.map(render);
270
+ outlet.append(startBookend, ...newNodes, endBookend);
271
+ // Save state
272
+ prevItems = items;
273
+ rowNodes = newNodes;
260
274
  return;
261
275
  }
262
- let nextItems = props.items();
263
- let newLength = nextItems.length;
276
+ const nextItems = props.items();
277
+ const newLength = nextItems.length;
264
278
  let oldLength = prevItems.length;
265
- if (!oldLength && newLength) {
266
- endBookend.before(...nextItems.map(render));
267
- prevItems = nextItems;
268
- nextItems = null;
269
- return;
270
- }
271
- const childNodeList = parent.childNodes;
272
- const childNodes = Array.from(childNodeList);
273
- const offset = childNodes.indexOf(startBookend) + 1;
274
- if (!newLength) {
275
- const removalQueue = [];
276
- const end = prevItems.length + offset;
277
- for (let i = offset; i < end; i++) {
278
- const ch = childNodeList[i];
279
- teardownNode(ch);
280
- removalQueue.push(ch);
281
- }
282
- for (const ch of removalQueue) {
283
- remove(ch);
279
+ // 2. Fast Path: Clear All
280
+ if (newLength === 0) {
281
+ if (oldLength !== 0) {
282
+ // Bulk remove
283
+ const removalQueue = rowNodes;
284
+ // Teardown
285
+ for (let i = 0; i < oldLength; i++) {
286
+ teardownNode(removalQueue[i]);
287
+ }
288
+ // DOM Removal
289
+ // Optimization: If terminal list, we might clear parent.textContent
290
+ // But to be safe with siblings:
291
+ if (removalQueue.length) {
292
+ // If the nodes are contiguous, we could use range delete,
293
+ // but individual remove is safer for mixed node types.
294
+ for (let i = 0; i < removalQueue.length; i++) {
295
+ remove(removalQueue[i]);
296
+ }
297
+ }
298
+ rowNodes = [];
299
+ prevItems = [];
284
300
  }
285
- prevItems = nextItems;
286
- nextItems = null;
287
301
  return;
288
302
  }
289
- let start = nextItems.findIndex((item, index) => prevItems[index] !== item);
290
- if (start === oldLength) {
291
- endBookend.before(...nextItems.slice(start).map(render));
303
+ // 3. Fast Path: Create All (from empty)
304
+ if (oldLength === 0) {
305
+ const newNodes = nextItems.map(render);
306
+ endBookend.before(...newNodes);
307
+ rowNodes = newNodes;
292
308
  prevItems = nextItems;
293
- nextItems = null;
294
309
  return;
295
310
  }
296
- if (start < 0) {
297
- for (let i = nextItems.length; i < oldLength; i++) {
298
- const e = childNodes[offset + --oldLength];
299
- teardownNode(e);
300
- remove(e);
301
- }
302
- prevItems = nextItems;
303
- nextItems = null;
304
- return;
311
+ // 4. Reconciliation
312
+ let start = 0;
313
+ let minLen = Math.min(oldLength, newLength);
314
+ // Prefix Scan (Cheaper JS Array read vs DOM read)
315
+ while (start < minLen && prevItems[start] === nextItems[start]) {
316
+ start++;
305
317
  }
306
- if (start >= newLength) {
307
- while (start < oldLength) {
308
- const e = childNodes[offset + --oldLength];
309
- teardownNode(e);
310
- remove(e);
311
- }
318
+ // Optimization: Append only
319
+ if (start === oldLength && newLength > oldLength) {
320
+ const newPart = nextItems.slice(start);
321
+ const newNodes = newPart.map(render);
322
+ endBookend.before(...newNodes);
323
+ rowNodes = rowNodes.concat(newNodes);
312
324
  prevItems = nextItems;
313
- nextItems = null;
314
325
  return;
315
326
  }
316
- // suffix
317
- for (oldLength--, newLength--; newLength > start &&
318
- oldLength >= start &&
319
- nextItems[newLength] === prevItems[oldLength]; oldLength--, newLength--)
320
- ;
321
- const nextKeys = new Set(nextItems);
322
- const removalQueue = [];
323
- for (let i = start; i <= oldLength; i++) {
324
- if (!nextKeys.has(prevItems[i])) {
325
- const ch = childNodes[i + offset];
326
- teardownNode(ch);
327
- removalQueue.push(ch);
328
- childNodes[i + offset] = null;
327
+ // Optimization: Truncate only
328
+ if (start === newLength && oldLength > newLength) {
329
+ for (let i = start; i < oldLength; i++) {
330
+ const node = rowNodes[i];
331
+ teardownNode(node);
332
+ remove(node);
329
333
  }
330
- }
331
- for (const e of removalQueue) {
332
- remove(e);
333
- }
334
- if (oldLength - start === removalQueue.length) {
334
+ rowNodes.length = newLength; // JS Array Truncate
335
335
  prevItems = nextItems;
336
- nextItems = null;
337
336
  return;
338
337
  }
339
- let keyMap = new Map();
340
- for (let i = start; i <= oldLength; i++) {
341
- if (childNodes[i + offset] &&
342
- (!nextItems[i] ||
343
- prevItems[i] !== nextItems[i])) {
344
- keyMap.set(prevItems[i], {
345
- el: childNodes[i + offset],
346
- item: prevItems[i],
347
- });
338
+ // Suffix Scan
339
+ let end = 0;
340
+ // We stop if the suffix hits the prefix
341
+ while (newLength - 1 - end >= start &&
342
+ oldLength - 1 - end >= start &&
343
+ nextItems[newLength - 1 - end] === prevItems[oldLength - 1 - end]) {
344
+ end++;
345
+ }
346
+ // 5. Complex Diff (The Middle)
347
+ const oldStart = start;
348
+ const oldEnd = oldLength - end;
349
+ const newEnd = newLength - end;
350
+ // A. Build Map of existing items in the "changed" region
351
+ // key -> { node, index }
352
+ const keyMap = new Map();
353
+ for (let i = oldStart; i < oldEnd; i++) {
354
+ const item = prevItems[i];
355
+ // If duplicate items exist, first one wins or logic needs to be more robust.
356
+ // Assuming unique keys for simplicity or using last-write-wins:
357
+ if (!keyMap.has(item)) {
358
+ keyMap.set(item, rowNodes[i]);
348
359
  }
349
- }
350
- if (newLength === oldLength && keyMap.size > (newLength - start + 1) / 2) {
351
- const lastOrdered = childNodes[start + offset - 1];
352
- const set = [];
353
- for (let i = start; i <= newLength; i++) {
354
- set.push(keyMap.get(nextItems[i])?.el ?? childNodes[i + offset]);
360
+ else {
361
+ // Handle duplicates by removing the extra immediately?
362
+ // Or handle collision. For now, assume distinct items or standard behavior.
355
363
  }
356
- lastOrdered.after(...set);
357
- prevItems = nextItems;
358
- keyMap = null;
359
- nextItems = null;
360
- return;
361
364
  }
362
- while (start <= newLength) {
363
- const newChd = nextItems[start];
364
- const oldChd = prevItems[start];
365
- if (newChd === oldChd) {
366
- start++;
367
- continue;
368
- }
369
- if (oldChd === undefined) {
370
- parent.insertBefore(render(newChd), endBookend);
371
- start++;
372
- continue;
365
+ // B. Setup for new node list construction
366
+ const nextRowNodes = new Array(newLength);
367
+ // Copy Prefix
368
+ for (let i = 0; i < start; i++) {
369
+ nextRowNodes[i] = rowNodes[i];
370
+ }
371
+ // Copy Suffix
372
+ for (let i = 0; i < end; i++) {
373
+ nextRowNodes[newLength - 1 - i] = rowNodes[oldLength - 1 - i];
374
+ }
375
+ // C. Find anchor for insertions
376
+ // We insert before the first node of the suffix, or the endBookend.
377
+ const anchor = (end > 0) ? rowNodes[oldLength - end] : endBookend;
378
+ // D. Iterate new middle
379
+ for (let i = oldStart; i < newEnd; i++) {
380
+ const newItem = nextItems[i];
381
+ let node;
382
+ if (keyMap.has(newItem)) {
383
+ // Reuse existing
384
+ node = keyMap.get(newItem);
385
+ keyMap.delete(newItem);
386
+ // DOM Move:
387
+ // We always insertBefore the anchor.
388
+ // Since we are iterating forward, "anchor" isn't static.
389
+ // Actually, simply inserting before the *current* anchor works if we
390
+ // process carefully, but standard "place and move cursor" is safer.
391
+ parent.insertBefore(node, anchor);
373
392
  }
374
- const mappedOld = keyMap.get(newChd);
375
- if (mappedOld) {
376
- const oldDom = childNodeList[start + offset];
377
- const { el, item } = mappedOld;
378
- if (oldDom !== el) {
379
- const tmp = el.nextSibling;
380
- parent.insertBefore(el, oldDom);
381
- parent.insertBefore(oldDom, tmp);
382
- }
383
- else if (item !== newChd) {
384
- replaceWith(newChd, el, render);
385
- }
386
- keyMap.delete(newChd);
387
- }
388
- else if (oldChd !== newChd) {
389
- parent.insertBefore(render(newChd), childNodeList[start + offset]);
393
+ else {
394
+ // Create new
395
+ node = render(newItem);
396
+ parent.insertBefore(node, anchor);
390
397
  }
391
- start++;
392
- }
393
- for (const { el } of keyMap.values()) {
394
- teardownNode(el);
395
- remove(el);
396
- }
397
- keyMap = null;
398
+ nextRowNodes[i] = node;
399
+ }
400
+ // E. Cleanup
401
+ // Anything remaining in keyMap is gone
402
+ for (const node of keyMap.values()) {
403
+ teardownNode(node);
404
+ remove(node);
405
+ }
406
+ // Handle "middle" items that weren't in keyMap (duplicates logic)
407
+ // or implicit removals handled by the map logic.
408
+ // Specifically: We iterated [oldStart...oldEnd] to build the map.
409
+ // If an item was in that range but NOT in the new range, it's in the map.
410
+ // If it WAS in the new range, we removed it from the map.
411
+ // So map.values() is exactly what needs to die.
412
+ // Update State
413
+ rowNodes = nextRowNodes;
398
414
  prevItems = nextItems;
399
- nextItems = null;
400
415
  });
401
416
  return outlet;
402
417
  }
package/dist/signals.js CHANGED
@@ -84,7 +84,6 @@ export function $effect(fn) {
84
84
  return fn;
85
85
  }
86
86
  export function staticEffect(fn) {
87
- fn.td = null;
88
87
  const prev = currentEffect;
89
88
  currentEffect = fn;
90
89
  fn();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thyn/core",
3
- "version": "0.0.227",
3
+ "version": "0.0.229",
4
4
  "scripts": {
5
5
  "build": "tsc",
6
6
  "pub": "tsc && npm version patch -f && npm -f publish --access=public",
package/src/element.ts CHANGED
@@ -13,14 +13,22 @@ export function collectEffect(effectFn) {
13
13
  collectingHead = effectFn;
14
14
  }
15
15
 
16
+ // export function createReactiveTextNode(v) {
17
+ // let n;
18
+ // staticEffect(() => {
19
+ // if (n) {
20
+ // n.nodeValue = v();
21
+ // } else {
22
+ // n = document.createTextNode(v());
23
+ // }
24
+ // });
25
+ // return n;
26
+ // }
27
+
16
28
  export function createReactiveTextNode(v) {
17
- let n;
29
+ const n = document.createTextNode(v());
18
30
  staticEffect(() => {
19
- if (n) {
20
- n.nodeValue = v();
21
- } else {
22
- n = document.createTextNode(v());
23
- }
31
+ n.nodeValue = v();
24
32
  });
25
33
  return n;
26
34
  }
@@ -78,7 +86,7 @@ export function setReactiveAttribute(el, key, val) {
78
86
  else el.setAttribute(key, v);
79
87
  return;
80
88
  }
81
- if (v !== undefined) el.setAttribute(key, val());
89
+ if (v !== undefined) el.setAttribute(key, v);
82
90
  ran = true;
83
91
  }),
84
92
  );
@@ -262,168 +270,199 @@ export function list(props, terminal = false) {
262
270
  const teardownNode = terminal ? shallowTeardown : teardown;
263
271
  let parent;
264
272
  let outlet = document.createDocumentFragment();
265
- let prevItems;
273
+
274
+ // State
275
+ let prevItems = [];
276
+ let rowNodes = []; // The "Shadow Array" - avoids reading DOM
277
+
266
278
  const startBookend = document.createComment("") as any;
267
279
  const endBookend = document.createComment("") as any;
280
+
268
281
  startBookend.$frag = outlet;
269
282
  startBookend.$end = endBookend;
283
+
270
284
  const render = props.render;
271
285
 
272
286
  staticEffect(() => {
273
287
  parent = startBookend.parentNode;
288
+
289
+ // 1. Initialization / First Render
274
290
  if (!parent) {
275
- prevItems = props.items();
276
- outlet.append(startBookend, ...prevItems.map(render), endBookend);
291
+ const items = props.items();
292
+ // Render all items
293
+ const newNodes = items.map(render);
294
+
295
+ outlet.append(startBookend, ...newNodes, endBookend);
296
+
297
+ // Save state
298
+ prevItems = items;
299
+ rowNodes = newNodes;
277
300
  return;
278
301
  }
279
- let nextItems = props.items();
280
- let newLength = nextItems.length;
302
+
303
+ const nextItems = props.items();
304
+ const newLength = nextItems.length;
281
305
  let oldLength = prevItems.length;
282
- if (!oldLength && newLength) {
283
- endBookend.before(...nextItems.map(render))
284
- prevItems = nextItems;
285
- nextItems = null;
286
- return;
287
- }
288
- const childNodeList = parent.childNodes as NodeListOf<ChildNode>;
289
- const childNodes = Array.from(childNodeList);
290
- const offset = childNodes.indexOf(startBookend) + 1;
291
- if (!newLength) {
292
- const removalQueue = [];
293
- const end = prevItems.length + offset;
294
- for (let i = offset; i < end; i++) {
295
- const ch = childNodeList[i];
296
- teardownNode(ch);
297
- removalQueue.push(ch);
298
- }
299
- for (const ch of removalQueue) {
300
- remove(ch);
306
+
307
+ // 2. Fast Path: Clear All
308
+ if (newLength === 0) {
309
+ if (oldLength !== 0) {
310
+ // Bulk remove
311
+ const removalQueue = rowNodes;
312
+
313
+ // Teardown
314
+ for (let i = 0; i < oldLength; i++) {
315
+ teardownNode(removalQueue[i]);
316
+ }
317
+
318
+ // DOM Removal
319
+ // Optimization: If terminal list, we might clear parent.textContent
320
+ // But to be safe with siblings:
321
+ if (removalQueue.length) {
322
+ // If the nodes are contiguous, we could use range delete,
323
+ // but individual remove is safer for mixed node types.
324
+ for (let i = 0; i < removalQueue.length; i++) {
325
+ remove(removalQueue[i]);
326
+ }
327
+ }
328
+
329
+ rowNodes = [];
330
+ prevItems = [];
301
331
  }
302
- prevItems = nextItems;
303
- nextItems = null;
304
332
  return;
305
333
  }
306
334
 
307
- let start = nextItems.findIndex((item, index) => prevItems[index] !== item);
308
- if (start === oldLength) {
309
- endBookend.before(...nextItems.slice(start).map(render));
335
+ // 3. Fast Path: Create All (from empty)
336
+ if (oldLength === 0) {
337
+ const newNodes = nextItems.map(render);
338
+ endBookend.before(...newNodes);
339
+ rowNodes = newNodes;
310
340
  prevItems = nextItems;
311
- nextItems = null;
312
341
  return;
313
342
  }
314
343
 
315
- if (start < 0) {
316
- for (let i = nextItems.length; i < oldLength; i++) {
317
- const e = childNodes[offset + --oldLength];
318
- teardownNode(e);
319
- remove(e);
320
- }
321
- prevItems = nextItems;
322
- nextItems = null;
323
- return;
344
+ // 4. Reconciliation
345
+ let start = 0;
346
+ let minLen = Math.min(oldLength, newLength);
347
+
348
+ // Prefix Scan (Cheaper JS Array read vs DOM read)
349
+ while (start < minLen && prevItems[start] === nextItems[start]) {
350
+ start++;
324
351
  }
325
352
 
326
- if (start >= newLength) {
327
- while (start < oldLength) {
328
- const e = childNodes[offset + --oldLength];
329
- teardownNode(e);
330
- remove(e);
331
- }
353
+ // Optimization: Append only
354
+ if (start === oldLength && newLength > oldLength) {
355
+ const newPart = nextItems.slice(start);
356
+ const newNodes = newPart.map(render);
357
+ endBookend.before(...newNodes);
358
+
359
+ rowNodes = rowNodes.concat(newNodes);
332
360
  prevItems = nextItems;
333
- nextItems = null;
334
361
  return;
335
362
  }
336
363
 
337
- // suffix
338
- for (
339
- oldLength--, newLength--;
340
- newLength > start &&
341
- oldLength >= start &&
342
- nextItems[newLength] === prevItems[oldLength];
343
- oldLength--, newLength--
344
- );
345
-
346
- const nextKeys = new Set(nextItems);
347
- const removalQueue = [];
348
- for (let i = start; i <= oldLength; i++) {
349
- if (!nextKeys.has(prevItems[i])) {
350
- const ch = childNodes[i + offset];
351
- teardownNode(ch);
352
- removalQueue.push(ch);
353
- childNodes[i + offset] = null;
364
+ // Optimization: Truncate only
365
+ if (start === newLength && oldLength > newLength) {
366
+ for (let i = start; i < oldLength; i++) {
367
+ const node = rowNodes[i];
368
+ teardownNode(node);
369
+ remove(node);
354
370
  }
355
- }
356
- for (const e of removalQueue) {
357
- remove(e);
358
- }
359
- if (oldLength - start === removalQueue.length) {
371
+ rowNodes.length = newLength; // JS Array Truncate
360
372
  prevItems = nextItems;
361
- nextItems = null;
362
373
  return;
363
374
  }
364
- let keyMap = new Map();
365
- for (let i = start; i <= oldLength; i++) {
366
- if (
367
- childNodes[i + offset] &&
368
- (!nextItems[i] ||
369
- prevItems[i] !== nextItems[i])
370
- ) {
371
- keyMap.set(prevItems[i], {
372
- el: childNodes[i + offset],
373
- item: prevItems[i],
374
- });
375
+
376
+ // Suffix Scan
377
+ let end = 0;
378
+ // We stop if the suffix hits the prefix
379
+ while (
380
+ newLength - 1 - end >= start &&
381
+ oldLength - 1 - end >= start &&
382
+ nextItems[newLength - 1 - end] === prevItems[oldLength - 1 - end]
383
+ ) {
384
+ end++;
385
+ }
386
+
387
+ // 5. Complex Diff (The Middle)
388
+ const oldStart = start;
389
+ const oldEnd = oldLength - end;
390
+ const newEnd = newLength - end;
391
+
392
+ // A. Build Map of existing items in the "changed" region
393
+ // key -> { node, index }
394
+ const keyMap = new Map();
395
+ for (let i = oldStart; i < oldEnd; i++) {
396
+ const item = prevItems[i];
397
+ // If duplicate items exist, first one wins or logic needs to be more robust.
398
+ // Assuming unique keys for simplicity or using last-write-wins:
399
+ if (!keyMap.has(item)) {
400
+ keyMap.set(item, rowNodes[i]);
401
+ } else {
402
+ // Handle duplicates by removing the extra immediately?
403
+ // Or handle collision. For now, assume distinct items or standard behavior.
375
404
  }
376
405
  }
377
- if (newLength === oldLength && keyMap.size > (newLength - start + 1) / 2) {
378
- const lastOrdered = childNodes[start + offset - 1];
379
- const set = [];
380
- for (let i = start; i <= newLength; i++) {
381
- set.push(keyMap.get(nextItems[i])?.el ?? childNodes[i + offset]);
382
- }
383
- lastOrdered.after(...set);
384
- prevItems = nextItems;
385
- keyMap = null;
386
- nextItems = null;
387
- return;
406
+
407
+ // B. Setup for new node list construction
408
+ const nextRowNodes = new Array(newLength);
409
+
410
+ // Copy Prefix
411
+ for (let i = 0; i < start; i++) {
412
+ nextRowNodes[i] = rowNodes[i];
413
+ }
414
+ // Copy Suffix
415
+ for (let i = 0; i < end; i++) {
416
+ nextRowNodes[newLength - 1 - i] = rowNodes[oldLength - 1 - i];
388
417
  }
389
418
 
390
- while (start <= newLength) {
391
- const newChd = nextItems[start];
392
- const oldChd = prevItems[start];
393
- if (newChd === oldChd) {
394
- start++;
395
- continue;
396
- }
397
- if (oldChd === undefined) {
398
- parent.insertBefore(render(newChd), endBookend);
399
- start++;
400
- continue;
401
- }
402
- const mappedOld = keyMap.get(newChd);
403
- if (mappedOld) {
404
- const oldDom = childNodeList[start + offset];
405
- const { el, item } = mappedOld;
406
- if (oldDom !== el) {
407
- const tmp = el.nextSibling;
408
- parent.insertBefore(el, oldDom);
409
- parent.insertBefore(oldDom, tmp);
410
- } else if (item !== newChd) {
411
- replaceWith(newChd, el, render);
412
- }
413
- keyMap.delete(newChd);
414
- } else if (oldChd !== newChd) {
415
- parent.insertBefore(render(newChd), childNodeList[start + offset]);
419
+ // C. Find anchor for insertions
420
+ // We insert before the first node of the suffix, or the endBookend.
421
+ const anchor = (end > 0) ? rowNodes[oldLength - end] : endBookend;
422
+
423
+ // D. Iterate new middle
424
+ for (let i = oldStart; i < newEnd; i++) {
425
+ const newItem = nextItems[i];
426
+ let node;
427
+
428
+ if (keyMap.has(newItem)) {
429
+ // Reuse existing
430
+ node = keyMap.get(newItem);
431
+ keyMap.delete(newItem);
432
+
433
+ // DOM Move:
434
+ // We always insertBefore the anchor.
435
+ // Since we are iterating forward, "anchor" isn't static.
436
+ // Actually, simply inserting before the *current* anchor works if we
437
+ // process carefully, but standard "place and move cursor" is safer.
438
+ parent.insertBefore(node, anchor);
439
+ } else {
440
+ // Create new
441
+ node = render(newItem);
442
+ parent.insertBefore(node, anchor);
416
443
  }
417
- start++;
444
+ nextRowNodes[i] = node;
418
445
  }
419
- for (const { el } of keyMap.values()) {
420
- teardownNode(el);
421
- remove(el);
446
+
447
+ // E. Cleanup
448
+ // Anything remaining in keyMap is gone
449
+ for (const node of keyMap.values()) {
450
+ teardownNode(node);
451
+ remove(node);
422
452
  }
423
- keyMap = null;
453
+
454
+ // Handle "middle" items that weren't in keyMap (duplicates logic)
455
+ // or implicit removals handled by the map logic.
456
+ // Specifically: We iterated [oldStart...oldEnd] to build the map.
457
+ // If an item was in that range but NOT in the new range, it's in the map.
458
+ // If it WAS in the new range, we removed it from the map.
459
+ // So map.values() is exactly what needs to die.
460
+
461
+ // Update State
462
+ rowNodes = nextRowNodes;
424
463
  prevItems = nextItems;
425
- nextItems = null;
426
464
  });
465
+
427
466
  return outlet;
428
467
  }
429
468
 
package/src/signals.ts CHANGED
@@ -102,7 +102,6 @@ export function $effect(fn: (() => (() => void) | void) & any) {
102
102
  }
103
103
 
104
104
  export function staticEffect(fn: (() => (() => void) | void) & any) {
105
- fn.td = null;
106
105
  const prev = currentEffect;
107
106
  currentEffect = fn;
108
107
  fn();
@@ -1 +1 @@
1
- {"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./src/signals.ts","./src/element.ts","./src/index.ts","./src/router.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@types/estree/index.d.ts"],"fileIdsList":[[56,57],[52],[52,53],[53]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"240d6b8f6981f174caea8caba5ad321e998832805d22a545c1f7bef0e72bb663","signature":"a53dff95094f1f7fee261ff1879f5909cd440f02aa68ff6893d017b2343181d1"},{"version":"a81c93d3e401d0b1cae96bbff1de2192c8b0b783ca57757778269d86a1dc7bd1","signature":"1e9fd227702d856993cc7d708cc104bcbea5c070fbf976204a77c36457b1342e"},{"version":"ac16f8022e1d86594d058f84a530164af4b03dcc8bb45ac4a00736fe8aab62e7","signature":"1e325d171d22aa3144736ace94df4b5bf779c6083bc0f9ce684855844f8abcbc"},{"version":"a155e9ebe821846c43103394346639a6a19a7f844be4892bbe4352aa20ee6707","signature":"166554555b2dc6392155b045bb33ce964f7d5f092f50fada34eb4d5828d7740e"},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1}],"root":[[52,55]],"options":{"allowJs":true,"checkJs":false,"composite":true,"esModuleInterop":true,"module":99,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"target":7},"referencedMap":[[58,1],[53,2],[54,3],[55,3],[52,4]],"latestChangedDtsFile":"./dist/router.d.ts","version":"5.9.3"}
1
+ {"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.dom.asynciterable.d.ts","./node_modules/typescript/lib/lib.webworker.importscripts.d.ts","./node_modules/typescript/lib/lib.scripthost.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/typescript/lib/lib.es2020.full.d.ts","./src/signals.ts","./src/element.ts","./src/index.ts","./src/router.ts","./node_modules/@types/deep-eql/index.d.ts","./node_modules/assertion-error/index.d.ts","./node_modules/@types/chai/index.d.ts","./node_modules/@types/estree/index.d.ts"],"fileIdsList":[[56,57],[52],[52,53],[53]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"2834d3d5f4c0526c760679f15c35791e91f4e51d54d24d00610e35b7ce7a9e01","signature":"a53dff95094f1f7fee261ff1879f5909cd440f02aa68ff6893d017b2343181d1"},{"version":"e9ff34c5bc574b75c34770ddd48174c11fa24127ba94013918be7b71ba5162bb","signature":"4e15936f04a7ab7370e9a897f6d9befa980662283d92660ba0b5cacfab78e5d1"},{"version":"ac16f8022e1d86594d058f84a530164af4b03dcc8bb45ac4a00736fe8aab62e7","signature":"1e325d171d22aa3144736ace94df4b5bf779c6083bc0f9ce684855844f8abcbc"},{"version":"a155e9ebe821846c43103394346639a6a19a7f844be4892bbe4352aa20ee6707","signature":"166554555b2dc6392155b045bb33ce964f7d5f092f50fada34eb4d5828d7740e"},{"version":"427fe2004642504828c1476d0af4270e6ad4db6de78c0b5da3e4c5ca95052a99","impliedFormat":1},{"version":"2eeffcee5c1661ddca53353929558037b8cf305ffb86a803512982f99bcab50d","impliedFormat":99},{"version":"9afb4cb864d297e4092a79ee2871b5d3143ea14153f62ef0bb04ede25f432030","affectsGlobalScope":true,"impliedFormat":99},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1}],"root":[[52,55]],"options":{"allowJs":true,"checkJs":false,"composite":true,"esModuleInterop":true,"module":99,"outDir":"./dist","rootDir":"./src","skipLibCheck":true,"target":7},"referencedMap":[[58,1],[53,2],[54,3],[55,3],[52,4]],"latestChangedDtsFile":"./dist/element.d.ts","version":"5.9.3"}