aberdeen 1.16.0 → 1.17.0

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 (81) hide show
  1. package/dist/src/aberdeen.js +81 -12
  2. package/dist/src/aberdeen.js.map +3 -3
  3. package/dist/src/route.js +9 -4
  4. package/dist/src/route.js.map +3 -3
  5. package/dist/tests/fakedom.js +3 -2
  6. package/dist/tests/fakedom.js.map +3 -3
  7. package/dist/tests/helpers.js +3 -2
  8. package/dist/tests/helpers.js.map +3 -3
  9. package/dist-docs/Tutorial/index.html +2 -2
  10. package/dist-docs/aberdeen/A/index.html +2 -2
  11. package/dist-docs/aberdeen/CUSTOM_DUMP/index.html +2 -2
  12. package/dist-docs/aberdeen/NO_COPY/index.html +2 -2
  13. package/dist-docs/aberdeen/OPAQUE/index.html +2 -2
  14. package/dist-docs/aberdeen/PromiseProxy/index.html +5 -5
  15. package/dist-docs/aberdeen/clean/index.html +2 -2
  16. package/dist-docs/aberdeen/clone/index.html +2 -2
  17. package/dist-docs/aberdeen/copy/index.html +3 -3
  18. package/dist-docs/aberdeen/count/index.html +2 -2
  19. package/dist-docs/aberdeen/cssVars/index.html +2 -2
  20. package/dist-docs/aberdeen/darkMode/index.html +2 -2
  21. package/dist-docs/aberdeen/default/index.html +2 -2
  22. package/dist-docs/aberdeen/derive/index.html +2 -2
  23. package/dist-docs/aberdeen/disableCreateDestroy/index.html +2 -2
  24. package/dist-docs/aberdeen/dump/index.html +2 -2
  25. package/dist-docs/aberdeen/index.html +2 -2
  26. package/dist-docs/aberdeen/insertCss/index.html +2 -2
  27. package/dist-docs/aberdeen/insertGlobalCss/index.html +2 -2
  28. package/dist-docs/aberdeen/invertString/index.html +2 -2
  29. package/dist-docs/aberdeen/isEmpty/index.html +2 -2
  30. package/dist-docs/aberdeen/map/index.html +4 -4
  31. package/dist-docs/aberdeen/merge/index.html +3 -3
  32. package/dist-docs/aberdeen/mount/index.html +2 -2
  33. package/dist-docs/aberdeen/multiMap/index.html +4 -4
  34. package/dist-docs/aberdeen/onEach/index.html +2 -2
  35. package/dist-docs/aberdeen/partition/index.html +4 -4
  36. package/dist-docs/aberdeen/peek/index.html +5 -5
  37. package/dist-docs/aberdeen/proxy/index.html +2 -2
  38. package/dist-docs/aberdeen/ref/index.html +2 -2
  39. package/dist-docs/aberdeen/runQueue/index.html +2 -2
  40. package/dist-docs/aberdeen/setErrorHandler/index.html +2 -2
  41. package/dist-docs/aberdeen/setSpacingCssVars/index.html +2 -2
  42. package/dist-docs/aberdeen/unmountAll/index.html +2 -2
  43. package/dist-docs/aberdeen/unproxy/index.html +2 -2
  44. package/dist-docs/assets/aberdeen/aberdeen.js +81 -12
  45. package/dist-docs/assets/aberdeen/aberdeen.js.map +3 -3
  46. package/dist-docs/assets/aberdeen/route.js +9 -4
  47. package/dist-docs/assets/aberdeen/route.js.map +3 -3
  48. package/dist-docs/dispatcher/Dispatcher/index.html +4 -4
  49. package/dist-docs/dispatcher/MATCH_FAILED/index.html +2 -2
  50. package/dist-docs/dispatcher/MATCH_REST/index.html +2 -2
  51. package/dist-docs/dispatcher/index.html +2 -2
  52. package/dist-docs/hierarchy.html +1 -1
  53. package/dist-docs/index.html +2 -2
  54. package/dist-docs/media/CHANGELOG.md +6 -1
  55. package/dist-docs/modules.html +1 -1
  56. package/dist-docs/prediction/applyCanon/index.html +2 -2
  57. package/dist-docs/prediction/applyPrediction/index.html +2 -2
  58. package/dist-docs/prediction/index.html +2 -2
  59. package/dist-docs/route/Route/index.html +9 -9
  60. package/dist-docs/route/back/index.html +2 -2
  61. package/dist-docs/route/current/index.html +2 -2
  62. package/dist-docs/route/go/index.html +2 -2
  63. package/dist-docs/route/index.html +2 -2
  64. package/dist-docs/route/interceptLinks/index.html +2 -2
  65. package/dist-docs/route/matchCurrent/index.html +2 -2
  66. package/dist-docs/route/persistScroll/index.html +2 -2
  67. package/dist-docs/route/push/index.html +2 -2
  68. package/dist-docs/route/setLog/index.html +2 -2
  69. package/dist-docs/route/up/index.html +2 -2
  70. package/dist-docs/sitemap.xml +59 -59
  71. package/dist-docs/transitions/grow/index.html +2 -2
  72. package/dist-docs/transitions/index.html +2 -2
  73. package/dist-docs/transitions/shrink/index.html +2 -2
  74. package/package.json +1 -1
  75. package/skill/aberdeen.md +54 -54
  76. package/skill/dispatcher.md +6 -6
  77. package/skill/prediction.md +3 -3
  78. package/skill/route.md +18 -18
  79. package/skill/transitions.md +3 -3
  80. package/src/aberdeen.ts +101 -10
  81. package/src/route.ts +11 -3
