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/bunnyquery.js +68 -170
- package/dist/engine.cjs +49 -132
- package/dist/engine.cjs.map +1 -1
- package/dist/engine.d.mts +42 -60
- package/dist/engine.d.ts +42 -60
- package/dist/engine.mjs +49 -132
- package/dist/engine.mjs.map +1 -1
- package/package.json +1 -1
- package/src/engine/image_preview.ts +0 -0
- package/src/engine/scroll_anchor.ts +171 -356
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)
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
2696
|
-
|
|
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, {
|
|
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
|
-
|
|
2730
|
-
|
|
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
|
};
|