aberdeen 1.16.1 → 1.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/dist/src/aberdeen.js +82 -12
  2. package/dist/src/aberdeen.js.map +3 -3
  3. package/dist/tests/fakedom.js +3 -2
  4. package/dist/tests/fakedom.js.map +3 -3
  5. package/dist/tests/helpers.js +3 -2
  6. package/dist/tests/helpers.js.map +3 -3
  7. package/dist-docs/Tutorial/index.html +2 -2
  8. package/dist-docs/aberdeen/A/index.html +2 -2
  9. package/dist-docs/aberdeen/CUSTOM_DUMP/index.html +2 -2
  10. package/dist-docs/aberdeen/NO_COPY/index.html +2 -2
  11. package/dist-docs/aberdeen/OPAQUE/index.html +2 -2
  12. package/dist-docs/aberdeen/PromiseProxy/index.html +5 -5
  13. package/dist-docs/aberdeen/clean/index.html +2 -2
  14. package/dist-docs/aberdeen/clone/index.html +2 -2
  15. package/dist-docs/aberdeen/copy/index.html +3 -3
  16. package/dist-docs/aberdeen/count/index.html +2 -2
  17. package/dist-docs/aberdeen/cssVars/index.html +2 -2
  18. package/dist-docs/aberdeen/darkMode/index.html +2 -2
  19. package/dist-docs/aberdeen/default/index.html +2 -2
  20. package/dist-docs/aberdeen/derive/index.html +2 -2
  21. package/dist-docs/aberdeen/disableCreateDestroy/index.html +2 -2
  22. package/dist-docs/aberdeen/dump/index.html +2 -2
  23. package/dist-docs/aberdeen/index.html +2 -2
  24. package/dist-docs/aberdeen/insertCss/index.html +2 -2
  25. package/dist-docs/aberdeen/insertGlobalCss/index.html +2 -2
  26. package/dist-docs/aberdeen/invertString/index.html +2 -2
  27. package/dist-docs/aberdeen/isEmpty/index.html +2 -2
  28. package/dist-docs/aberdeen/map/index.html +4 -4
  29. package/dist-docs/aberdeen/merge/index.html +3 -3
  30. package/dist-docs/aberdeen/mount/index.html +2 -2
  31. package/dist-docs/aberdeen/multiMap/index.html +4 -4
  32. package/dist-docs/aberdeen/onEach/index.html +2 -2
  33. package/dist-docs/aberdeen/partition/index.html +4 -4
  34. package/dist-docs/aberdeen/peek/index.html +5 -5
  35. package/dist-docs/aberdeen/proxy/index.html +2 -2
  36. package/dist-docs/aberdeen/ref/index.html +2 -2
  37. package/dist-docs/aberdeen/runQueue/index.html +2 -2
  38. package/dist-docs/aberdeen/setErrorHandler/index.html +2 -2
  39. package/dist-docs/aberdeen/setSpacingCssVars/index.html +2 -2
  40. package/dist-docs/aberdeen/unmountAll/index.html +2 -2
  41. package/dist-docs/aberdeen/unproxy/index.html +2 -2
  42. package/dist-docs/assets/aberdeen/aberdeen.js +82 -12
  43. package/dist-docs/assets/aberdeen/aberdeen.js.map +3 -3
  44. package/dist-docs/dispatcher/Dispatcher/index.html +4 -4
  45. package/dist-docs/dispatcher/MATCH_FAILED/index.html +2 -2
  46. package/dist-docs/dispatcher/MATCH_REST/index.html +2 -2
  47. package/dist-docs/dispatcher/index.html +2 -2
  48. package/dist-docs/hierarchy.html +1 -1
  49. package/dist-docs/index.html +2 -2
  50. package/dist-docs/media/CHANGELOG.md +8 -0
  51. package/dist-docs/modules.html +1 -1
  52. package/dist-docs/prediction/applyCanon/index.html +2 -2
  53. package/dist-docs/prediction/applyPrediction/index.html +2 -2
  54. package/dist-docs/prediction/index.html +2 -2
  55. package/dist-docs/route/Route/index.html +9 -9
  56. package/dist-docs/route/back/index.html +2 -2
  57. package/dist-docs/route/current/index.html +2 -2
  58. package/dist-docs/route/go/index.html +2 -2
  59. package/dist-docs/route/index.html +2 -2
  60. package/dist-docs/route/interceptLinks/index.html +2 -2
  61. package/dist-docs/route/matchCurrent/index.html +2 -2
  62. package/dist-docs/route/persistScroll/index.html +2 -2
  63. package/dist-docs/route/push/index.html +2 -2
  64. package/dist-docs/route/setLog/index.html +2 -2
  65. package/dist-docs/route/up/index.html +2 -2
  66. package/dist-docs/sitemap.xml +59 -59
  67. package/dist-docs/transitions/grow/index.html +2 -2
  68. package/dist-docs/transitions/index.html +2 -2
  69. package/dist-docs/transitions/shrink/index.html +2 -2
  70. package/package.json +1 -1
  71. package/skill/aberdeen.md +54 -54
  72. package/skill/dispatcher.md +6 -6
  73. package/skill/prediction.md +3 -3
  74. package/skill/route.md +18 -18
  75. package/skill/transitions.md +3 -3
  76. package/src/aberdeen.ts +104 -10
