@pacem/pacem-ui 2.0.0-babbage → 2.0.0-chebyshev

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 (54) hide show
  1. package/dist/browser/pacem-ui.js +71 -9
  2. package/dist/browser/pacem-ui.js.map +1 -1
  3. package/dist/browser/pacem-ui.min.js +2 -2
  4. package/dist/bundle/pacem-ui.min.mjs +57 -57
  5. package/dist/bundle/pacem-ui.mjs +67 -9
  6. package/dist/bundle/pacem-ui.mjs.map +2 -2
  7. package/dist/docs/pacem-ui.json +32 -1
  8. package/dist/esm/adapter.js +1 -1
  9. package/dist/esm/anchor.js +1 -1
  10. package/dist/esm/balloon.js +1 -1
  11. package/dist/esm/binder.js +57 -9
  12. package/dist/esm/blade.js +1 -1
  13. package/dist/esm/bottom-sheet.js +1 -1
  14. package/dist/esm/button.js +1 -1
  15. package/dist/esm/buttonset.js +1 -1
  16. package/dist/esm/calendar.js +1 -1
  17. package/dist/esm/collapse.js +1 -1
  18. package/dist/esm/dialog-abstractions.js +1 -1
  19. package/dist/esm/dialog.js +1 -1
  20. package/dist/esm/divider.js +1 -1
  21. package/dist/esm/icon.js +1 -1
  22. package/dist/esm/image.js +1 -1
  23. package/dist/esm/index-components-ui.js +1 -1
  24. package/dist/esm/index-components.js +1 -1
  25. package/dist/esm/index-iife.js +1 -1
  26. package/dist/esm/index.js +1 -1
  27. package/dist/esm/infinite-scroller.js +1 -1
  28. package/dist/esm/iterative.js +1 -1
  29. package/dist/esm/lightbox-abstractions.js +1 -1
  30. package/dist/esm/lightbox.js +1 -1
  31. package/dist/esm/loader.js +1 -1
  32. package/dist/esm/markdown-svc.js +1 -1
  33. package/dist/esm/markdown.js +1 -1
  34. package/dist/esm/marquee.js +1 -1
  35. package/dist/esm/media-query.js +1 -1
  36. package/dist/esm/menu.js +1 -1
  37. package/dist/esm/pager.js +1 -1
  38. package/dist/esm/picture.js +1 -1
  39. package/dist/esm/progressbar.js +1 -1
  40. package/dist/esm/sidebar.js +1 -1
  41. package/dist/esm/slideshow.js +1 -1
  42. package/dist/esm/social-twitter.js +1 -1
  43. package/dist/esm/sticky-header.js +1 -1
  44. package/dist/esm/tabs.js +1 -1
  45. package/dist/esm/ticker.js +1 -1
  46. package/dist/esm/toast.js +1 -1
  47. package/dist/esm/toc.js +1 -1
  48. package/dist/esm/tuner.js +1 -1
  49. package/dist/esm/types.js +1 -1
  50. package/dist/esm/vibration.js +1 -1
  51. package/dist/esm/view.js +15 -1
  52. package/dist/esm/window.js +1 -1
  53. package/package.json +1 -1
  54. package/typings/index.d.ts +11 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * @pacem/pacem-ui v2.0.0-babbage (https://js.pacem.it)
2
+ * @pacem/pacem-ui v2.0.0-chebyshev (https://js.pacem.it)
3
3
  * Pacem (https://pacem.it)
4
4
  * Licensed under Apache-2.0
5
5
  */
@@ -1288,6 +1288,10 @@
1288
1288
  this._setPathVisibility();
1289
1289
  }
1290
1290
  break;
1291
+ case 'layer':
1292
+ this._hostSvg();
1293
+ this._draw();
1294
+ break;
1291
1295
  }
1292
1296
  }
1293
1297
  disconnectedCallback() {
@@ -1329,27 +1333,67 @@
1329
1333
  pacemCore.Utils.addClass(svg, pacemCore.PCSS + '-binder ' + this.className);
1330
1334
  svg.style.top = '0';
1331
1335
  svg.style.left = '0';
1332
- svg.style.overflow = 'hidden';
1333
1336
  svg.style.pointerEvents = 'none';
1334
1337
  const path = this._path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
1335
1338
  path.setAttribute('fill', 'none');
1336
1339
  path.setAttribute('display', 'none');
1337
1340
  this._setPathVisibility();
1338
1341
  svg.appendChild(path);
1339
- this.invalidateSize();
1340
- document.body.appendChild(svg);
1342
+ this._hostSvg();
1341
1343
  STD_EVENTS.forEach(e => {
1342
1344
  path.addEventListener(e, this._broadcastHandler, false);
1343
1345
  });
1344
1346
  }