@@ -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) {
@@ -1446,7 +1494,12 @@ function A(...args) {
1446
1494
  nextPos = classEnd;
1447
1495
  } else {
1448
1496
  let className = arg.substring(nextPos + 1, classEnd);
1449
- el.classList.add(className || args[++argIndex]);
1497
+ const cls = className || args[++argIndex];
1498
+ if (!el.classList.contains(cls)) {
1499
+ if (el === currentScope.el)
1500
+ recordSideEffect(currentScope, 0 /* Class */, cls, false);
1501
+ el.classList.add(cls);
1502
+ }
1450
1503
  nextPos = classEnd - 1;
1451
1504
  }
1452
1505
  }
@@ -1608,29 +1661,45 @@ function applyArg(el, key, value) {
1608
1661
  }
1609
1662
  } else if (key[0] === ".") {
1610
1663
  const classes = key.substring(1).split(".");
1611
- if (value)
1612
- el.classList.add(...classes);
1664
+ const list = el.classList;
1665
+ const desired = !!value;
1666
+ if (el === currentScope.el) {
1667
+ for (const cls of classes) {
1668
+ const had = list.contains(cls);
1669
+ if (had !== desired)
1670
+ recordSideEffect(currentScope, 0 /* Class */, cls, had);
1671
+ }
1672
+ }
1673
+ if (desired)
1674
+ list.add(...classes);
1613
1675
  else
1614
- el.classList.remove(...classes);
1676
+ list.remove(...classes);
1615
1677
  } else if (key[0] === "$") {
1616
1678
  key = key.substring(1);
1617
1679
  const val = value == null || value === false ? "" : typeof value === "string" ? cssVarRef(value) : String(value);
1618
1680
  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;
1681
+ const style = el.style;
1682
+ const setOwn = el === currentScope.el;
1683
+ const props = typeof expanded === "string" ? [expanded] : expanded;
1684
+ for (const prop of props) {
1685
+ const cm = toCamel(prop);
1686
+ if (setOwn)
1687
+ recordSideEffect(currentScope, 1 /* Style */, cm, style[cm]);
1688
+ style[cm] = val;
1624
1689
  }
1625
1690
  } else if (value == null) {} else if (key in SPECIAL_PROPS) {
1626
1691
  SPECIAL_PROPS[key](el, value);
1627
1692
  } else if (typeof value === "function") {
1628
1693
  el.addEventListener(key, value);
1629
1694
  if (el === currentScope.el)
1630
- clean(() => el.removeEventListener(key, value));
1695
+ recordSideEffect(currentScope, 4 /* Event */, key, value);
1631
1696
  } else if (value === true || value === false || key === "value" || key === "selectedIndex") {
1697
+ if (el === currentScope.el)
1698
+ recordSideEffect(currentScope, 2 /* Prop */, key, el[key]);
1632
1699
  el[key] = value;
1633
1700
  } else {
1701
+ if (el === currentScope.el)
1702
+ recordSideEffect(currentScope, 3 /* Attr */, key, el.getAttribute(key));
1634
1703
  el.setAttribute(key, value);
1635
1704
  }
1636
1705
  }
@@ -1905,5 +1974,5 @@ export {
1905
1974
  A
1906
1975
  };
1907
1976
 
1908
- //# debugId=96E760876DC5556F64756E2164756E21
1977
+ //# debugId=28BFF8A898B656A464756E2164756E21
1909
1978
  //# sourceMappingURL=aberdeen.js.map