@@ -102,6 +102,33 @@ class ReverseSortedSet {
102
102
  var sortedQueue;
103
103
  var runQueueDepth = 0;
104
104
  var topRedrawScope;
105
+ var survivingEl;
106
+ function recordSideEffect(scope, type, key, value) {
107
+ (scope.sideEffects ||= []).push(type, key, value);
108
+ }
109
+ function undoSideEffects(el, se) {
110
+ for (let i = se.length - 3;i >= 0; i -= 3) {
111
+ const key = se[i + 1];
112
+ const value = se[i + 2];
113
+ switch (se[i]) {
114
+ case 0 /* Class */:
115
+ value ? el.classList.add(key) : el.classList.remove(key);
116
+ break;
117
+ case 1 /* Style */:
118
+ el.style[key] = value == null ? "" : value;
119
+ break;
120
+ case 2 /* Prop */:
121
+ el[key] = value;
122
+ break;
123
+ case 3 /* Attr */:
124
+ value == null ? el.removeAttribute(key) : el.setAttribute(key, value);
125
+ break;
126
+ case 4 /* Event */:
127
+ el.removeEventListener(key, value);
128
+ break;
129
+ }
130
+ }
131
+ }
105
132
  function queue(runner) {
106
133
  if (!sortedQueue) {
107
134
  sortedQueue = new ReverseSortedSet("prio");
@@ -166,7 +193,10 @@ class Scope {
166
193
  const lastNode = this.getLastNode();
167
194
  if (lastNode)
168
195
  removeNodes(lastNode, this.getPrecedingNode());
196
+ const savedSurvivingEl = survivingEl;
197
+ survivingEl = this.el;
169
198
  this.delete();
199
+ survivingEl = savedSurvivingEl;
170
200
  }
171
201
  }
172
202
 
@@ -181,6 +211,7 @@ class DelayedOneTimeRunner {
181
211
 
182
212
  class ContentScope extends Scope {
183
213
  cleaners;
214
+ sideEffects;
184
215
  changes;
185
216
  constructor(cleaners = []) {
186
217
  super();
@@ -192,13 +223,21 @@ class ContentScope extends Scope {
192
223
  return findLastNodeInPrevSiblings(this.lastChild);
193
224
  }
194
225
  delete() {
195
- for (const cleaner of this.cleaners) {
226
+ const cleaners = this.cleaners;
227
+ for (let i = cleaners.length - 1;i >= 0; i--) {
228
+ const cleaner = cleaners[i];
196
229
  if (typeof cleaner === "function")
197
230
  cleaner();
198
231
  else
199
232
  cleaner.delete(this);
200
233
  }
201
234
  this.cleaners.length = 0;
235
+ const se = this.sideEffects;
236
+ if (se) {
237
+ if (this.el === survivingEl)
238
+ undoSideEffects(this.el, se);
239
+ this.sideEffects = undefined;
240
+ }
202
241
  sortedQueue?.remove(this);
203
242
  this.lastChild = undefined;
204
243
  }
@@ -322,7 +361,10 @@ class MountScope extends ContentScope {
322
361
  }
323
362
  delete() {
324
363
  removeNodes(this.getLastNode(), this.getPrecedingNode());
364
+ const savedSurvivingEl = survivingEl;
365
+ survivingEl = this.el;
325
366
  super.delete();
367
+ survivingEl = savedSurvivingEl;
326
368
  }
327
369
  remove() {
328
370
  this.delete();
@@ -517,7 +559,10 @@ class OnEachItemScope extends ContentScope {
517
559
  if (lastNode)
518
560
  removeNodes(lastNode, this.getPrecedingNode());
519
561
  }
562
+ const savedSurvivingEl = survivingEl;
563
+ survivingEl = this.el;
520
564
  this.delete();
565
+ survivingEl = savedSurvivingEl;
521
566
  this.lastChild = this;
522
567
  topRedrawScope = this;
523
568
  this.redraw();
@@ -572,7 +617,10 @@ class OnEachItemScope extends ContentScope {
572
617
  this.parent.sortedSet.remove(this);
573
618
  this.sortKey = undefined;
574
619
  }
620
+ const savedSurvivingEl = survivingEl;
621
+ survivingEl = this.el;
575
622
  this.delete();
623
+ survivingEl = savedSurvivingEl;
576
624
  }
577
625
  }
578
626
  function addNode(el, node) {
@@ -1185,6 +1233,7 @@ var COPY_EMIT = 64;
1185
1233
  var OPAQUE = Symbol("OPAQUE");
1186
1234
  var NO_COPY = OPAQUE;
1187
1235
  Promise.prototype[OPAQUE] = true;
1236
+ Node.prototype[OPAQUE] = true;
1188
1237
  var cssVars = optProxy({});
1189
1238
  function setSpacingCssVars(base = 1, unit = "rem") {
1190
1239
  for (let i = 0;i <= 12; i++) {
@@ -1446,7 +1495,12 @@ function A(...args) {
1446
1495
  nextPos = classEnd;
1447
1496
  } else {
1448
1497
  let className = arg.substring(nextPos + 1, classEnd);
1449
- el.classList.add(className || args[++argIndex]);
1498
+ const cls = className || args[++argIndex];
1499
+ if (!el.classList.contains(cls)) {
1500
+ if (el === currentScope.el)
1501
+ recordSideEffect(currentScope, 0 /* Class */, cls, false);
1502
+ el.classList.add(cls);
1503
+ }
1450
1504
  nextPos = classEnd - 1;
1451
1505
  }
1452
1506
  }
@@ -1608,29 +1662,45 @@ function applyArg(el, key, value) {
1608
1662
  }
1609
1663
  } else if (key[0] === ".") {
1610
1664
  const classes = key.substring(1).split(".");
1611
- if (value)
1612
- el.classList.add(...classes);
1665
+ const list = el.classList;
1666
+ const desired = !!value;
1667
+ if (el === currentScope.el) {
1668
+ for (const cls of classes) {
1669
+ const had = list.contains(cls);
1670
+ if (had !== desired)
1671
+ recordSideEffect(currentScope, 0 /* Class */, cls, had);
1672
+ }
1673
+ }
1674
+ if (desired)
1675
+ list.add(...classes);
1613
1676
  else
1614
- el.classList.remove(...classes);
1677
+ list.remove(...classes);
1615
1678
  } else if (key[0] === "$") {
1616
1679
  key = key.substring(1);
1617
1680
  const val = value == null || value === false ? "" : typeof value === "string" ? cssVarRef(value) : String(value);
1618
1681
  const expanded = CSS_SHORT[key] || key;
1619
- if (typeof expanded === "string") {
1620
- el.style[toCamel(expanded)] = val;
1621
- } else {
1622
- for (const prop of expanded)
1623
- el.style[toCamel(prop)] = val;
1682
+ const style = el.style;
1683
+ const setOwn = el === currentScope.el;
1684
+ const props = typeof expanded === "string" ? [expanded] : expanded;
1685
+ for (const prop of props) {
1686
+ const cm = toCamel(prop);
1687
+ if (setOwn)
1688
+ recordSideEffect(currentScope, 1 /* Style */, cm, style[cm]);
1689
+ style[cm] = val;
1624
1690
  }
1625
1691
  } else if (value == null) {} else if (key in SPECIAL_PROPS) {
1626
1692
  SPECIAL_PROPS[key](el, value);
1627
1693
  } else if (typeof value === "function") {
1628
1694
  el.addEventListener(key, value);
1629
1695
  if (el === currentScope.el)
1630
- clean(() => el.removeEventListener(key, value));
1696
+ recordSideEffect(currentScope, 4 /* Event */, key, value);
1631
1697
  } else if (value === true || value === false || key === "value" || key === "selectedIndex") {
1698
+ if (el === currentScope.el)
1699
+ recordSideEffect(currentScope, 2 /* Prop */, key, el[key]);
1632
1700
  el[key] = value;
1633
1701
  } else {
1702
+ if (el === currentScope.el)
1703
+ recordSideEffect(currentScope, 3 /* Attr */, key, el.getAttribute(key));
1634
1704
  el.setAttribute(key, value);
1635
1705
  }
1636
1706
  }
@@ -1905,5 +1975,5 @@ export {
1905
1975
  A
1906
1976
  };
1907
1977
 
1908
- //# debugId=96E760876DC5556F64756E2164756E21
1978
+ //# debugId=9CF256EC3117093364756E2164756E21
1909
1979
  //# sourceMappingURL=aberdeen.js.map