bunnyquery 1.8.15 → 1.8.17
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 +66 -139
- package/dist/engine.cjs +49 -114
- package/dist/engine.cjs.map +1 -1
- package/dist/engine.d.mts +42 -49
- package/dist/engine.d.ts +42 -49
- package/dist/engine.mjs +49 -114
- package/dist/engine.mjs.map +1 -1
- package/package.json +1 -1
- package/src/engine/scroll_anchor.ts +171 -318
package/bunnyquery.js
CHANGED
|
@@ -2451,13 +2451,24 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2451
2451
|
var kids = box.children;
|
|
2452
2452
|
var fallback = null;
|
|
2453
2453
|
var fallbackAt = -1;
|
|
2454
|
+
var behind = [];
|
|
2454
2455
|
for (var i = 0; i < kids.length; i++) {
|
|
2455
2456
|
var el = kids[i];
|
|
2456
2457
|
if (!el || typeof el.getAttribute !== "function") continue;
|
|
2457
2458
|
var key = el.getAttribute(ROW_KEY_ATTR);
|
|
2458
2459
|
if (!key) continue;
|
|
2459
2460
|
var top = el.getBoundingClientRect().top - boxTop;
|
|
2460
|
-
if (top + el.offsetHeight <= 0)
|
|
2461
|
+
if (top + el.offsetHeight <= 0) {
|
|
2462
|
+
var bpos = el.getAttribute(ROW_POS_ATTR);
|
|
2463
|
+
behind.push({
|
|
2464
|
+
key,
|
|
2465
|
+
top,
|
|
2466
|
+
pos: bpos === null ? null : bpos || UNKNOWN_ROW_POS,
|
|
2467
|
+
el
|
|
2468
|
+
});
|
|
2469
|
+
if (behind.length > MAX_ALTS) behind.shift();
|
|
2470
|
+
continue;
|
|
2471
|
+
}
|
|
2461
2472
|
if (top >= box.clientHeight) break;
|
|
2462
2473
|
var rawPos = el.getAttribute(ROW_POS_ATTR);
|
|
2463
2474
|
var pos = rawPos === null ? null : rawPos || UNKNOWN_ROW_POS;
|
|
@@ -2470,7 +2481,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2470
2481
|
el
|
|
2471
2482
|
};
|
|
2472
2483
|
if (rawPos === null) {
|
|
2473
|
-
cand.alts = collectAlts(box, boxTop, i + 1);
|
|
2484
|
+
cand.alts = withBehind(collectAlts(box, boxTop, i + 1), behind);
|
|
2474
2485
|
return cand;
|
|
2475
2486
|
}
|
|
2476
2487
|
if (!fallback) {
|
|
@@ -2479,7 +2490,10 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2479
2490
|
}
|
|
2480
2491
|
}
|
|
2481
2492
|
if (fallback) {
|
|
2482
|
-
fallback.alts =
|
|
2493
|
+
fallback.alts = withBehind(
|
|
2494
|
+
collectAlts(box, boxTop, fallbackAt + 1, true) || collectAlts(box, boxTop, fallbackAt + 1),
|
|
2495
|
+
behind
|
|
2496
|
+
);
|
|
2483
2497
|
return fallback;
|
|
2484
2498
|
}
|
|
2485
2499
|
return {
|
|
@@ -2511,6 +2525,10 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2511
2525
|
}
|
|
2512
2526
|
return out.length ? out : void 0;
|
|
2513
2527
|
}
|
|
2528
|
+
function withBehind(forward, behind) {
|
|
2529
|
+
var out = (forward || []).concat(behind.slice().reverse());
|
|
2530
|
+
return out.length ? out : void 0;
|
|
2531
|
+
}
|
|
2514
2532
|
function findRow(box, anchor) {
|
|
2515
2533
|
var el = anchor.el;
|
|
2516
2534
|
if (el && el.parentNode === box) return el;
|
|
@@ -2523,20 +2541,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2523
2541
|
}
|
|
2524
2542
|
return null;
|
|
2525
2543
|
}
|
|
2526
|
-
|
|
2527
|
-
var parked = null;
|
|
2528
|
-
var parkedStuck = false;
|
|
2529
|
-
var returning = false;
|
|
2530
|
-
var wroteTop = -1;
|
|
2531
|
-
var restoreExact = true;
|
|
2532
|
-
var restorePinned = false;
|
|
2533
|
-
function frozen() {
|
|
2534
|
-
var f = !!options.isFrozen && options.isFrozen();
|
|
2535
|
-
if (f) sawFrozen = true;
|
|
2536
|
-
return f;
|
|
2537
|
-
}
|
|
2538
|
-
function restore(anchor, unbounded) {
|
|
2539
|
-
if (frozen()) return;
|
|
2544
|
+
function restore(anchor) {
|
|
2540
2545
|
var box = options.getBox();
|
|
2541
2546
|
if (!box || !anchor || options.isStuck()) return;
|
|
2542
2547
|
var el = findRow(box, anchor);
|
|
@@ -2548,32 +2553,36 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2548
2553
|
var boxTop = box.getBoundingClientRect().top;
|
|
2549
2554
|
var delta = el.getBoundingClientRect().top - boxTop - anchor.top;
|
|
2550
2555
|
var slack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2551
|
-
|
|
2552
|
-
|
|
2556
|
+
var moved = delta - (anchor.scrollTop - box.scrollTop);
|
|
2557
|
+
if (moved > slack || moved < -slack) {
|
|
2558
|
+
el = null;
|
|
2559
|
+
} else {
|
|
2560
|
+
if (delta >= 1 || delta <= -1) box.scrollTop += delta;
|
|
2561
|
+
held = {
|
|
2562
|
+
key: anchor.key,
|
|
2563
|
+
top: anchor.top,
|
|
2564
|
+
pos: anchor.pos,
|
|
2565
|
+
scrollTop: box.scrollTop,
|
|
2566
|
+
scrollHeight: box.scrollHeight,
|
|
2567
|
+
el,
|
|
2568
|
+
// Carried, not dropped: one successful restore used to disarm the
|
|
2569
|
+
// standbys for every later hold.
|
|
2570
|
+
alts: anchor.alts
|
|
2571
|
+
};
|
|
2553
2572
|
return;
|
|
2554
2573
|
}
|
|
2555
|
-
var want = box.scrollTop + delta;
|
|
2556
|
-
if (delta >= 1 || delta <= -1) box.scrollTop += delta;
|
|
2557
|
-
wroteTop = box.scrollTop;
|
|
2558
|
-
restorePinned = true;
|
|
2559
|
-
restoreExact = box.scrollTop >= want - 1 && box.scrollTop <= want + 1;
|
|
2560
|
-
held = {
|
|
2561
|
-
key: anchor.key,
|
|
2562
|
-
top: anchor.top,
|
|
2563
|
-
pos: anchor.pos,
|
|
2564
|
-
scrollTop: box.scrollTop,
|
|
2565
|
-
scrollHeight: box.scrollHeight,
|
|
2566
|
-
el,
|
|
2567
|
-
// Carried, not dropped: one successful restore used to disarm the
|
|
2568
|
-
// standbys for every later hold.
|
|
2569
|
-
alts: anchor.alts
|
|
2570
|
-
};
|
|
2571
|
-
return;
|
|
2572
2574
|
}
|
|
2573
2575
|
var alts = anchor.alts;
|
|
2574
2576
|
for (var ai = 0; alts && ai < alts.length; ai++) {
|
|
2575
2577
|
var alt = alts[ai];
|
|
2576
|
-
var ael = findRow(box, {
|
|
2578
|
+
var ael = findRow(box, {
|
|
2579
|
+
key: alt.key,
|
|
2580
|
+
top: alt.top,
|
|
2581
|
+
pos: alt.pos,
|
|
2582
|
+
scrollTop: anchor.scrollTop,
|
|
2583
|
+
scrollHeight: anchor.scrollHeight,
|
|
2584
|
+
el: alt.el
|
|
2585
|
+
});
|
|
2577
2586
|
if (!ael) continue;
|
|
2578
2587
|
if (alt.pos !== null && alt.pos !== UNKNOWN_ROW_POS) {
|
|
2579
2588
|
var altLive = ael.getAttribute(ROW_POS_ATTR) || UNKNOWN_ROW_POS;
|
|
@@ -2582,12 +2591,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2582
2591
|
var aboxTop = box.getBoundingClientRect().top;
|
|
2583
2592
|
var adelta = ael.getBoundingClientRect().top - aboxTop - alt.top;
|
|
2584
2593
|
var aslack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2585
|
-
|
|
2586
|
-
|
|
2594
|
+
var amoved = adelta - (anchor.scrollTop - box.scrollTop);
|
|
2595
|
+
if (amoved > aslack || amoved < -aslack) continue;
|
|
2587
2596
|
if (adelta >= 1 || adelta <= -1) box.scrollTop += adelta;
|
|
2588
|
-
wroteTop = box.scrollTop;
|
|
2589
|
-
restorePinned = true;
|
|
2590
|
-
restoreExact = box.scrollTop >= awant - 1 && box.scrollTop <= awant + 1;
|
|
2591
2597
|
held = {
|
|
2592
2598
|
key: alt.key,
|
|
2593
2599
|
top: alt.top,
|
|
@@ -2606,13 +2612,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2606
2612
|
var grew = box.scrollHeight - anchor.scrollHeight;
|
|
2607
2613
|
if (grew > 0) {
|
|
2608
2614
|
box.scrollTop = anchor.scrollTop + grew;
|
|
2609
|
-
wroteTop = box.scrollTop;
|
|
2610
2615
|
return;
|
|
2611
2616
|
}
|
|
2612
|
-
if (options.rawFallback)
|
|
2613
|
-
box.scrollTop = anchor.scrollTop;
|
|
2614
|
-
wroteTop = box.scrollTop;
|
|
2615
|
-
}
|
|
2617
|
+
if (options.rawFallback) box.scrollTop = anchor.scrollTop;
|
|
2616
2618
|
}
|
|
2617
2619
|
function preserve(mutate) {
|
|
2618
2620
|
var anchor = capture();
|
|
@@ -2621,21 +2623,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2621
2623
|
return result;
|
|
2622
2624
|
}
|
|
2623
2625
|
function remember() {
|
|
2624
|
-
var b0 = options.getBox();
|
|
2625
|
-
if (returning && b0 && b0.scrollTop !== wroteTop) {
|
|
2626
|
-
parked = null;
|
|
2627
|
-
parkedStuck = false;
|
|
2628
|
-
returning = false;
|
|
2629
|
-
}
|
|
2630
|
-
if (frozen()) return;
|
|
2631
2626
|
held = capture();
|
|
2632
2627
|
}
|
|
2633
2628
|
function hold() {
|
|
2634
|
-
if (frozen()) return;
|
|
2635
|
-
if (sawFrozen || returning) {
|
|
2636
|
-
settleReturn();
|
|
2637
|
-
return;
|
|
2638
|
-
}
|
|
2639
2629
|
var box = options.getBox();
|
|
2640
2630
|
if (!box || options.isStuck()) {
|
|
2641
2631
|
held = null;
|
|
@@ -2662,67 +2652,17 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2662
2652
|
if (prev === void 0) prev = 0;
|
|
2663
2653
|
var delta = h - prev;
|
|
2664
2654
|
if (delta === 0) return;
|
|
2665
|
-
if (frozen()) {
|
|
2666
|
-
foldFrozenGrowth(box, el, delta);
|
|
2667
|
-
return;
|
|
2668
|
-
}
|
|
2669
2655
|
if (el.getBoundingClientRect().top >= box.getBoundingClientRect().top) return;
|
|
2670
2656
|
box.scrollTop += delta;
|
|
2671
|
-
wroteTop = box.scrollTop;
|
|
2672
2657
|
if (held) held = capture();
|
|
2673
2658
|
}
|
|
2674
|
-
function park() {
|
|
2675
|
-
parked = capture();
|
|
2676
|
-
parkedStuck = !!options.isStuck();
|
|
2677
|
-
returning = true;
|
|
2678
|
-
}
|
|
2679
2659
|
function pinBottom() {
|
|
2680
2660
|
var box = options.getBox();
|
|
2681
2661
|
if (!box) return;
|
|
2682
2662
|
box.scrollTop = box.scrollHeight;
|
|
2683
|
-
wroteTop = box.scrollTop;
|
|
2684
|
-
}
|
|
2685
|
-
function settleReturn() {
|
|
2686
|
-
if (frozen()) return false;
|
|
2687
|
-
sawFrozen = false;
|
|
2688
|
-
if (parkedStuck) {
|
|
2689
|
-
pinBottom();
|
|
2690
|
-
return true;
|
|
2691
|
-
}
|
|
2692
|
-
var target = parked || held;
|
|
2693
|
-
restoreExact = true;
|
|
2694
|
-
restorePinned = false;
|
|
2695
|
-
restore(target, true);
|
|
2696
|
-
parked = !restorePinned || !restoreExact ? target : null;
|
|
2697
|
-
returning = !!parked;
|
|
2698
|
-
return false;
|
|
2699
|
-
}
|
|
2700
|
-
function isReturning() {
|
|
2701
|
-
return returning;
|
|
2702
|
-
}
|
|
2703
|
-
function thaw() {
|
|
2704
|
-
settleReturn();
|
|
2705
|
-
}
|
|
2706
|
-
function foldFrozenGrowth(box, el, delta) {
|
|
2707
|
-
var elTop = el.getBoundingClientRect().top;
|
|
2708
|
-
foldInto(box, held, elTop, delta);
|
|
2709
|
-
foldInto(box, parked, elTop, delta);
|
|
2710
|
-
}
|
|
2711
|
-
function foldInto(box, a, elTop, delta) {
|
|
2712
|
-
if (!a || a.top >= 0) return;
|
|
2713
|
-
var rowEl = findRow(box, a);
|
|
2714
|
-
if (!rowEl) return;
|
|
2715
|
-
var within = elTop - rowEl.getBoundingClientRect().top;
|
|
2716
|
-
if (within < 0 || within >= rowEl.offsetHeight) return;
|
|
2717
|
-
if (within >= -a.top) return;
|
|
2718
|
-
a.top -= delta;
|
|
2719
|
-
a.scrollHeight += delta;
|
|
2720
2663
|
}
|
|
2721
2664
|
function forget() {
|
|
2722
2665
|
held = null;
|
|
2723
|
-
parked = null;
|
|
2724
|
-
parkedStuck = false;
|
|
2725
|
-
returning = false;
|
|
2726
2666
|
}
|
|
2727
2667
|
return {
|
|
2728
2668
|
capture,
|
|
@@ -2730,12 +2670,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2730
2670
|
preserve,
|
|
2731
2671
|
remember,
|
|
2732
2672
|
hold,
|
|
2733
|
-
park,
|
|
2734
|
-
settleReturn,
|
|
2735
|
-
isReturning,
|
|
2736
2673
|
pinBottom,
|
|
2737
|
-
isFrozen: frozen,
|
|
2738
|
-
thaw,
|
|
2739
2674
|
absorb,
|
|
2740
2675
|
forget
|
|
2741
2676
|
};
|
|
@@ -6547,7 +6482,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
6547
6482
|
(function() {
|
|
6548
6483
|
var MCP_PROD = "https://mcp.broadwayinc.computer";
|
|
6549
6484
|
var MCP_DEV = "https://mcp-dev.broadwayinc.computer";
|
|
6550
|
-
var BQ_VERSION = "1.8.
|
|
6485
|
+
var BQ_VERSION = "1.8.17" ;
|
|
6551
6486
|
var ATTACHMENT_URL_EXPIRES_SECONDS = 600;
|
|
6552
6487
|
var GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
6553
6488
|
var GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
@@ -8487,7 +8422,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8487
8422
|
enqueueAttachmentSend({ text, batchId, stageId, pinned });
|
|
8488
8423
|
}
|
|
8489
8424
|
function scrollToBottom() {
|
|
8490
|
-
if (
|
|
8425
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8491
8426
|
CS.stickToBottom = true;
|
|
8492
8427
|
chatScrollAnchor.pinBottom();
|
|
8493
8428
|
return Promise.resolve();
|
|
@@ -8500,7 +8435,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8500
8435
|
}
|
|
8501
8436
|
function scrollToBottomIfSticky() {
|
|
8502
8437
|
if (!CS.stickToBottom) return Promise.resolve();
|
|
8503
|
-
if (
|
|
8438
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8504
8439
|
chatScrollAnchor.pinBottom();
|
|
8505
8440
|
return Promise.resolve();
|
|
8506
8441
|
}
|
|
@@ -8509,25 +8444,25 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8509
8444
|
chatScrollAnchor.pinBottom();
|
|
8510
8445
|
});
|
|
8511
8446
|
}
|
|
8512
|
-
function settleScrollAfterRefresh(
|
|
8513
|
-
|
|
8514
|
-
if (chatScrollAnchor.settleReturn()) CS.stickToBottom = true;
|
|
8515
|
-
return;
|
|
8516
|
-
}
|
|
8447
|
+
function settleScrollAfterRefresh() {
|
|
8448
|
+
anchorWroteSinceScroll = true;
|
|
8517
8449
|
if (CS.stickToBottom) scrollToBottomIfSticky();
|
|
8518
8450
|
else chatScrollAnchor.hold();
|
|
8519
8451
|
}
|
|
8520
8452
|
var lastHistoryScrollTop = 0;
|
|
8453
|
+
var anchorWroteSinceScroll = false;
|
|
8521
8454
|
function onHistoryScroll() {
|
|
8522
8455
|
if (!CS.messagesBox || CS.chatSettingsOpen) return;
|
|
8523
8456
|
var el = CS.messagesBox;
|
|
8524
|
-
if (
|
|
8457
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8525
8458
|
lastHistoryScrollTop = el.scrollTop;
|
|
8526
8459
|
return;
|
|
8527
8460
|
}
|
|
8528
8461
|
var atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 16;
|
|
8462
|
+
var ours = anchorWroteSinceScroll;
|
|
8463
|
+
anchorWroteSinceScroll = false;
|
|
8529
8464
|
if (!atBottom) CS.stickToBottom = false;
|
|
8530
|
-
else if (el.scrollTop >= lastHistoryScrollTop) CS.stickToBottom = true;
|
|
8465
|
+
else if (!ours && el.scrollTop >= lastHistoryScrollTop) CS.stickToBottom = true;
|
|
8531
8466
|
lastHistoryScrollTop = el.scrollTop;
|
|
8532
8467
|
chatScrollAnchor.remember();
|
|
8533
8468
|
if (el.scrollTop <= 60) pageOlderHistoryUntilTaller();
|
|
@@ -8538,6 +8473,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8538
8473
|
function onMessagesImageSettled(e) {
|
|
8539
8474
|
var t = e && e.target;
|
|
8540
8475
|
if (!t || t.tagName !== "IMG") return;
|
|
8476
|
+
anchorWroteSinceScroll = true;
|
|
8541
8477
|
chatScrollAnchor.absorb(previewLayoutBox(t));
|
|
8542
8478
|
}
|
|
8543
8479
|
var _touchStartY = 0;
|
|
@@ -9677,6 +9613,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
9677
9613
|
}
|
|
9678
9614
|
function autoGrowInput(el) {
|
|
9679
9615
|
if (!el) return;
|
|
9616
|
+
var prevH = el.offsetHeight;
|
|
9680
9617
|
el.style.height = "auto";
|
|
9681
9618
|
var cs = window.getComputedStyle(el);
|
|
9682
9619
|
var border = (parseFloat(cs.borderTopWidth) || 0) + (parseFloat(cs.borderBottomWidth) || 0);
|
|
@@ -9689,6 +9626,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
9689
9626
|
el.style.height = h2 + "px";
|
|
9690
9627
|
el.style.overflowY = "hidden";
|
|
9691
9628
|
}
|
|
9629
|
+
var nextH = el.offsetHeight;
|
|
9630
|
+
if (CS.stickToBottom) chatScrollAnchor.pinBottom();
|
|
9631
|
+
if (nextH < prevH) ensureHistoryFillsViewport();
|
|
9692
9632
|
}
|
|
9693
9633
|
function buildMessageEl(msg, idx) {
|
|
9694
9634
|
var cls = ["bq-message"];
|
|
@@ -10215,13 +10155,6 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10215
10155
|
isStuck: function() {
|
|
10216
10156
|
return !!CS.stickToBottom;
|
|
10217
10157
|
},
|
|
10218
|
-
// A hidden tab keeps mutating this list - a resumed poll, the head refresh
|
|
10219
|
-
// and its deferred background batch, a settling request - and every one of
|
|
10220
|
-
// those would otherwise move a scroll position nobody is looking at. Freeze
|
|
10221
|
-
// instead, and put the reader back once they can see it (settleScroll).
|
|
10222
|
-
isFrozen: function() {
|
|
10223
|
-
return typeof document !== "undefined" && !!document.hidden;
|
|
10224
|
-
},
|
|
10225
10158
|
rawFallback: true
|
|
10226
10159
|
});
|
|
10227
10160
|
function captureScrollAnchor() {
|
|
@@ -10234,6 +10167,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10234
10167
|
chatScrollAnchor.pinBottom();
|
|
10235
10168
|
return;
|
|
10236
10169
|
}
|
|
10170
|
+
anchorWroteSinceScroll = true;
|
|
10237
10171
|
chatScrollAnchor.restore(anchor);
|
|
10238
10172
|
}
|
|
10239
10173
|
function syncDraftingIndicator() {
|
|
@@ -10360,6 +10294,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10360
10294
|
if (idx < 0 || idx >= CS.messages.length) return;
|
|
10361
10295
|
var oldEl = CS.messageEls[idx];
|
|
10362
10296
|
if (!oldEl || !oldEl.parentNode) return;
|
|
10297
|
+
anchorWroteSinceScroll = true;
|
|
10363
10298
|
chatScrollAnchor.preserve(function() {
|
|
10364
10299
|
var newEl = buildMessageEl(CS.messages[idx], idx);
|
|
10365
10300
|
if (oldEl.classList.contains("bq-index-pass")) newEl.classList.add("bq-index-pass");
|
|
@@ -10833,20 +10768,12 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10833
10768
|
}
|
|
10834
10769
|
if (!S._visBound && typeof document !== "undefined" && document.addEventListener) {
|
|
10835
10770
|
S._visBound = true;
|
|
10836
|
-
window.addEventListener("blur", function() {
|
|
10837
|
-
chatScrollAnchor.park();
|
|
10838
|
-
});
|
|
10839
|
-
window.addEventListener("focus", function() {
|
|
10840
|
-
settleScrollAfterRefresh(true);
|
|
10841
|
-
});
|
|
10842
10771
|
document.addEventListener("visibilitychange", function() {
|
|
10843
10772
|
if (document.visibilityState === "hidden") {
|
|
10844
|
-
chatScrollAnchor.park();
|
|
10845
10773
|
if (session && session.pausePolling) session.pausePolling("hidden");
|
|
10846
10774
|
return;
|
|
10847
10775
|
}
|
|
10848
10776
|
if (document.visibilityState === "visible") {
|
|
10849
|
-
settleScrollAfterRefresh(true);
|
|
10850
10777
|
var refreshed = S.user ? ensureMcpGrantFresh() : null;
|
|
10851
10778
|
Promise.resolve(refreshed).catch(function() {
|
|
10852
10779
|
}).then(function() {
|
package/dist/engine.cjs
CHANGED
|
@@ -2593,13 +2593,24 @@ function createScrollAnchor(options) {
|
|
|
2593
2593
|
var kids = box.children;
|
|
2594
2594
|
var fallback = null;
|
|
2595
2595
|
var fallbackAt = -1;
|
|
2596
|
+
var behind = [];
|
|
2596
2597
|
for (var i = 0; i < kids.length; i++) {
|
|
2597
2598
|
var el = kids[i];
|
|
2598
2599
|
if (!el || typeof el.getAttribute !== "function") continue;
|
|
2599
2600
|
var key = el.getAttribute(ROW_KEY_ATTR);
|
|
2600
2601
|
if (!key) continue;
|
|
2601
2602
|
var top = el.getBoundingClientRect().top - boxTop;
|
|
2602
|
-
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
|
+
}
|
|
2603
2614
|
if (top >= box.clientHeight) break;
|
|
2604
2615
|
var rawPos = el.getAttribute(ROW_POS_ATTR);
|
|
2605
2616
|
var pos = rawPos === null ? null : rawPos || UNKNOWN_ROW_POS;
|
|
@@ -2612,7 +2623,7 @@ function createScrollAnchor(options) {
|
|
|
2612
2623
|
el
|
|
2613
2624
|
};
|
|
2614
2625
|
if (rawPos === null) {
|
|
2615
|
-
cand.alts = collectAlts(box, boxTop, i + 1);
|
|
2626
|
+
cand.alts = withBehind(collectAlts(box, boxTop, i + 1), behind);
|
|
2616
2627
|
return cand;
|
|
2617
2628
|
}
|
|
2618
2629
|
if (!fallback) {
|
|
@@ -2621,7 +2632,10 @@ function createScrollAnchor(options) {
|
|
|
2621
2632
|
}
|
|
2622
2633
|
}
|
|
2623
2634
|
if (fallback) {
|
|
2624
|
-
fallback.alts =
|
|
2635
|
+
fallback.alts = withBehind(
|
|
2636
|
+
collectAlts(box, boxTop, fallbackAt + 1, true) || collectAlts(box, boxTop, fallbackAt + 1),
|
|
2637
|
+
behind
|
|
2638
|
+
);
|
|
2625
2639
|
return fallback;
|
|
2626
2640
|
}
|
|
2627
2641
|
return {
|
|
@@ -2653,6 +2667,10 @@ function createScrollAnchor(options) {
|
|
|
2653
2667
|
}
|
|
2654
2668
|
return out.length ? out : void 0;
|
|
2655
2669
|
}
|
|
2670
|
+
function withBehind(forward, behind) {
|
|
2671
|
+
var out = (forward || []).concat(behind.slice().reverse());
|
|
2672
|
+
return out.length ? out : void 0;
|
|
2673
|
+
}
|
|
2656
2674
|
function findRow(box, anchor) {
|
|
2657
2675
|
var el = anchor.el;
|
|
2658
2676
|
if (el && el.parentNode === box) return el;
|
|
@@ -2665,20 +2683,7 @@ function createScrollAnchor(options) {
|
|
|
2665
2683
|
}
|
|
2666
2684
|
return null;
|
|
2667
2685
|
}
|
|
2668
|
-
|
|
2669
|
-
var parked = null;
|
|
2670
|
-
var parkedStuck = false;
|
|
2671
|
-
var returning = false;
|
|
2672
|
-
var wroteTop = -1;
|
|
2673
|
-
var restoreExact = true;
|
|
2674
|
-
var restorePinned = false;
|
|
2675
|
-
function frozen() {
|
|
2676
|
-
var f = !!options.isFrozen && options.isFrozen();
|
|
2677
|
-
if (f) sawFrozen = true;
|
|
2678
|
-
return f;
|
|
2679
|
-
}
|
|
2680
|
-
function restore(anchor, unbounded) {
|
|
2681
|
-
if (frozen()) return;
|
|
2686
|
+
function restore(anchor) {
|
|
2682
2687
|
var box = options.getBox();
|
|
2683
2688
|
if (!box || !anchor || options.isStuck()) return;
|
|
2684
2689
|
var el = findRow(box, anchor);
|
|
@@ -2690,32 +2695,36 @@ function createScrollAnchor(options) {
|
|
|
2690
2695
|
var boxTop = box.getBoundingClientRect().top;
|
|
2691
2696
|
var delta = el.getBoundingClientRect().top - boxTop - anchor.top;
|
|
2692
2697
|
var slack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2693
|
-
|
|
2694
|
-
|
|
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
|
+
};
|
|
2695
2714
|
return;
|
|
2696
2715
|
}
|
|
2697
|
-
var want = box.scrollTop + delta;
|
|
2698
|
-
if (delta >= 1 || delta <= -1) box.scrollTop += delta;
|
|
2699
|
-
wroteTop = box.scrollTop;
|
|
2700
|
-
restorePinned = true;
|
|
2701
|
-
restoreExact = box.scrollTop >= want - 1 && box.scrollTop <= want + 1;
|
|
2702
|
-
held = {
|
|
2703
|
-
key: anchor.key,
|
|
2704
|
-
top: anchor.top,
|
|
2705
|
-
pos: anchor.pos,
|
|
2706
|
-
scrollTop: box.scrollTop,
|
|
2707
|
-
scrollHeight: box.scrollHeight,
|
|
2708
|
-
el,
|
|
2709
|
-
// Carried, not dropped: one successful restore used to disarm the
|
|
2710
|
-
// standbys for every later hold.
|
|
2711
|
-
alts: anchor.alts
|
|
2712
|
-
};
|
|
2713
|
-
return;
|
|
2714
2716
|
}
|
|
2715
2717
|
var alts = anchor.alts;
|
|
2716
2718
|
for (var ai = 0; alts && ai < alts.length; ai++) {
|
|
2717
2719
|
var alt = alts[ai];
|
|
2718
|
-
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
|
+
});
|
|
2719
2728
|
if (!ael) continue;
|
|
2720
2729
|
if (alt.pos !== null && alt.pos !== UNKNOWN_ROW_POS) {
|
|
2721
2730
|
var altLive = ael.getAttribute(ROW_POS_ATTR) || UNKNOWN_ROW_POS;
|
|
@@ -2724,12 +2733,9 @@ function createScrollAnchor(options) {
|
|
|
2724
2733
|
var aboxTop = box.getBoundingClientRect().top;
|
|
2725
2734
|
var adelta = ael.getBoundingClientRect().top - aboxTop - alt.top;
|
|
2726
2735
|
var aslack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2727
|
-
|
|
2728
|
-
|
|
2736
|
+
var amoved = adelta - (anchor.scrollTop - box.scrollTop);
|
|
2737
|
+
if (amoved > aslack || amoved < -aslack) continue;
|
|
2729
2738
|
if (adelta >= 1 || adelta <= -1) box.scrollTop += adelta;
|
|
2730
|
-
wroteTop = box.scrollTop;
|
|
2731
|
-
restorePinned = true;
|
|
2732
|
-
restoreExact = box.scrollTop >= awant - 1 && box.scrollTop <= awant + 1;
|
|
2733
2739
|
held = {
|
|
2734
2740
|
key: alt.key,
|
|
2735
2741
|
top: alt.top,
|
|
@@ -2748,13 +2754,9 @@ function createScrollAnchor(options) {
|
|
|
2748
2754
|
var grew = box.scrollHeight - anchor.scrollHeight;
|
|
2749
2755
|
if (grew > 0) {
|
|
2750
2756
|
box.scrollTop = anchor.scrollTop + grew;
|
|
2751
|
-
wroteTop = box.scrollTop;
|
|
2752
2757
|
return;
|
|
2753
2758
|
}
|
|
2754
|
-
if (options.rawFallback)
|
|
2755
|
-
box.scrollTop = anchor.scrollTop;
|
|
2756
|
-
wroteTop = box.scrollTop;
|
|
2757
|
-
}
|
|
2759
|
+
if (options.rawFallback) box.scrollTop = anchor.scrollTop;
|
|
2758
2760
|
}
|
|
2759
2761
|
function preserve(mutate) {
|
|
2760
2762
|
var anchor = capture();
|
|
@@ -2763,21 +2765,9 @@ function createScrollAnchor(options) {
|
|
|
2763
2765
|
return result;
|
|
2764
2766
|
}
|
|
2765
2767
|
function remember() {
|
|
2766
|
-
var b0 = options.getBox();
|
|
2767
|
-
if (returning && b0 && b0.scrollTop !== wroteTop) {
|
|
2768
|
-
parked = null;
|
|
2769
|
-
parkedStuck = false;
|
|
2770
|
-
returning = false;
|
|
2771
|
-
}
|
|
2772
|
-
if (frozen()) return;
|
|
2773
2768
|
held = capture();
|
|
2774
2769
|
}
|
|
2775
2770
|
function hold() {
|
|
2776
|
-
if (frozen()) return;
|
|
2777
|
-
if (sawFrozen || returning) {
|
|
2778
|
-
settleReturn();
|
|
2779
|
-
return;
|
|
2780
|
-
}
|
|
2781
2771
|
var box = options.getBox();
|
|
2782
2772
|
if (!box || options.isStuck()) {
|
|
2783
2773
|
held = null;
|
|
@@ -2804,67 +2794,17 @@ function createScrollAnchor(options) {
|
|
|
2804
2794
|
if (prev === void 0) prev = 0;
|
|
2805
2795
|
var delta = h - prev;
|
|
2806
2796
|
if (delta === 0) return;
|
|
2807
|
-
if (frozen()) {
|
|
2808
|
-
foldFrozenGrowth(box, el, delta);
|
|
2809
|
-
return;
|
|
2810
|
-
}
|
|
2811
2797
|
if (el.getBoundingClientRect().top >= box.getBoundingClientRect().top) return;
|
|
2812
2798
|
box.scrollTop += delta;
|
|
2813
|
-
wroteTop = box.scrollTop;
|
|
2814
2799
|
if (held) held = capture();
|
|
2815
2800
|
}
|
|
2816
|
-
function park() {
|
|
2817
|
-
parked = capture();
|
|
2818
|
-
parkedStuck = !!options.isStuck();
|
|
2819
|
-
returning = true;
|
|
2820
|
-
}
|
|
2821
2801
|
function pinBottom() {
|
|
2822
2802
|
var box = options.getBox();
|
|
2823
2803
|
if (!box) return;
|
|
2824
2804
|
box.scrollTop = box.scrollHeight;
|
|
2825
|
-
wroteTop = box.scrollTop;
|
|
2826
|
-
}
|
|
2827
|
-
function settleReturn() {
|
|
2828
|
-
if (frozen()) return false;
|
|
2829
|
-
sawFrozen = false;
|
|
2830
|
-
if (parkedStuck) {
|
|
2831
|
-
pinBottom();
|
|
2832
|
-
return true;
|
|
2833
|
-
}
|
|
2834
|
-
var target = parked || held;
|
|
2835
|
-
restoreExact = true;
|
|
2836
|
-
restorePinned = false;
|
|
2837
|
-
restore(target, true);
|
|
2838
|
-
parked = !restorePinned || !restoreExact ? target : null;
|
|
2839
|
-
returning = !!parked;
|
|
2840
|
-
return false;
|
|
2841
|
-
}
|
|
2842
|
-
function isReturning() {
|
|
2843
|
-
return returning;
|
|
2844
|
-
}
|
|
2845
|
-
function thaw() {
|
|
2846
|
-
settleReturn();
|
|
2847
|
-
}
|
|
2848
|
-
function foldFrozenGrowth(box, el, delta) {
|
|
2849
|
-
var elTop = el.getBoundingClientRect().top;
|
|
2850
|
-
foldInto(box, held, elTop, delta);
|
|
2851
|
-
foldInto(box, parked, elTop, delta);
|
|
2852
|
-
}
|
|
2853
|
-
function foldInto(box, a, elTop, delta) {
|
|
2854
|
-
if (!a || a.top >= 0) return;
|
|
2855
|
-
var rowEl = findRow(box, a);
|
|
2856
|
-
if (!rowEl) return;
|
|
2857
|
-
var within = elTop - rowEl.getBoundingClientRect().top;
|
|
2858
|
-
if (within < 0 || within >= rowEl.offsetHeight) return;
|
|
2859
|
-
if (within >= -a.top) return;
|
|
2860
|
-
a.top -= delta;
|
|
2861
|
-
a.scrollHeight += delta;
|
|
2862
2805
|
}
|
|
2863
2806
|
function forget() {
|
|
2864
2807
|
held = null;
|
|
2865
|
-
parked = null;
|
|
2866
|
-
parkedStuck = false;
|
|
2867
|
-
returning = false;
|
|
2868
2808
|
}
|
|
2869
2809
|
return {
|
|
2870
2810
|
capture,
|
|
@@ -2872,12 +2812,7 @@ function createScrollAnchor(options) {
|
|
|
2872
2812
|
preserve,
|
|
2873
2813
|
remember,
|
|
2874
2814
|
hold,
|
|
2875
|
-
park,
|
|
2876
|
-
settleReturn,
|
|
2877
|
-
isReturning,
|
|
2878
2815
|
pinBottom,
|
|
2879
|
-
isFrozen: frozen,
|
|
2880
|
-
thaw,
|
|
2881
2816
|
absorb,
|
|
2882
2817
|
forget
|
|
2883
2818
|
};
|