1345
1347
  }
1346
- /** Resizes the shared full-page SVG overlay to match the current document size; call after layout changes that may affect `document.body`'s scroll size. */
1348
+ /** Whether the SVG lives in a custom {@link layer} rather than in the full-page overlay. */
1349
+ get _layered() {
1350
+ const layer = this.layer;
1351
+ return !pacemCore.Utils.isNull(layer) && layer !== document.body;
1352
+ }
1353
+ /** Appends the SVG to its host ({@link layer} or `document.body`), adapting its overflow and size accordingly. */
1354
+ _hostSvg() {
1355
+ const svg = this._svg;
1356
+ if (pacemCore.Utils.isNull(svg)) {
1357
+ return;
1358
+ }
1359
+ const layered = this._layered;
1360
+ // a full-page overlay must not grow the document, a layer must not crop the curve
1361
+ svg.style.overflow = layered ? 'visible' : 'hidden';
1362
+ this.invalidateSize();
1363
+ const host = layered ? this.layer : document.body;
1364
+ if (svg.parentNode !== host) {
1365
+ host.appendChild(svg);
1366
+ }
1367
+ }
1368
+ /** Resizes the shared full-page SVG overlay to match the current document size; call after layout changes that may affect `document.body`'s scroll size. A {@link layer}-hosted SVG just fills its host. */
1347
1369
  invalidateSize() {
1348
1370
  const svg = this._svg;
1349
- if (!pacemCore.Utils.isNull(svg)) {
1350
- svg.setAttribute('width', document.body.scrollWidth.toString());
1351
- svg.setAttribute('height', document.body.scrollHeight.toString());
1371
+ if (pacemCore.Utils.isNull(svg)) {
1372
+ return;
1373
+ }
1374
+ if (this._layered) {
1375
+ svg.setAttribute('width', '100%');
1376
+ svg.setAttribute('height', '100%');
1377
+ return;
1352
1378
  }
1379
+ svg.setAttribute('width', document.body.scrollWidth.toString());
1380
+ svg.setAttribute('height', document.body.scrollHeight.toString());
1381
+ }
1382
+ /** Page coordinates of the origin the curve is drawn against: the {@link layer}'s (scrolled) padding box, or the page itself. */
1383
+ _getOrigin() {
1384
+ if (!this._layered) {
1385
+ return { x: 0, y: 0 };
1386
+ }
1387
+ const layer = this.layer;
1388
+ const offset = pacemCore.Utils.offset(layer);
1389
+ return {
1390
+ x: offset.left + layer.clientLeft - layer.scrollLeft,
1391
+ y: offset.top + layer.clientTop - layer.scrollTop
1392
+ };
1393
+ }
1394
+ /** Translates a page-based layout into the coordinates of the drawing origin. */
1395
+ _toLocal(size, origin) {
1396
+ return { ...size, left: size.left - origin.x, top: size.top - origin.y };
1353
1397
  }
1354
1398
  _computeAnchorPoints(target, anchor, end, ref, refAnchor, refEnd, tension) {
1355
1399
  var p1, p2, c1, c2;
@@ -1702,7 +1746,8 @@
1702
1746
  path.setAttribute('d', '');
1703
1747
  return;
1704
1748
  }
1705
- const { points, anchors } = this._computeAnchorPoints(state1.size, state1.anchor, this.fromEnd, state2.size, state2.anchor, this.toEnd, this.tension), p0 = points[0], c0 = points[1], p1 = points[2], c1 = points[3], anchor0 = anchors[0], anchor1 = anchors[1];
1749
+ const origin = this._getOrigin(), size1 = this._toLocal(state1.size, origin), size2 = this._toLocal(state2.size, origin);
1750
+ const { points, anchors } = this._computeAnchorPoints(size1, state1.anchor, this.fromEnd, size2, state2.anchor, this.toEnd, this.tension), p0 = points[0], c0 = points[1], p1 = points[2], c1 = points[3], anchor0 = anchors[0], anchor1 = anchors[1];
1706
1751
  const x0 = p0.x;
1707
1752
  const y0 = p0.y;
1708
1753
  const cx0 = c0.x;
@@ -1798,6 +1843,9 @@
1798
1843
  __decorate$y([
1799
1844
  pacemCore.Watch({ emit: false, converter: pacemCore.PropertyConverters.Boolean })
1800
1845
  ], PacemBinderElement.prototype, "interactive", void 0);
1846
+ __decorate$y([
1847
+ pacemCore.Watch({ emit: false, converter: pacemCore.PropertyConverters.Element })
1848
+ ], PacemBinderElement.prototype, "layer", void 0);
1801
1849
  PacemBinderElement = __decorate$y([
1802
1850
  pacemCore.CustomElement({ tagName: pacemCore.P + '-binder' })
1803
1851
  ], PacemBinderElement);
@@ -5886,6 +5934,8 @@ css-class="{{ ['hour-start-'+ (^item.hour + 1), 'hour-end-'+ (^item.hour + ^item
5886
5934
  let PacemViewElement = class PacemViewElement extends pacemCore.PacemEventTarget {
5887
5935
  constructor() {
5888
5936
  super(...arguments);
5937
+ /** Bumped by every new content: a pending `render` dispatch from superseded content is dropped. */
5938
+ this.#renderVersion = 0;
5889
5939
  this._templateChangeHandler = (evt) => {
5890
5940
  const tmplProxy = evt.target;
5891
5941
  this._setTmpl(tmplProxy.target);
@@ -5903,6 +5953,8 @@ css-class="{{ ['hour-start-'+ (^item.hour + 1), 'hour-end-'+ (^item.hour + ^item
5903
5953
  }, 100 /* tenth of a second limit */);
5904
5954
  };
5905
5955
  }
