bunnyquery 1.8.16 → 1.8.18

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.cjs CHANGED
@@ -2582,7 +2582,6 @@ var ROW_KEY_ATTR = "data-row-key";
2582
2582
  var ROW_POS_ATTR = "data-row-pos";
2583
2583
  var MAX_ALTS = 2;
2584
2584
  var ALT_SCAN_LIMIT = 64;
2585
- var MAX_RETURN_SETTLES = 3;
2586
2585
  var UNKNOWN_ROW_POS = "\0?";
2587
2586
  function createScrollAnchor(options) {
2588
2587
  var held = null;
@@ -2594,13 +2593,24 @@ function createScrollAnchor(options) {
2594
2593
  var kids = box.children;
2595
2594
  var fallback = null;
2596
2595
  var fallbackAt = -1;
2596
+ var behind = [];
2597
2597
  for (var i = 0; i < kids.length; i++) {
2598
2598
  var el = kids[i];
2599
2599
  if (!el || typeof el.getAttribute !== "function") continue;
2600
2600
  var key = el.getAttribute(ROW_KEY_ATTR);
2601
2601
  if (!key) continue;
2602
2602
  var top = el.getBoundingClientRect().top - boxTop;
2603
- if (top + el.offsetHeight <= 0) continue;
2603
+ if (top + el.offsetHeight <= 0) {
2604
+ var bpos = el.getAttribute(ROW_POS_ATTR);
2605
+ behind.push({
2606
+ key,
2607
+ top,
2608
+ pos: bpos === null ? null : bpos || UNKNOWN_ROW_POS,
2609
+ el
2610
+ });
2611
+ if (behind.length > MAX_ALTS) behind.shift();
2612
+ continue;
2613
+ }
2604
2614
  if (top >= box.clientHeight) break;
2605
2615
  var rawPos = el.getAttribute(ROW_POS_ATTR);
2606
2616
  var pos = rawPos === null ? null : rawPos || UNKNOWN_ROW_POS;
@@ -2613,7 +2623,7 @@ function createScrollAnchor(options) {
2613
2623
  el
2614
2624
  };
2615
2625
  if (rawPos === null) {
2616
- cand.alts = collectAlts(box, boxTop, i + 1);
2626
+ cand.alts = withBehind(collectAlts(box, boxTop, i + 1), behind);
2617
2627
  return cand;
2618
2628
  }
2619
2629
  if (!fallback) {
@@ -2622,7 +2632,10 @@ function createScrollAnchor(options) {
2622
2632
  }
2623
2633
  }
2624
2634
  if (fallback) {
2625
- fallback.alts = collectAlts(box, boxTop, fallbackAt + 1, true);
2635
+ fallback.alts = withBehind(
2636
+ collectAlts(box, boxTop, fallbackAt + 1, true) || collectAlts(box, boxTop, fallbackAt + 1),
2637
+ behind
2638
+ );
2626
2639
  return fallback;
2627
2640
  }
2628
2641
  return {
@@ -2654,6 +2667,10 @@ function createScrollAnchor(options) {
2654
2667
  }
2655
2668
  return out.length ? out : void 0;
2656
2669
  }
2670
+ function withBehind(forward, behind) {
2671
+ var out = (forward || []).concat(behind.slice().reverse());
2672
+ return out.length ? out : void 0;
2673
+ }
2657
2674
  function findRow(box, anchor) {
2658
2675
  var el = anchor.el;
2659
2676
  if (el && el.parentNode === box) return el;
@@ -2666,21 +2683,7 @@ function createScrollAnchor(options) {
2666
2683
  }
2667
2684
  return null;
2668
2685
  }
2669
- var sawFrozen = false;
2670
- var parked = null;
2671
- var parkedStuck = false;
2672
- var returning = false;
2673
- var returnBudget = 0;
2674
- var wroteTop = -1;
2675
- var restoreExact = true;
2676
- var restorePinned = false;
2677
- function frozen() {
2678
- var f = !!options.isFrozen && options.isFrozen();
2679
- if (f) sawFrozen = true;
2680
- return f;
2681
- }
2682
- function restore(anchor, unbounded) {
2683
- if (frozen()) return;
2686
+ function restore(anchor) {
2684
2687
  var box = options.getBox();
2685
2688
  if (!box || !anchor || options.isStuck()) return;
2686
2689
  var el = findRow(box, anchor);
@@ -2692,32 +2695,36 @@ function createScrollAnchor(options) {
2692
2695
  var boxTop = box.getBoundingClientRect().top;
2693
2696
  var delta = el.getBoundingClientRect().top - boxTop - anchor.top;
2694
2697
  var slack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
2695
- if (!unbounded && (delta > slack || delta < -slack)) {
2696
- lost(box, anchor);
2698
+ var moved = delta - (anchor.scrollTop - box.scrollTop);
2699
+ if (moved > slack || moved < -slack) {
2700
+ el = null;
2701
+ } else {
2702
+ if (delta >= 1 || delta <= -1) box.scrollTop += delta;
2703
+ held = {
2704
+ key: anchor.key,
2705
+ top: anchor.top,
2706
+ pos: anchor.pos,
2707
+ scrollTop: box.scrollTop,
2708
+ scrollHeight: box.scrollHeight,
2709
+ el,
2710
+ // Carried, not dropped: one successful restore used to disarm the
2711
+ // standbys for every later hold.
2712
+ alts: anchor.alts
2713
+ };
2697
2714
  return;
2698
2715
  }
2699
- var want = box.scrollTop + delta;
2700
- if (delta >= 1 || delta <= -1) box.scrollTop += delta;
2701
- wroteTop = box.scrollTop;
2702
- restorePinned = true;
2703
- restoreExact = box.scrollTop >= want - 1 && box.scrollTop <= want + 1;
2704
- held = {
2705
- key: anchor.key,
2706
- top: anchor.top,
2707
- pos: anchor.pos,
2708
- scrollTop: box.scrollTop,
2709
- scrollHeight: box.scrollHeight,
2710
- el,
2711
- // Carried, not dropped: one successful restore used to disarm the
2712
- // standbys for every later hold.
2713
- alts: anchor.alts
2714
- };
2715
- return;
2716
2716
  }
2717
2717
  var alts = anchor.alts;
2718
2718
  for (var ai = 0; alts && ai < alts.length; ai++) {
2719
2719
  var alt = alts[ai];
2720
- var ael = findRow(box, { key: alt.key, top: alt.top, pos: alt.pos, scrollTop: anchor.scrollTop, scrollHeight: anchor.scrollHeight, el: alt.el });
2720
+ var ael = findRow(box, {
2721
+ key: alt.key,
2722
+ top: alt.top,
2723
+ pos: alt.pos,
2724
+ scrollTop: anchor.scrollTop,
2725
+ scrollHeight: anchor.scrollHeight,
2726
+ el: alt.el
2727
+ });
2721
2728
  if (!ael) continue;
2722
2729
  if (alt.pos !== null && alt.pos !== UNKNOWN_ROW_POS) {
2723
2730
  var altLive = ael.getAttribute(ROW_POS_ATTR) || UNKNOWN_ROW_POS;
@@ -2726,12 +2733,9 @@ function createScrollAnchor(options) {
2726
2733
  var aboxTop = box.getBoundingClientRect().top;
2727
2734
  var adelta = ael.getBoundingClientRect().top - aboxTop - alt.top;
2728
2735
  var aslack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
2729
- if (!unbounded && (adelta > aslack || adelta < -aslack)) continue;
2730
- var awant = box.scrollTop + adelta;
2736
+ var amoved = adelta - (anchor.scrollTop - box.scrollTop);
2737
+ if (amoved > aslack || amoved < -aslack) continue;
2731
2738
  if (adelta >= 1 || adelta <= -1) box.scrollTop += adelta;
2732
- wroteTop = box.scrollTop;
2733
- restorePinned = true;
2734
- restoreExact = box.scrollTop >= awant - 1 && box.scrollTop <= awant + 1;
2735
2739
  held = {
2736
2740
  key: alt.key,
2737
2741
  top: alt.top,
@@ -2750,13 +2754,9 @@ function createScrollAnchor(options) {
2750
2754
  var grew = box.scrollHeight - anchor.scrollHeight;
2751
2755
  if (grew > 0) {
2752
2756
  box.scrollTop = anchor.scrollTop + grew;
2753
- wroteTop = box.scrollTop;
2754
2757
  return;
2755
2758
  }
2756
- if (options.rawFallback) {
2757
- box.scrollTop = anchor.scrollTop;
2758
- wroteTop = box.scrollTop;
2759
- }
2759
+ if (options.rawFallback) box.scrollTop = anchor.scrollTop;
2760
2760
  }
2761
2761
  function preserve(mutate) {
2762
2762
  var anchor = capture();
@@ -2765,17 +2765,9 @@ function createScrollAnchor(options) {
2765
2765
  return result;
2766
2766
  }
2767
2767
  function remember() {
2768
- var b0 = options.getBox();
2769
- if (returning && b0 && b0.scrollTop !== wroteTop) release();
2770
- if (frozen()) return;
2771
2768
  held = capture();
2772
2769
  }
2773
2770
  function hold() {
2774
- if (frozen()) return;
2775
- if (sawFrozen) {
2776
- settleReturn();
2777
- return;
2778
- }
2779
2771
  var box = options.getBox();
2780
2772
  if (!box || options.isStuck()) {
2781
2773
  held = null;
@@ -2802,86 +2794,17 @@ function createScrollAnchor(options) {
2802
2794
  if (prev === void 0) prev = 0;
2803
2795
  var delta = h - prev;
2804
2796
  if (delta === 0) return;
2805
- if (frozen()) {
2806
- foldFrozenGrowth(box, el, delta);
2807
- return;
2808
- }
2809
2797
  if (el.getBoundingClientRect().top >= box.getBoundingClientRect().top) return;
2810
2798
  box.scrollTop += delta;
2811
- wroteTop = box.scrollTop;
2812
2799
  if (held) held = capture();
2813
2800
  }
2814
- function park() {
2815
- parked = capture();
2816
- parkedStuck = !!options.isStuck();
2817
- returning = true;
2818
- returnBudget = MAX_RETURN_SETTLES;
2819
- }
2820
- function release() {
2821
- parked = null;
2822
- parkedStuck = false;
2823
- returning = false;
2824
- returnBudget = 0;
2825
- }
2826
2801
  function pinBottom() {
2827
2802
  var box = options.getBox();
2828
2803
  if (!box) return;
2829
2804
  box.scrollTop = box.scrollHeight;
2830
- wroteTop = box.scrollTop;
2831
- }
2832
- function settleReturn() {
2833
- if (frozen()) return false;
2834
- var wasFrozen = sawFrozen;
2835
- sawFrozen = false;
2836
- if (!returning && !wasFrozen) return false;
2837
- if (returning) {
2838
- if (returnBudget <= 0) {
2839
- release();
2840
- return false;
2841
- }
2842
- returnBudget--;
2843
- }
2844
- if (parkedStuck) {
2845
- pinBottom();
2846
- return true;
2847
- }
2848
- var target = parked || held;
2849
- restoreExact = true;
2850
- restorePinned = false;
2851
- restore(target, true);
2852
- parked = !restorePinned || !restoreExact ? target : null;
2853
- returning = !!parked && returnBudget > 0;
2854
- if (!returning) {
2855
- parked = null;
2856
- parkedStuck = false;
2857
- returnBudget = 0;
2858
- }
2859
- return false;
2860
- }
2861
- function isReturning() {
2862
- return returning;
2863
- }
2864
- function thaw() {
2865
- settleReturn();
2866
- }
2867
- function foldFrozenGrowth(box, el, delta) {
2868
- var elTop = el.getBoundingClientRect().top;
2869
- foldInto(box, held, elTop, delta);
2870
- foldInto(box, parked, elTop, delta);
2871
- }
2872
- function foldInto(box, a, elTop, delta) {
2873
- if (!a || a.top >= 0) return;
2874
- var rowEl = findRow(box, a);
2875
- if (!rowEl) return;
2876
- var within = elTop - rowEl.getBoundingClientRect().top;
2877
- if (within < 0 || within >= rowEl.offsetHeight) return;
2878
- if (within >= -a.top) return;
2879
- a.top -= delta;
2880
- a.scrollHeight += delta;
2881
2805
  }
2882
2806
  function forget() {
2883
2807
  held = null;
2884
- release();
2885
2808
  }
2886
2809
  return {
2887
2810
  capture,
@@ -2889,13 +2812,7 @@ function createScrollAnchor(options) {
2889
2812
  preserve,
2890
2813
  remember,
2891
2814
  hold,
2892
- park,
2893
- settleReturn,
2894
- isReturning,
2895
- release,
2896
2815
  pinBottom,
2897
- isFrozen: frozen,
2898
- thaw,
2899
2816
  absorb,
2900
2817
  forget
2901
2818
  };