lido-player 0.0.2-beta-19-dev → 0.0.2-beta-21-dev

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 (34) hide show
  1. package/dist/cjs/{decode-Bny56MQ9.js → decode-Buln7Iaf.js} +1 -1
  2. package/dist/cjs/{index-BY9fvbr8.js → index-Bb_TFgTA.js} +1 -1
  3. package/dist/cjs/{index-DjsCseV8.js → index-DBCFoh1I.js} +19 -66
  4. package/dist/cjs/index.cjs.js +2 -2
  5. package/dist/cjs/lido-avatar_22.cjs.entry.js +110 -21
  6. package/dist/cjs/lido-player.cjs.js +2 -2
  7. package/dist/cjs/loader.cjs.js +1 -1
  8. package/dist/collection/collection-manifest.json +1 -1
  9. package/dist/collection/components/trace/lido-trace.js +107 -18
  10. package/dist/components/index.js +1 -1
  11. package/dist/components/lido-home.js +1 -1
  12. package/dist/components/lido-root.js +1 -1
  13. package/dist/components/lido-trace.js +1 -1
  14. package/dist/components/p-BAfFgI9q.js +1 -0
  15. package/dist/components/{p-CWwymnbk.js → p-wF7SBGpr.js} +2 -2
  16. package/dist/esm/{decode-Buyq-Iy5.js → decode-B_VrYFdJ.js} +1 -1
  17. package/dist/esm/{index-CQXciux9.js → index-B-VyHxJa.js} +1 -1
  18. package/dist/esm/{index-DQZfuGjI.js → index-mMpK8062.js} +19 -66
  19. package/dist/esm/index.js +2 -2
  20. package/dist/esm/lido-avatar_22.entry.js +110 -21
  21. package/dist/esm/lido-player.js +3 -3
  22. package/dist/esm/loader.js +2 -2
  23. package/dist/lido-player/index.esm.js +1 -1
  24. package/dist/lido-player/lido-player.esm.js +1 -1
  25. package/dist/lido-player/{p-37736e11.entry.js → p-744dee1c.entry.js} +2 -2
  26. package/dist/lido-player/{p-3Ry570XH.js → p-BK926Rl3.js} +1 -1
  27. package/dist/lido-player/{p-CFtq4Thh.js → p-Cw84dpIR.js} +1 -1
  28. package/dist/lido-player/p-mMpK8062.js +2 -0
  29. package/dist/types/components/trace/lido-trace.d.ts +9 -1
  30. package/dist/types/stencil-public-runtime.d.ts +55 -73
  31. package/loader/index.d.ts +1 -1
  32. package/package.json +3 -3
  33. package/dist/components/p-DYFVwyRr.js +0 -1
  34. package/dist/lido-player/p-DQZfuGjI.js +0 -3
@@ -1,4 +1,4 @@
1
- import { g as getDefaultExportFromCjs } from './index-CQXciux9.js';
1
+ import { g as getDefaultExportFromCjs } from './index-B-VyHxJa.js';
2
2
 