5956
+ /** Bumped by every new content: a pending `render` dispatch from superseded content is dropped. */
5957
+ #renderVersion;
5906
5958
  propertyChangedCallback(name, old, val, first) {
5907
5959
  super.propertyChangedCallback(name, old, val, first);
5908
5960
  // url
@@ -5967,6 +6019,7 @@ css-class="{{ ['hour-start-'+ (^item.hour + 1), 'hour-end-'+ (^item.hour + ^item
5967
6019
  }
5968
6020
  _setTmpl(tmpl) {
5969
6021
  cancelAnimationFrame(this._renderHandle);
6022
+ this.#renderVersion++;
5970
6023
  // this way, `this._container.innerHTML = ''` instruction will eventually let the page "scroll up"...
5971
6024
  this.innerHTML = '';
5972
6025
  this._dispatchPrerender();
@@ -6039,6 +6092,7 @@ css-class="{{ ['hour-start-'+ (^item.hour + 1), 'hour-end-'+ (^item.hour + ^item
6039
6092
  _manageResult(result) {
6040
6093
  // this way, `this._container.innerHTML = ''` instruction will eventually let the page "scroll up"...
6041
6094
  cancelAnimationFrame(this._renderHandle);
6095
+ const version = ++this.#renderVersion;
6042
6096
  this.scrollTo({ top: 0, left: 0, behavior: 'instant' });
6043
6097
  this.innerHTML = '';
6044
6098
  this._dispatchPrerender();
@@ -6049,12 +6103,20 @@ css-class="{{ ['hour-start-'+ (^item.hour + 1), 'hour-end-'+ (^item.hour + ^item
6049
6103
  // setting fetching to `false` triggers a css class change that could/should cause a css transition to happen
6050
6104
  // TODO: manage to switch to native in a near future (https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API or https://youtu.be/oDcb3fvtETs)
6051
6105
  pacemCore.Utils.addAnimationEndCallback(this, () => {
6106
+ if (version !== this.#renderVersion) {
6107
+ return;
6108
+ }
6052
6109
  this._dispatchRender();
6053
6110
  }, ANIM_TIMEOUT);
6054
6111
  });
6055
6112
  }
6056
6113
  #resizeHandle;
6057
6114
  _dispatchRender() {
6115
+ // the view might have been removed meanwhile (e.g. a nested view whose container got re-rendered):
6116
+ // no shell to host the resizer, nothing to notify.
6117
+ if (!this.isConnected) {
6118
+ return;
6119
+ }
6058
6120
  const resizer = new pacemCore.Components.PacemResizeElement();
6059
6121
  resizer.target = this;
6060
6122
  resizer.addEventListener(pacemCore.Components.ResizeEventName, this._debounceDispatchHandler);