bunnyquery 1.8.15 → 1.8.16

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.
package/dist/engine.d.mts CHANGED
@@ -1961,6 +1961,17 @@ interface ScrollAnchor {
1961
1961
  settleReturn: () => boolean;
1962
1962
  /** A return is armed: its position, not the host's, decides scrollTop. */
1963
1963
  isReturning: () => boolean;
1964
+ /**
1965
+ * The reader is driving. Retire any armed return, at once.
1966
+ *
1967
+ * Call from the raw gesture handlers (wheel, touchstart, touchmove, keydown),
1968
+ * which fire synchronously on a real user action and never for a programmatic
1969
+ * scroll. Waiting for the scroll EVENT is not good enough: a background refresh
1970
+ * can settle in between, and a settle with a return still armed puts the reader
1971
+ * back where they were before they left, which lands as "I touched the scroll
1972
+ * and it threw me somewhere else".
1973
+ */
1974
+ release: () => void;
1964
1975
  /** Pin to the bottom, instantly, recording the write. The ONLY way to pin. */
1965
1976
  pinBottom: () => void;
1966
1977
  /** The box is not being painted (hidden tab). Shared so hosts agree. */
package/dist/engine.d.ts CHANGED
@@ -1961,6 +1961,17 @@ interface ScrollAnchor {
1961
1961
  settleReturn: () => boolean;
1962
1962
  /** A return is armed: its position, not the host's, decides scrollTop. */
1963
1963
  isReturning: () => boolean;
1964
+ /**
1965
+ * The reader is driving. Retire any armed return, at once.
1966
+ *
1967
+ * Call from the raw gesture handlers (wheel, touchstart, touchmove, keydown),
1968
+ * which fire synchronously on a real user action and never for a programmatic
1969
+ * scroll. Waiting for the scroll EVENT is not good enough: a background refresh
1970
+ * can settle in between, and a settle with a return still armed puts the reader
1971
+ * back where they were before they left, which lands as "I touched the scroll
1972
+ * and it threw me somewhere else".
1973
+ */
1974
+ release: () => void;
1964
1975
  /** Pin to the bottom, instantly, recording the write. The ONLY way to pin. */
1965
1976
  pinBottom: () => void;
1966
1977
  /** The box is not being painted (hidden tab). Shared so hosts agree. */
package/dist/engine.mjs CHANGED
@@ -2580,6 +2580,7 @@ var ROW_KEY_ATTR = "data-row-key";
2580
2580
  var ROW_POS_ATTR = "data-row-pos";
2581
2581
  var MAX_ALTS = 2;
2582
2582
  var ALT_SCAN_LIMIT = 64;
2583
+ var MAX_RETURN_SETTLES = 3;
2583
2584
  var UNKNOWN_ROW_POS = "\0?";
2584
2585
  function createScrollAnchor(options) {
2585
2586
  var held = null;
@@ -2667,6 +2668,7 @@ function createScrollAnchor(options) {
2667
2668
  var parked = null;
2668
2669
  var parkedStuck = false;
2669
2670
  var returning = false;
2671
+ var returnBudget = 0;
2670
2672
  var wroteTop = -1;
2671
2673
  var restoreExact = true;
2672
2674
  var restorePinned = false;
@@ -2762,17 +2764,13 @@ function createScrollAnchor(options) {
2762
2764
  }
2763
2765
  function remember() {
2764
2766
  var b0 = options.getBox();
2765
- if (returning && b0 && b0.scrollTop !== wroteTop) {
2766
- parked = null;
2767
- parkedStuck = false;
2768
- returning = false;
2769
- }
2767
+ if (returning && b0 && b0.scrollTop !== wroteTop) release();
2770
2768
  if (frozen()) return;
2771
2769
  held = capture();
2772
2770
  }
2773
2771
  function hold() {
2774
2772
  if (frozen()) return;
2775
- if (sawFrozen || returning) {
2773
+ if (sawFrozen) {
2776
2774
  settleReturn();
2777
2775
  return;
2778
2776
  }
@@ -2815,6 +2813,13 @@ function createScrollAnchor(options) {
2815
2813
  parked = capture();
2816
2814
  parkedStuck = !!options.isStuck();
2817
2815
  returning = true;
2816
+ returnBudget = MAX_RETURN_SETTLES;
2817
+ }
2818
+ function release() {
2819
+ parked = null;
2820
+ parkedStuck = false;
2821
+ returning = false;
2822
+ returnBudget = 0;
2818
2823
  }
2819
2824
  function pinBottom() {
2820
2825
  var box = options.getBox();
@@ -2824,7 +2829,16 @@ function createScrollAnchor(options) {
2824
2829
  }
2825
2830
  function settleReturn() {
2826
2831
  if (frozen()) return false;
2832
+ var wasFrozen = sawFrozen;
2827
2833
  sawFrozen = false;
2834
+ if (!returning && !wasFrozen) return false;
2835
+ if (returning) {
2836
+ if (returnBudget <= 0) {
2837
+ release();
2838
+ return false;
2839
+ }
2840
+ returnBudget--;
2841
+ }
2828
2842
  if (parkedStuck) {
2829
2843
  pinBottom();
2830
2844
  return true;
@@ -2834,7 +2848,12 @@ function createScrollAnchor(options) {
2834
2848
  restorePinned = false;
2835
2849
  restore(target, true);
2836
2850
  parked = !restorePinned || !restoreExact ? target : null;
2837
- returning = !!parked;
2851
+ returning = !!parked && returnBudget > 0;
2852
+ if (!returning) {
2853
+ parked = null;
2854
+ parkedStuck = false;
2855
+ returnBudget = 0;
2856
+ }
2838
2857
  return false;
2839
2858
  }
2840
2859
  function isReturning() {
@@ -2860,9 +2879,7 @@ function createScrollAnchor(options) {
2860
2879
  }
2861
2880
  function forget() {
2862
2881
  held = null;
2863
- parked = null;
2864
- parkedStuck = false;
2865
- returning = false;
2882
+ release();
2866
2883
  }
2867
2884
  return {
2868
2885
  capture,
@@ -2873,6 +2890,7 @@ function createScrollAnchor(options) {
2873
2890
  park,
2874
2891
  settleReturn,
2875
2892
  isReturning,
2893
+ release,
2876
2894
  pinBottom,
2877
2895
  isFrozen: frozen,
2878
2896
  thaw,