3
3
  function _mergeNamespaces(n, m) {
4
4
  m.forEach(function (e) {
@@ -1,4 +1,4 @@
1
- import { c as getAssetPath } from './index-DQZfuGjI.js';
1
+ import { c as getAssetPath } from './index-mMpK8062.js';
2
2
 
3
3
  const DragMapKey = 'lidoDragMap';
4
4
  const SelectedValuesKey = 'lidoSelectedValues';
@@ -5,7 +5,7 @@ const globalScripts = () => {};
5
5
  const globalStyles = "@font-face{font-family:'Baloo Bhai 2';font-style:normal;font-weight:400 800;font-display:swap;src:url('../assets/offline-assets/fonts/Baloo-Bhai-2/Baloo-Bhai-2-Variable.woff2') format('woff2')}body{overflow:hidden;background-position:center;background-size:cover;background-repeat:no-repeat;height:100vh}*{user-select:none}.lido-disable-check-button{pointer-events:none;background-color:#9393935c !important;color:white}.lido-element-selected{border:2px solid;background-color:#ffdf7d !important}.diagonal-target,.diagonal-drop *{transform:scale(0.8) !important;opacity:1 !important}.cloned-element{display:flex !important;position:absolute !important;filter:grayscale(100%);pointer-events:none}.removeShadow{box-shadow:0px 0px 0px 0px #ff8900 !important}.highlight-element{border:2px solid white;box-shadow:rgb(243, 77, 8) 0px 0px 40px !important}.drop-element.empty{border:4px dashed #f34d08 !important}.drop-element.filled{border:'none' !important}.drag-element{box-shadow:0px 15px 11px rgba(43, 0, 0, 0.3) !important}.drag-element.dropped{box-shadow:none !important}.click-element{background-color:var(--btn-bg-color, rgba(255, 172, 76, 1)) !important;box-shadow:var(--btn-shadow-px) var(--btn-shadow-color, rgba(225, 121, 76, 1)) !important;cursor:pointer;transition:box-shadow 0.1s ease-out, transform 0.2s ease-out;}.click-element:active{box-shadow:0px 0px 0px var(--btn-shadow-color, rgba(225, 121, 76, 1)) !important;transform:translateY(var(--btn-active));}.click-element:focus{outline:2px solid dodgerblue;outline-offset:3px}.after-drop-popup-container{width:200%;height:200%;background-color:rgba(0, 0, 0, 0.8);position:absolute;display:flex;flex-direction:row-reverse;align-items:center;justify-content:center !important;gap:80px}.after-drop-popup-drag-element{scale:1.5;border-radius:8px;transform:none !important;position:unset !important}.after-drop-popup-drop-element{scale:1.5;border:unset;border-radius:8px;transform:none !important;position:unset !important}@keyframes zoomFadeIn{0%{transform:scale(0.6);opacity:0}100%{transform:scale(1);opacity:1}}.zoom-fade-in{animation:zoomFadeIn 0.8s ease-out forwards}@keyframes zoomFadeOut{0%{transform:scale(1);opacity:1}100%{transform:scale(0.6);opacity:0}}.zoom-fade-out{animation:zoomFadeOut 0.8s ease-in forwards}.slide-numbers{width:70px;height:70px;border:1px solid #f57139;background-color:white;font-weight:500;color:#f57139;font-size:44px;border-radius:40px;display:flex;align-items:center;justify-content:center;font-family:'Baloo Bhai 2', serif}.slide-numbers-bottom{position:absolute;display:flex;justify-content:space-around;align-items:center;bottom:-25px;width:100%;height:50px}.slide-numbers-left{position:absolute;display:flex;flex-direction:column;justify-content:space-around;height:100%;width:50px;left:-25px;bottom:0px}.lido-speak-icon{width:56px;height:56px;position:absolute;top:-25px;right:-25px;z-index:10;background-color:white;border:4px solid #F34D08;border-radius:16px;box-shadow:0px 4px 0px 0px #F34D08;background-size:contain;background-repeat:no-repeat;cursor:pointer}.lido-speak-icon:active{transform:translateY(8px);box-shadow:0px 0px 0px 0px !important}.lido-strong-shake{animation:strongShake 0.3s ease}.lido-scaled-shake{animation:scaledShake 0.6s ease-in-out}.lido-horizontal-shake{animation:horizontalShake 0.6s ease-in-out;border-radius:20px}.lido-vertical-shake{animation:verticalShake 0.6s ease-in-out;border-radius:20px}.lido-diagonal-shake{animation:diagonalShake 0.5s ease-in-out;border-radius:20px;will-change:transform}.lido-glow{animation:glowPulse 1s infinite alternate;transition:opacity 0.5s ease-in-out}.lido-box-highlight{animation:topToPlace 0.3s linear}.lido-display-hiddenvalue{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;font-size:80px;font-weight:1000;color:brown;-webkit-text-stroke:2px white;font-family:'Baloo Bhai 2', sans-serif;pointer-events:none}.lido-image-colorize{position:relative;display:inline-block}.lido-image-colorize::after{content:'';position:absolute;inset:0;background:var(--tint-color);mix-blend-mode:multiply;opacity:0.8;pointer-events:none;mask-image:var(--mask-url);mask-size:cover;mask-repeat:no-repeat;mask-position:center}.lido-tts-highlight-overlay{position:fixed;left:0;top:0;pointer-events:none;z-index:9999;background:linear-gradient(\n 180deg,\n rgba(255, 235, 59, 0.95),\n rgba(255, 214, 0, 0.95)\n );border-radius:6px;box-shadow:0 2px 6px rgba(0, 0, 0, 0.18),\n inset 0 -1px 0 rgba(255, 255, 255, 0.25);transition:width 25ms ease-out,\n height 25ms ease-out,\n opacity 80ms ease-out;opacity:0.95;will-change:transform, width, height;contain:layout paint style}.category-dropped-onCorrect{box-shadow:rgba(129, 193, 39, 1) 0px 8px 8px 0px !important}.category-dropped-onInCorrect{box-shadow:rgba(255, 4, 16, 1) 0px 8px 8px 0px !important}";
6
6
 
7
7
  /*
8
- Stencil Client Platform v4.45.1 | MIT Licensed | https://stenciljs.com
8
+ Stencil Client Platform v4.43.5 | MIT Licensed | https://stenciljs.com
9
9
  */
10
10
 
11
11
 
@@ -93,9 +93,7 @@ var consoleError = (e, el) => (0, console.error)(e, el);
93
93
 
94
94
  // src/client/client-load-module.ts
95
95
  var cmpModules = /* @__PURE__ */ new Map();
96
- var failedLoadAttempts = /* @__PURE__ */ new Map();
97
96
  var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
98
- var _a;
99
97
  const exportName = cmpMeta.$tagName$.replace(/-/g, "_");
100
98
  const bundleId = cmpMeta.$lazyBundleId$;
101
99
  if (!bundleId) {
@@ -105,11 +103,6 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
105
103
  if (module) {
106
104
  return module[exportName];
107
105
  }
108
- const retryCount = (_a = failedLoadAttempts.get(bundleId)) != null ? _a : 0;
109
- const cacheBustParams = [
110
- retryCount > 0 ? `s-retry=${retryCount}` : "",
111
- ""
112
- ].filter(Boolean).join("&");
113
106
 
114
107
  if (!hmrVersionId || !BUILD.hotModuleReplacement) {
115
108
  const processMod = importedModule => {
@@ -129,17 +122,15 @@ var loadModule = (cmpMeta, hostRef, hmrVersionId) => {
129
122
  /* webpackInclude: /\.entry\.js$/ */
130
123
  /* webpackExclude: /\.system\.entry\.js$/ */
131
124
  /* webpackMode: "lazy" */
132
- `./${bundleId}.entry.js${cacheBustParams ? "?" + cacheBustParams : ""}`
125
+ `./${bundleId}.entry.js${""}`
133
126
  ).then(
134
127
  (importedModule) => {
135
128
  {
136
- failedLoadAttempts.delete(bundleId);
137
129
  cmpModules.set(bundleId, importedModule);
138
130
  }
139
131
  return importedModule[exportName];
140
132
  },
141
133
  (e) => {
142
- failedLoadAttempts.set(bundleId, retryCount + 1);
143
134
  consoleError(e, hostRef.$hostElement$);
144
135
  }
145
136
  );
@@ -150,8 +141,6 @@ var styles = /* @__PURE__ */ new Map();
150
141
  var HYDRATED_CSS = "{visibility:hidden}.hydrated{visibility:inherit}";
151
142
  var SLOT_FB_CSS = "slot-fb{display:contents}slot-fb[hidden]{display:none}";
152
143
  var XLINK_NS = "http://www.w3.org/1999/xlink";
153
- var MAX_LAZY_LOAD_RETRIES = 3;
154
- var LAZY_LOAD_RETRY_INTERVAL_MS = 1e3;
155
144
  var win = typeof window !== "undefined" ? window : {};
156
145
  var plt = {
157
146
  $flags$: 0,
@@ -178,10 +167,6 @@ var supportsMutableAdoptedStyleSheets = supportsConstructableStylesheets ? /* @_
178
167
  var queuePending = false;
179
168
  var queueDomReads = [];
180
169
  var queueDomWrites = [];
181
- var scheduleFlush = () => {
182
- var _a;
183
- return ((_a = win.document) == null ? void 0 : _a.hidden) ? nextTick(flush) : plt.raf(flush);
184
- };
185
170
  var queueTask = (queue, write) => (cb) => {
186
171
  queue.push(cb);
187
172
  if (!queuePending) {
@@ -189,7 +174,7 @@ var queueTask = (queue, write) => (cb) => {
189
174
  if (write && plt.$flags$ & 4 /* queueSync */) {
190
175
  nextTick(flush);
191
176
  } else {
192
- scheduleFlush();
177
+ plt.raf(flush);
193
178
  }
194
179
  }
195
180
  };
@@ -208,7 +193,7 @@ var flush = () => {
208
193
  {
209
194
  consume(queueDomWrites);
210
195
  if (queuePending = queueDomReads.length > 0) {
211
- scheduleFlush();
196
+ plt.raf(flush);
212
197
  }
213
198
  }
214
199
  };
@@ -289,7 +274,7 @@ function getHostSlotNodes(childNodes, hostName, slotName) {
289
274
  slottedNodes.push(childNode);
290
275
  if (typeof slotName !== "undefined") return slottedNodes;
291
276
  }
292
- slottedNodes = [...slottedNodes, ...getHostSlotNodes(internalCall(childNode, "childNodes"), hostName, slotName)];
277
+ slottedNodes = [...slottedNodes, ...getHostSlotNodes(childNode.childNodes, hostName, slotName)];
293
278
  }
294
279
  return slottedNodes;
295
280
  }
@@ -533,11 +518,6 @@ var h = (nodeName, vnodeData, ...children) => {
533
518
  } else if (child != null && typeof child !== "boolean") {
534
519
  if (simple = typeof nodeName !== "function" && !isComplexType(child)) {
535
520
  child = String(child);
536
- } else if (typeof nodeName !== "function" && child.$flags$ === void 0) {
537
- {
538
- consoleError("Invalid vNode child");
539
- }
540
- continue;
541
521
  }
542
522
  if (simple && lastSimple) {
543
523
  vNodeChildren[vNodeChildren.length - 1].$text$ += child;
@@ -782,7 +762,7 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
782
762
  }
783
763
  }
784
764
  if (newValue == null || newValue === false) {
785
- if (newValue !== false || elm.getAttribute(memberName) === "" || flags & 4 /* isHost */ && !isEnumeratedAttribute(memberName)) {
765
+ if (newValue !== false || elm.getAttribute(memberName) === "") {
786
766
  if (xlink) {
787
767
  elm.removeAttributeNS(XLINK_NS, memberName);
788
768
  } else {
@@ -799,8 +779,6 @@ var setAccessor = (elm, memberName, oldValue, newValue, isSvg, flags, initialRen
799
779
  }
800
780
  }
801
781
  };
802
- var ENUMERATED_ATTRIBUTES = /* @__PURE__ */ new Set(["draggable", "contenteditable", "spellcheck"]);
803
- var isEnumeratedAttribute = (attrName) => ENUMERATED_ATTRIBUTES.has(attrName) || attrName.startsWith("aria-");
804
782
  var parseClassListRegex = /\s/;
805
783
  var parseClassList = (value) => {
806
784
  if (typeof value === "object" && value && "baseVal" in value) {
@@ -1069,7 +1047,7 @@ var updateChildren = (parentElm, oldCh, newVNode2, newCh, isInitialRender = fals
1069
1047
  if (idxInOld >= 0) {
1070
1048
  elmToMove = oldCh[idxInOld];
1071
1049
  if (elmToMove.$tag$ !== newStartVnode.$tag$) {
1072
- node = createElm(oldCh && oldCh[newStartIdx], newVNode2, newStartIdx);
1050
+ node = createElm(oldCh && oldCh[newStartIdx], newVNode2, idxInOld);
1073
1051
  } else {
1074
1052
  patch(elmToMove, newStartVnode, isInitialRender);
1075
1053
  oldCh[idxInOld] = void 0;
@@ -1168,10 +1146,7 @@ var markSlotContentForRelocation = (elm) => {
1168
1146
  const slotName = childNode["s-sn"];
1169
1147
  for (j = hostContentNodes.length - 1; j >= 0; j--) {
1170
1148
  node = hostContentNodes[j];
1171
- if (!node["s-cn"] && !node["s-nr"] && node["s-hn"] !== childNode["s-hn"] && // let an exact named-slot match override a stale default-slot claim. Skip this for
1172
- // `slotName === ''` itself - a matched default node's cached `s-sn` is `''` too, which
1173
- // would trivially "match" on every re-render and force pointless re-insertion.
1174
- (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"] || slotName !== "" && getSlotName(node) === slotName)) {
1149
+ if (!node["s-cn"] && !node["s-nr"] && node["s-hn"] !== childNode["s-hn"] && (!node["s-sh"] || node["s-sh"] !== childNode["s-hn"])) {
1175
1150
  if (isNodeLocatedInSlot(node, slotName)) {
1176
1151
  let relocateNodeData = relocateNodes.find((r) => r.$nodeToRelocate$ === node);
1177
1152
  checkSlotFallbackVisibility = true;
@@ -1239,7 +1214,7 @@ var insertBefore = (parent, newNode, reference, isInitialLoad) => {
1239
1214
  return newNode;
1240
1215
  }
1241
1216
  }
1242
- if ((parent == null ? void 0 : parent.__insertBefore)) {
1217
+ if (parent.__insertBefore) {
1243
1218
  return parent.__insertBefore(newNode, reference);
1244
1219
  } else {
1245
1220
  return parent == null ? void 0 : parent.insertBefore(newNode, reference);
@@ -1606,7 +1581,6 @@ var setValue = (ref, propName, newVal, cmpMeta) => {
1606
1581
  };
1607
1582
 
1608
1583
  // src/runtime/proxy-component.ts
1609
- var reflectedAttrValue = (propValue) => propValue == null || propValue === false ? null : propValue === true ? "" : String(propValue);
1610
1584
  var proxyComponent = (Cstr, cmpMeta, flags) => {
1611
1585
  var _a, _b;
1612
1586
  const prototype = Cstr.prototype;
@@ -1677,26 +1651,21 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1677
1651
  }
1678
1652
  return;
1679
1653
  }
1680
- const parsedValue = parsePropertyValue(
1681
- newValue,
1682
- memberFlags);
1683
- const setterSetVal = (val) => {
1654
+ const setterSetVal = () => {
1684
1655
  const currentValue = ref.$lazyInstance$[memberName];
1685
1656
  if (!ref.$instanceValues$.get(memberName) && currentValue) {
1686
1657
  ref.$instanceValues$.set(memberName, currentValue);
1687
1658
  }
1688
- ref.$lazyInstance$[memberName] = val;
1659
+ ref.$lazyInstance$[memberName] = parsePropertyValue(
1660
+ newValue,
1661
+ memberFlags);
1689
1662
  setValue(this, memberName, ref.$lazyInstance$[memberName], cmpMeta);
1690
1663
  };
1691
1664
  if (ref.$lazyInstance$) {
1692
- setterSetVal(parsedValue);
1665
+ setterSetVal();
1693
1666
  } else {
1694
- ref.$instanceValues$.set(memberName, parsedValue);
1695
1667
  ref.$fetchedCbList$.push(() => {
1696
- const pendingValue = ref.$instanceValues$.get(memberName);
1697
- if (ref.$lazyInstance$[memberName] !== pendingValue) {
1698
- setterSetVal(pendingValue);
1699
- }
1668
+ setterSetVal();
1700
1669
  });
1701
1670
  }
1702
1671
  }
@@ -1744,20 +1713,13 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1744
1713
  return;
1745
1714
  }
1746
1715
  const propFlags = members.find(([m]) => m === propName);
1747
- const propMemberFlags = propFlags ? propFlags[1][0] : 0;
1748
- const isBooleanTarget = propMemberFlags & 4 /* Boolean */;
1749
- if (propMemberFlags & 512 /* ReflectAttr */ && propMemberFlags & 8 /* Any */ && // a complex value is never written to an attribute, so a change while the prop holds
1750
- // one is always external
1751
- !isComplexType(this[propName]) && reflectedAttrValue(this[propName]) === newValue) {
1752
- return;
1753
- }
1716
+ const isBooleanTarget = propFlags && propFlags[1][0] & 4 /* Boolean */;
1754
1717
  const isSpuriousBooleanRemoval = isBooleanTarget && newValue === null && this[propName] === void 0;
1755
1718
  if (isBooleanTarget) {
1756
1719
  newValue = newValue === null || newValue === "false" ? false : true;
1757
1720
  }
1758
- const currentValue = propMemberFlags & 4096 /* Setter */ ? hostRef.$instanceValues$.get(propName) : this[propName];
1759
1721
  const propDesc = Object.getOwnPropertyDescriptor(prototype, propName);
1760
- if (!isSpuriousBooleanRemoval && newValue != currentValue && (!propDesc.get || !!propDesc.set)) {
1722
+ if (!isSpuriousBooleanRemoval && newValue != this[propName] && (!propDesc.get || !!propDesc.set)) {
1761
1723
  this[propName] = newValue;
1762
1724
  }
1763
1725
  });
@@ -1783,12 +1745,10 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1783
1745
 
1784
1746
  // src/runtime/initialize-component.ts
1785
1747
  var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
1786
- var _a;
1787
1748
  let Cstr;
1788
1749
  try {
1789
1750
  if ((hostRef.$flags$ & 32 /* hasInitializedComponent */) === 0) {
1790
1751
  hostRef.$flags$ |= 32 /* hasInitializedComponent */;
1791
- hostRef.$flags$ &= -1025 /* hasFailedLoad */;
1792
1752
  const bundleId = cmpMeta.$lazyBundleId$;
1793
1753
  if (bundleId) {
1794
1754
  const CstrImport = loadModule(cmpMeta, hostRef);
@@ -1800,11 +1760,6 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
1800
1760
  Cstr = CstrImport;
1801
1761
  }
1802
1762
  if (!Cstr) {
1803
- hostRef.$flags$ &= -33 /* hasInitializedComponent */;
1804
- hostRef.$loadRetryCount$ = ((_a = hostRef.$loadRetryCount$) != null ? _a : 0) + 1;
1805
- if (hostRef.$loadRetryCount$ < MAX_LAZY_LOAD_RETRIES) {
1806
- hostRef.$flags$ |= 1024 /* hasFailedLoad */;
1807
- }
1808
1763
  throw new Error(`Constructor for "${cmpMeta.$tagName$}#${hostRef.$modeName$}" was not found`);
1809
1764
  }
1810
1765
  if (!Cstr.isProxied) {
@@ -1869,7 +1824,7 @@ var initializeComponent = async (elm, hostRef, cmpMeta, hmrVersionId) => {
1869
1824
  hostRef.$onRenderResolve$();
1870
1825
  hostRef.$onRenderResolve$ = void 0;
1871
1826
  }
1872
- if (hostRef.$onReadyResolve$ && !(hostRef.$flags$ & 1024 /* hasFailedLoad */)) {
1827
+ if (hostRef.$onReadyResolve$) {
1873
1828
  hostRef.$onReadyResolve$(elm);
1874
1829
  }
1875
1830
  }
@@ -1921,8 +1876,6 @@ var connectedCallback = (elm) => {
1921
1876
  } else {
1922
1877
  if (hostRef == null ? void 0 : hostRef.$lazyInstance$) {
1923
1878
  fireConnectedCallback(hostRef.$lazyInstance$, elm);
1924
- } else if (hostRef.$flags$ & 1024 /* hasFailedLoad */) {
1925
- setTimeout(() => initializeComponent(elm, hostRef, cmpMeta), LAZY_LOAD_RETRY_INTERVAL_MS);
1926
1879
  } else if (hostRef == null ? void 0 : hostRef.$onReadyPromise$) {
1927
1880
  hostRef.$onReadyPromise$.then(() => fireConnectedCallback(hostRef.$lazyInstance$, elm));
1928
1881
  }
@@ -2049,7 +2002,7 @@ var bootstrapLazy = (lazyBundles, options = {}) => {
2049
2002
  }
2050
2003
  disconnectedCallback() {
2051
2004
  plt.jmp(() => disconnectedCallback(this));
2052
- nextTick(() => {
2005
+ plt.raf(() => {
2053
2006
  var _a3;
2054
2007
  const hostRef = getHostRef(this);
2055
2008
  if (!hostRef) {
package/dist/esm/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { $ as format } from './index-CQXciux9.js';
2
- import './index-DQZfuGjI.js';
1
+ export { $ as format } from './index-B-VyHxJa.js';
2
+ import './index-mMpK8062.js';
@@ -1,5 +1,5 @@
1
- import { r as registerInstance, h, H as Host, a as getElement, c as getAssetPath, d as createEvent } from './index-DQZfuGjI.js';
2
- import { R as RiveService, s as setVisibilityWithDelay, i as initEventsForElement, c as convertUrlToRelative, p as parseProp, e as equationCheck, S as SelectedValuesKey, a as storingEachActivityScore, A as AudioPlayer, b as executeActions, d as calculateScore, t as triggerNextContainer, C as CalculatorOk, h as handlingChildElements, f as attachSpeakIcon, L as LIDO_INTERACTION_CLEANUP_EVENT, T as TemplateID, j as calculateScale, k as highlightElement, l as Timer, r as resetFloatState, m as handleFloatElementPosition, n as handleElementClick, o as commonjsGlobal, g as getDefaultExportFromCjs, q as generateUUIDFallback, u as ActivityScoreKey, v as dispatchActivityChangeEvent, G as GameScore, w as dispatchGameExitEvent, x as speakUrl, y as nextUrl, z as prevUrl, B as exitUrl, N as NextContainerKey, P as PrevContainerKey, D as LIDO_COMMON_AUDIO_PATH, E as LidoContainer$1, F as getCancelBtnPopup, H as matchStringPattern, I as triggerPrevcontainer, J as setActiveZipAssets, K as clearActiveZipAssets, M as setCancelBtnPopup, O as tinycolor, Q as stopHighlightForSpeakingElement, U as DropAction, V as validateObjectiveStatus, W as fraction, X as LIDO_COMMON_AUDIO_READY_EVENT, Y as TraceMode, Z as speakIcon, _ as fingerUrl } from './index-CQXciux9.js';
1
+ import { r as registerInstance, h, H as Host, a as getElement, c as getAssetPath, d as createEvent } from './index-mMpK8062.js';
2
+ import { R as RiveService, s as setVisibilityWithDelay, i as initEventsForElement, c as convertUrlToRelative, p as parseProp, e as equationCheck, S as SelectedValuesKey, a as storingEachActivityScore, A as AudioPlayer, b as executeActions, d as calculateScore, t as triggerNextContainer, C as CalculatorOk, h as handlingChildElements, f as attachSpeakIcon, L as LIDO_INTERACTION_CLEANUP_EVENT, T as TemplateID, j as calculateScale, k as highlightElement, l as Timer, r as resetFloatState, m as handleFloatElementPosition, n as handleElementClick, o as commonjsGlobal, g as getDefaultExportFromCjs, q as generateUUIDFallback, u as ActivityScoreKey, v as dispatchActivityChangeEvent, G as GameScore, w as dispatchGameExitEvent, x as speakUrl, y as nextUrl, z as prevUrl, B as exitUrl, N as NextContainerKey, P as PrevContainerKey, D as LIDO_COMMON_AUDIO_PATH, E as LidoContainer$1, F as getCancelBtnPopup, H as matchStringPattern, I as triggerPrevcontainer, J as setActiveZipAssets, K as clearActiveZipAssets, M as setCancelBtnPopup, O as tinycolor, Q as stopHighlightForSpeakingElement, U as DropAction, V as validateObjectiveStatus, W as fraction, X as LIDO_COMMON_AUDIO_READY_EVENT, Y as TraceMode, Z as speakIcon, _ as fingerUrl } from './index-B-VyHxJa.js';
3
3
 
4
4
  var rive$1 = {exports: {}};
5
5
 
@@ -12952,7 +12952,7 @@ const LidoHome = class {
12952
12952
  }
12953
12953
  // Pure-JS fallback (no wasm asset required)
12954
12954
  try {
12955
- const brotliDecodeModule = await import('./decode-Buyq-Iy5.js').then(function (n) { return n.d; });
12955
+ const brotliDecodeModule = await import('./decode-B_VrYFdJ.js').then(function (n) { return n.d; });
12956
12956
  const brotliDecompressBuffer = brotliDecodeModule.BrotliDecompressBuffer || ((_a = brotliDecodeModule.default) === null || _a === void 0 ? void 0 : _a.BrotliDecompressBuffer);
12957
12957
  if (typeof brotliDecompressBuffer !== 'function') {
12958
12958
  throw new Error('BrotliDecompressBuffer function not found in brotli/dec/decode');
@@ -18179,6 +18179,7 @@ const LidoTrace = class {
18179
18179
  this.fileIndex = -1;
18180
18180
  this.isDragging = false;
18181
18181
  this.activePointerId = null;
18182
+ this.activeTraceState = null;
18182
18183
  // Counter for throttling free trace updates
18183
18184
  // This is only an internal counter. Keeping it out of @State prevents a
18184
18185
  // Stencil component re-render while the user is dragging.
@@ -18193,6 +18194,7 @@ const LidoTrace = class {
18193
18194
  // Handle the pointermove event with optimizations
18194
18195
  // Update the path trace as the red circle moves
18195
18196
  async initializeSVG() {
18197
+ this.cleanupTraceState(this.activeTraceState);
18196
18198
  let state = {
18197
18199
  fileIndex: -1,
18198
18200
  currentPathIndex: 0,
@@ -18215,7 +18217,10 @@ const LidoTrace = class {
18215
18217
  dragOffset: null,
18216
18218
  isCompletingPath: false,
18217
18219
  touchProximityThreshold: null,
18220
+ pointerTransform: null,
18221
+ pointerRect: null,
18218
18222
  };
18223
+ this.activeTraceState = state;
18219
18224
  const url = this.svgUrls[this.currentSvgIndex];
18220
18225
  if (!url || url.trim() === '') {
18221
18226
  console.error('No SVG URL provided or index out of bounds.');
@@ -18242,6 +18247,27 @@ const LidoTrace = class {
18242
18247
  disconnectedCallback() {
18243
18248
  window.removeEventListener('resize', this.handleWindowResize);
18244
18249
  window.removeEventListener('load', this.handleWindowLoad);
18250
+ this.cleanupTraceState(this.activeTraceState);
18251
+ this.activeTraceState = null;
18252
+ }
18253
+ /** Release listeners, pending frames, timers, and cached SVG geometry. */
18254
+ cleanupTraceState(state) {
18255
+ var _a;
18256
+ if (!state)
18257
+ return;
18258
+ (_a = state.cleanup) === null || _a === void 0 ? void 0 : _a.call(state);
18259
+ if (state.rafId)
18260
+ cancelAnimationFrame(state.rafId);
18261
+ state.rafId = null;
18262
+ state.pointerMoveEvent = null;
18263
+ state.pathSamples = [];
18264
+ state.paths = [];
18265
+ state.svg = null;
18266
+ if (this.idleTimer !== null) {
18267
+ clearTimeout(this.idleTimer);
18268
+ this.idleTimer = null;
18269
+ }
18270
+ this.hideFingerHint();
18245
18271
  }
18246
18272
  /** ───────────────────────────────────────────────────────────
18247
18273
  * Idle‑timer helpers
@@ -18440,6 +18466,18 @@ const LidoTrace = class {
18440
18466
  path._lidoTraceStart = path.getPointAtLength(0);
18441
18467
  path._lidoTraceEnd = path.getPointAtLength(pathLength);
18442
18468
  path._lidoTraceIsClosed = this.getDistanceSquared(path._lidoTraceStart, path._lidoTraceEnd) < 200;
18469
+ // Index the path once. Repeated getPointAtLength calls are expensive on
18470
+ // low-end SVG implementations and used to dominate every pointer frame.
18471
+ const sampleCount = 192;
18472
+ const sampleStep = pathLength / sampleCount || 1;
18473
+ const samples = [];
18474
+ for (let sampleIndex = 0; sampleIndex <= sampleCount; sampleIndex++) {
18475
+ const length = Math.min(pathLength, sampleIndex * sampleStep);
18476
+ const point = path.getPointAtLength(length);
18477
+ samples.push({ x: point.x, y: point.y, length });
18478
+ }
18479
+ path._lidoTraceSamples = samples;
18480
+ path._lidoTraceSampleStep = sampleStep;
18443
18481
  // /** give every path an id so <mpath> can follow it */
18444
18482
  path.setAttribute('id', 'lido-path-' + index); // ← NEW
18445
18483
  // Create green path for tracing effect
@@ -18474,7 +18512,7 @@ const LidoTrace = class {
18474
18512
  state.flowMarkers = this.createFlowMarkersForPath(path);
18475
18513
  }
18476
18514
  });
18477
- state.totalPathLength = state.paths[state.currentPathIndex].getTotalLength();
18515
+ state.totalPathLength = state.paths[state.currentPathIndex]._lidoTraceLength;
18478
18516
  }
18479
18517
  // Set up the draggable circle at the start of the first path
18480
18518
  setupDraggableCircle(state) {
@@ -18499,10 +18537,14 @@ const LidoTrace = class {
18499
18537
  return;
18500
18538
  state.svg.style.touchAction = 'none';
18501
18539
  state.circle.style.touchAction = 'none';
18502
- // Handle pointerdown on the circle to start dragging
18503
- state.circle.addEventListener('pointerdown', (evt) => {
18540
+ // Keep named handlers so the detached SVG can be fully released when the
18541
+ // next trace starts. Anonymous handlers here previously retained every
18542
+ // completed trace for the lifetime of the page.
18543
+ const onPointerDown = (evt) => {
18504
18544
  evt.preventDefault(); // Prevent default actions like text selection
18505
- const pointerPos = this.getPointerPosition(evt, state.svg);
18545
+ state.pointerRect = state.svg.getBoundingClientRect();
18546
+ state.pointerTransform = this.getSvgViewBoxTransform(state.svg, state.pointerRect);
18547
+ const pointerPos = this.getPointerPosition(evt, state.svg, state.pointerTransform, state.pointerRect);
18506
18548
  const circlePos = {
18507
18549
  x: parseFloat(state.circle.getAttribute('cx')),
18508
18550
  y: parseFloat(state.circle.getAttribute('cy')),
@@ -18527,9 +18569,9 @@ const LidoTrace = class {
18527
18569
  }
18528
18570
  this.hideFingerHint(); // ← NEW
18529
18571
  this.resetIdleTimer(state); // ← NEW
18530
- }, { passive: false });
18572
+ };
18531
18573
  // Handle pointermove on the SVG to update the circle position
18532
- (_a = state.svg) === null || _a === void 0 ? void 0 : _a.addEventListener('pointermove', (evt) => {
18574
+ const onPointerMove = (evt) => {
18533
18575
  if (!state.isDragging || evt.pointerId !== state.activePointerId)
18534
18576
  return;
18535
18577
  evt.preventDefault();
@@ -18540,7 +18582,7 @@ const LidoTrace = class {
18540
18582
  state.rafId = null;
18541
18583
  });
18542
18584
  }
18543
- });
18585
+ };
18544
18586
  // Handle pointerup and pointercancel on the SVG to stop dragging
18545
18587
  const endDrag = (evt) => {
18546
18588
  if (evt.pointerId === state.activePointerId) {
@@ -18552,12 +18594,25 @@ const LidoTrace = class {
18552
18594
  this.resetIdleTimer(state); // ← NEW
18553
18595
  }
18554
18596
  };
18555
- (_b = state.svg) === null || _b === void 0 ? void 0 : _b.addEventListener('pointerup', endDrag);
18556
- (_c = state.svg) === null || _c === void 0 ? void 0 : _c.addEventListener('pointercancel', endDrag);
18597
+ (_a = state.svg) === null || _a === void 0 ? void 0 : _a.addEventListener('pointerup', endDrag);
18598
+ (_b = state.svg) === null || _b === void 0 ? void 0 : _b.addEventListener('pointercancel', endDrag);
18557
18599
  // Optional: Prevent context menu on long press
18558
- (_d = state.svg) === null || _d === void 0 ? void 0 : _d.addEventListener('contextmenu', (evt) => {
18600
+ const onContextMenu = (evt) => {
18559
18601
  evt.preventDefault();
18560
- });
18602
+ };
18603
+ state.circle.addEventListener('pointerdown', onPointerDown, { passive: false });
18604
+ (_c = state.svg) === null || _c === void 0 ? void 0 : _c.addEventListener('pointermove', onPointerMove);
18605
+ (_d = state.svg) === null || _d === void 0 ? void 0 : _d.addEventListener('contextmenu', onContextMenu);
18606
+ state.cleanup = () => {
18607
+ var _a, _b, _c, _d, _e;
18608
+ (_a = state.circle) === null || _a === void 0 ? void 0 : _a.removeEventListener('pointerdown', onPointerDown);
18609
+ (_b = state.svg) === null || _b === void 0 ? void 0 : _b.removeEventListener('pointermove', onPointerMove);
18610
+ (_c = state.svg) === null || _c === void 0 ? void 0 : _c.removeEventListener('pointerup', endDrag);
18611
+ (_d = state.svg) === null || _d === void 0 ? void 0 : _d.removeEventListener('pointercancel', endDrag);
18612
+ (_e = state.svg) === null || _e === void 0 ? void 0 : _e.removeEventListener('contextmenu', onContextMenu);
18613
+ state.isDragging = false;
18614
+ state.activePointerId = null;
18615
+ };
18561
18616
  }
18562
18617
  // Modified handlePointerMove function
18563
18618
  async handlePointerMove(state) {
@@ -18570,7 +18625,7 @@ const LidoTrace = class {
18570
18625
  return;
18571
18626
  this.hideFingerHint(); // user is active, remove hint
18572
18627
  const evt = state.pointerMoveEvent;
18573
- const rawPointerPos = this.getPointerPosition(evt, state.svg);
18628
+ const rawPointerPos = this.getPointerPosition(evt, state.svg, state.pointerTransform, state.pointerRect);
18574
18629
  const pointerPos = state.dragOffset
18575
18630
  ? {
18576
18631
  x: rawPointerPos.x - state.dragOffset.x,
@@ -18834,9 +18889,9 @@ const LidoTrace = class {
18834
18889
  triggerNextContainer();
18835
18890
  }
18836
18891
  // Get the pointer position relative to the SVG
18837
- getPointerPosition(evt, svg) {
18892
+ getPointerPosition(evt, svg, cachedTransform, cachedRect) {
18838
18893
  var _a;
18839
- const viewBoxPoint = this.getPointerPositionFromViewBox(evt, svg);
18894
+ const viewBoxPoint = this.getPointerPositionFromViewBox(evt, svg, cachedTransform, cachedRect);
18840
18895
  if (viewBoxPoint)
18841
18896
  return viewBoxPoint;
18842
18897
  const svgPoint = svg.createSVGPoint();
@@ -18845,13 +18900,13 @@ const LidoTrace = class {
18845
18900
  const ctm = (_a = svg.getScreenCTM()) === null || _a === void 0 ? void 0 : _a.inverse();
18846
18901
  return ctm ? svgPoint.matrixTransform(ctm) : { x: evt.clientX, y: evt.clientY };
18847
18902
  }
18848
- getPointerPositionFromViewBox(evt, svg) {
18849
- const rect = svg.getBoundingClientRect();
18903
+ getPointerPositionFromViewBox(evt, svg, cachedTransform, cachedRect) {
18904
+ const rect = cachedRect || svg.getBoundingClientRect();
18850
18905
  const viewBox = svg.viewBox.baseVal;
18851
18906
  if (!rect.width || !rect.height || !viewBox.width || !viewBox.height) {
18852
18907
  return null;
18853
18908
  }
18854
- const { offsetX, offsetY, scaleX, scaleY } = this.getSvgViewBoxTransform(svg, rect);
18909
+ const { offsetX, offsetY, scaleX, scaleY } = cachedTransform || this.getSvgViewBoxTransform(svg, rect);
18855
18910
  return {
18856
18911
  x: viewBox.x + (evt.clientX - rect.left - offsetX) / scaleX,
18857
18912
  y: viewBox.y + (evt.clientY - rect.top - offsetY) / scaleY,
@@ -18911,6 +18966,40 @@ const LidoTrace = class {
18911
18966
  getClosestPointOnPath(pathNode, point, lastLength) {
18912
18967
  var _a;
18913
18968
  const pathLength = (_a = pathNode._lidoTraceLength) !== null && _a !== void 0 ? _a : pathNode.getTotalLength();
18969
+ const samples = pathNode._lidoTraceSamples;
18970
+ const sampleStep = pathNode._lidoTraceSampleStep;
18971
+ if ((samples === null || samples === void 0 ? void 0 : samples.length) && sampleStep) {
18972
+ const searchWindow = lastLength === undefined ? pathLength : 150;
18973
+ const searchStart = lastLength === undefined ? 0 : Math.max(0, lastLength - searchWindow);
18974
+ const searchEnd = lastLength === undefined ? pathLength : Math.min(pathLength, lastLength + searchWindow);
18975
+ let nearest = samples[Math.max(0, Math.min(samples.length - 1, Math.round((lastLength || 0) / sampleStep)))];
18976
+ let nearestDistance = Infinity;
18977
+ for (const sample of samples) {
18978
+ if (sample.length < searchStart || sample.length > searchEnd)
18979
+ continue;
18980
+ const distance = this.getDistanceSquared(point, sample);
18981
+ if (distance < nearestDistance) {
18982
+ nearestDistance = distance;
18983
+ nearest = sample;
18984
+ }
18985
+ }
18986
+ // Refine only around the cached winner. This keeps the path accurate
18987
+ // while reducing hot-path geometry calls from roughly 50 to a handful.
18988
+ const refinementStep = 6;
18989
+ const refineStart = Math.max(searchStart, nearest.length - sampleStep);
18990
+ const refineEnd = Math.min(searchEnd, nearest.length + sampleStep);
18991
+ let closestPoint = Object.assign({}, nearest);
18992
+ let minDistanceSquared = nearestDistance;
18993
+ for (let length = refineStart; length <= refineEnd; length += refinementStep) {
18994
+ const candidate = pathNode.getPointAtLength(length);
18995
+ const distance = this.getDistanceSquared(point, candidate);
18996
+ if (distance < minDistanceSquared) {
18997
+ minDistanceSquared = distance;
18998
+ closestPoint = { x: candidate.x, y: candidate.y, length };
18999
+ }
19000
+ }
19001
+ return closestPoint;
19002
+ }
18914
19003
  let closestPoint = { x: 0, y: 0, length: 0 };
18915
19004
  let minDistanceSquared = Infinity;
18916
19005
  const coarseStep = 40;
@@ -19103,7 +19192,7 @@ const LidoTrace = class {
19103
19192
  };
19104
19193
  }
19105
19194
  render() {
19106
- return (h(Host, { key: '2f62ab117a595ba9af7f926ad7240902caf7fd99', class: "lido-trace", id: this.id, audio: this.audio, onCorrect: this.onCorrect, onInCorrect: this.onInCorrect, style: this.style, "aria-label": this.ariaLabel, "aria-hidden": this.ariaHidden, tabindex: this.tabIndex, "disable-speak": this.disableSpeak }, h("div", { key: '5a14b9bc1ff4d71ffc740c8afaa1d07754044a9d', style: this.style, id: "lido-svgContainer" })));
19195
+ return (h(Host, { key: 'f4c270d9319e1115d966a6d9b697a4413ca87885', class: "lido-trace", id: this.id, audio: this.audio, onCorrect: this.onCorrect, onInCorrect: this.onInCorrect, style: this.style, "aria-label": this.ariaLabel, "aria-hidden": this.ariaHidden, tabindex: this.tabIndex, "disable-speak": this.disableSpeak }, h("div", { key: 'efbbaf5c796c9cfe8516fe5d47265e3a01b28a25', style: this.style, id: "lido-svgContainer" })));
19107
19196
  }
19108
19197
  static get assetsDirs() { return ["assets"]; }
19109
19198
  get el() { return getElement(this); }
@@ -1,8 +1,8 @@
1
- import { p as promiseResolve, g as globalScripts, b as bootstrapLazy } from './index-DQZfuGjI.js';
2
- export { s as setNonce } from './index-DQZfuGjI.js';
1
+ import { p as promiseResolve, g as globalScripts, b as bootstrapLazy } from './index-mMpK8062.js';
2
+ export { s as setNonce } from './index-mMpK8062.js';
3
3
 
4
4
  /*
5
- Stencil Client Patch Browser v4.45.1 | MIT Licensed | https://stenciljs.com
5
+ Stencil Client Patch Browser v4.43.5 | MIT Licensed | https://stenciljs.com
6
6
  */
7
7
 
8
8
  var patchBrowser = () => {
@@ -1,5 +1,5 @@
1
- import { g as globalScripts, b as bootstrapLazy } from './index-DQZfuGjI.js';
2
- export { s as setNonce } from './index-DQZfuGjI.js';
1
+ import { g as globalScripts, b as bootstrapLazy } from './index-mMpK8062.js';
2
+ export { s as setNonce } from './index-mMpK8062.js';
3
3
 
4
4
  const defineCustomElements = async (win, options) => {
5
5
  if (typeof window === 'undefined') return undefined;
@@ -1 +1 @@
1
- export{$ as format}from"./p-3Ry570XH.js";import"./p-DQZfuGjI.js";
1
+ export{$ as format}from"./p-BK926Rl3.js";import"./p-mMpK8062.js";