hyperframes 0.8.27 → 0.8.29

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.
@@ -1520,7 +1520,18 @@
1520
1520
  const parts = elements.map((element) => {
1521
1521
  const rect = toRect(element.getBoundingClientRect());
1522
1522
  const opacity = round(opacityChain(element));
1523
- return `${rect.left},${rect.top},${rect.width},${rect.height},${opacity}`;
1523
+ // Variable-font axis animation (font-variation-settings) is a real,
1524
+ // visible motion channel that moves no geometry and no opacity, so a
1525
+ // box+opacity fingerprint reads it as a frozen timeline. Worse in a
1526
+ // DUPLEXED face (Recursive holds an identical advance width at every
1527
+ // weight by design), where not even the line width shifts — the whole
1528
+ // run then false-positives sweep_static. Fold the computed axis string
1529
+ // in; it is "normal" for every element that does not use it, so this
1530
+ // adds nothing to the fingerprint of an ordinary composition.
1531
+ const axes = getComputedStyle(element).fontVariationSettings;
1532
+ return `${rect.left},${rect.top},${rect.width},${rect.height},${opacity},${
1533
+ axes && axes !== "normal" ? axes : ""
1534
+ }`;
1524
1535
  });
1525
1536
  for (const media of root.querySelectorAll("canvas, video")) {
1526
1537
  if (!isVisibleElement(media)) continue;