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/bunnyquery.js
CHANGED
|
@@ -2440,7 +2440,6 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2440
2440
|
var ROW_POS_ATTR = "data-row-pos";
|
|
2441
2441
|
var MAX_ALTS = 2;
|
|
2442
2442
|
var ALT_SCAN_LIMIT = 64;
|
|
2443
|
-
var MAX_RETURN_SETTLES = 3;
|
|
2444
2443
|
var UNKNOWN_ROW_POS = "\0?";
|
|
2445
2444
|
function createScrollAnchor(options) {
|
|
2446
2445
|
var held = null;
|
|
@@ -2452,13 +2451,24 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2452
2451
|
var kids = box.children;
|
|
2453
2452
|
var fallback = null;
|
|
2454
2453
|
var fallbackAt = -1;
|
|
2454
|
+
var behind = [];
|
|
2455
2455
|
for (var i = 0; i < kids.length; i++) {
|
|
2456
2456
|
var el = kids[i];
|
|
2457
2457
|
if (!el || typeof el.getAttribute !== "function") continue;
|
|
2458
2458
|
var key = el.getAttribute(ROW_KEY_ATTR);
|
|
2459
2459
|
if (!key) continue;
|
|
2460
2460
|
var top = el.getBoundingClientRect().top - boxTop;
|
|
2461
|
-
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
|
+
}
|
|
2462
2472
|
if (top >= box.clientHeight) break;
|
|
2463
2473
|
var rawPos = el.getAttribute(ROW_POS_ATTR);
|
|
2464
2474
|
var pos = rawPos === null ? null : rawPos || UNKNOWN_ROW_POS;
|
|
@@ -2471,7 +2481,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2471
2481
|
el
|
|
2472
2482
|
};
|
|
2473
2483
|
if (rawPos === null) {
|
|
2474
|
-
cand.alts = collectAlts(box, boxTop, i + 1);
|
|
2484
|
+
cand.alts = withBehind(collectAlts(box, boxTop, i + 1), behind);
|
|
2475
2485
|
return cand;
|
|
2476
2486
|
}
|
|
2477
2487
|
if (!fallback) {
|
|
@@ -2480,7 +2490,10 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2480
2490
|
}
|
|
2481
2491
|
}
|
|
2482
2492
|
if (fallback) {
|
|
2483
|
-
fallback.alts =
|
|
2493
|
+
fallback.alts = withBehind(
|
|
2494
|
+
collectAlts(box, boxTop, fallbackAt + 1, true) || collectAlts(box, boxTop, fallbackAt + 1),
|
|
2495
|
+
behind
|
|
2496
|
+
);
|
|
2484
2497
|
return fallback;
|
|
2485
2498
|
}
|
|
2486
2499
|
return {
|
|
@@ -2512,6 +2525,10 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2512
2525
|
}
|
|
2513
2526
|
return out.length ? out : void 0;
|
|
2514
2527
|
}
|
|
2528
|
+
function withBehind(forward, behind) {
|
|
2529
|
+
var out = (forward || []).concat(behind.slice().reverse());
|
|
2530
|
+
return out.length ? out : void 0;
|
|
2531
|
+
}
|
|
2515
2532
|
function findRow(box, anchor) {
|
|
2516
2533
|
var el = anchor.el;
|
|
2517
2534
|
if (el && el.parentNode === box) return el;
|
|
@@ -2524,21 +2541,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2524
2541
|
}
|
|
2525
2542
|
return null;
|
|
2526
2543
|
}
|
|
2527
|
-
|
|
2528
|
-
var parked = null;
|
|
2529
|
-
var parkedStuck = false;
|
|
2530
|
-
var returning = false;
|
|
2531
|
-
var returnBudget = 0;
|
|
2532
|
-
var wroteTop = -1;
|
|
2533
|
-
var restoreExact = true;
|
|
2534
|
-
var restorePinned = false;
|
|
2535
|
-
function frozen() {
|
|
2536
|
-
var f = !!options.isFrozen && options.isFrozen();
|
|
2537
|
-
if (f) sawFrozen = true;
|
|
2538
|
-
return f;
|
|
2539
|
-
}
|
|
2540
|
-
function restore(anchor, unbounded) {
|
|
2541
|
-
if (frozen()) return;
|
|
2544
|
+
function restore(anchor) {
|
|
2542
2545
|
var box = options.getBox();
|
|
2543
2546
|
if (!box || !anchor || options.isStuck()) return;
|
|
2544
2547
|
var el = findRow(box, anchor);
|
|
@@ -2550,32 +2553,36 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2550
2553
|
var boxTop = box.getBoundingClientRect().top;
|
|
2551
2554
|
var delta = el.getBoundingClientRect().top - boxTop - anchor.top;
|
|
2552
2555
|
var slack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2553
|
-
|
|
2554
|
-
|
|
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
|
+
};
|
|
2555
2572
|
return;
|
|
2556
2573
|
}
|
|
2557
|
-
var want = box.scrollTop + delta;
|
|
2558
|
-
if (delta >= 1 || delta <= -1) box.scrollTop += delta;
|
|
2559
|
-
wroteTop = box.scrollTop;
|
|
2560
|
-
restorePinned = true;
|
|
2561
|
-
restoreExact = box.scrollTop >= want - 1 && box.scrollTop <= want + 1;
|
|
2562
|
-
held = {
|
|
2563
|
-
key: anchor.key,
|
|
2564
|
-
top: anchor.top,
|
|
2565
|
-
pos: anchor.pos,
|
|
2566
|
-
scrollTop: box.scrollTop,
|
|
2567
|
-
scrollHeight: box.scrollHeight,
|
|
2568
|
-
el,
|
|
2569
|
-
// Carried, not dropped: one successful restore used to disarm the
|
|
2570
|
-
// standbys for every later hold.
|
|
2571
|
-
alts: anchor.alts
|
|
2572
|
-
};
|
|
2573
|
-
return;
|
|
2574
2574
|
}
|
|
2575
2575
|
var alts = anchor.alts;
|
|
2576
2576
|
for (var ai = 0; alts && ai < alts.length; ai++) {
|
|
2577
2577
|
var alt = alts[ai];
|
|
2578
|
-
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
|
+
});
|
|
2579
2586
|
if (!ael) continue;
|
|
2580
2587
|
if (alt.pos !== null && alt.pos !== UNKNOWN_ROW_POS) {
|
|
2581
2588
|
var altLive = ael.getAttribute(ROW_POS_ATTR) || UNKNOWN_ROW_POS;
|
|
@@ -2584,12 +2591,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2584
2591
|
var aboxTop = box.getBoundingClientRect().top;
|
|
2585
2592
|
var adelta = ael.getBoundingClientRect().top - aboxTop - alt.top;
|
|
2586
2593
|
var aslack = Math.abs(box.scrollHeight - anchor.scrollHeight) + box.clientHeight;
|
|
2587
|
-
|
|
2588
|
-
|
|
2594
|
+
var amoved = adelta - (anchor.scrollTop - box.scrollTop);
|
|
2595
|
+
if (amoved > aslack || amoved < -aslack) continue;
|
|
2589
2596
|
if (adelta >= 1 || adelta <= -1) box.scrollTop += adelta;
|
|
2590
|
-
wroteTop = box.scrollTop;
|
|
2591
|
-
restorePinned = true;
|
|
2592
|
-
restoreExact = box.scrollTop >= awant - 1 && box.scrollTop <= awant + 1;
|
|
2593
2597
|
held = {
|
|
2594
2598
|
key: alt.key,
|
|
2595
2599
|
top: alt.top,
|
|
@@ -2608,13 +2612,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2608
2612
|
var grew = box.scrollHeight - anchor.scrollHeight;
|
|
2609
2613
|
if (grew > 0) {
|
|
2610
2614
|
box.scrollTop = anchor.scrollTop + grew;
|
|
2611
|
-
wroteTop = box.scrollTop;
|
|
2612
2615
|
return;
|
|
2613
2616
|
}
|
|
2614
|
-
if (options.rawFallback)
|
|
2615
|
-
box.scrollTop = anchor.scrollTop;
|
|
2616
|
-
wroteTop = box.scrollTop;
|
|
2617
|
-
}
|
|
2617
|
+
if (options.rawFallback) box.scrollTop = anchor.scrollTop;
|
|
2618
2618
|
}
|
|
2619
2619
|
function preserve(mutate) {
|
|
2620
2620
|
var anchor = capture();
|
|
@@ -2623,17 +2623,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2623
2623
|
return result;
|
|
2624
2624
|
}
|
|
2625
2625
|
function remember() {
|
|
2626
|
-
var b0 = options.getBox();
|
|
2627
|
-
if (returning && b0 && b0.scrollTop !== wroteTop) release();
|
|
2628
|
-
if (frozen()) return;
|
|
2629
2626
|
held = capture();
|
|
2630
2627
|
}
|
|
2631
2628
|
function hold() {
|
|
2632
|
-
if (frozen()) return;
|
|
2633
|
-
if (sawFrozen) {
|
|
2634
|
-
settleReturn();
|
|
2635
|
-
return;
|
|
2636
|
-
}
|
|
2637
2629
|
var box = options.getBox();
|
|
2638
2630
|
if (!box || options.isStuck()) {
|
|
2639
2631
|
held = null;
|
|
@@ -2660,86 +2652,17 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2660
2652
|
if (prev === void 0) prev = 0;
|
|
2661
2653
|
var delta = h - prev;
|
|
2662
2654
|
if (delta === 0) return;
|
|
2663
|
-
if (frozen()) {
|
|
2664
|
-
foldFrozenGrowth(box, el, delta);
|
|
2665
|
-
return;
|
|
2666
|
-
}
|
|
2667
2655
|
if (el.getBoundingClientRect().top >= box.getBoundingClientRect().top) return;
|
|
2668
2656
|
box.scrollTop += delta;
|
|
2669
|
-
wroteTop = box.scrollTop;
|
|
2670
2657
|
if (held) held = capture();
|
|
2671
2658
|
}
|
|
2672
|
-
function park() {
|
|
2673
|
-
parked = capture();
|
|
2674
|
-
parkedStuck = !!options.isStuck();
|
|
2675
|
-
returning = true;
|
|
2676
|
-
returnBudget = MAX_RETURN_SETTLES;
|
|
2677
|
-
}
|
|
2678
|
-
function release() {
|
|
2679
|
-
parked = null;
|
|
2680
|
-
parkedStuck = false;
|
|
2681
|
-
returning = false;
|
|
2682
|
-
returnBudget = 0;
|
|
2683
|
-
}
|
|
2684
2659
|
function pinBottom() {
|
|
2685
2660
|
var box = options.getBox();
|
|
2686
2661
|
if (!box) return;
|
|
2687
2662
|
box.scrollTop = box.scrollHeight;
|
|
2688
|
-
wroteTop = box.scrollTop;
|
|
2689
|
-
}
|
|
2690
|
-
function settleReturn() {
|
|
2691
|
-
if (frozen()) return false;
|
|
2692
|
-
var wasFrozen = sawFrozen;
|
|
2693
|
-
sawFrozen = false;
|
|
2694
|
-
if (!returning && !wasFrozen) return false;
|
|
2695
|
-
if (returning) {
|
|
2696
|
-
if (returnBudget <= 0) {
|
|
2697
|
-
release();
|
|
2698
|
-
return false;
|
|
2699
|
-
}
|
|
2700
|
-
returnBudget--;
|
|
2701
|
-
}
|
|
2702
|
-
if (parkedStuck) {
|
|
2703
|
-
pinBottom();
|
|
2704
|
-
return true;
|
|
2705
|
-
}
|
|
2706
|
-
var target = parked || held;
|
|
2707
|
-
restoreExact = true;
|
|
2708
|
-
restorePinned = false;
|
|
2709
|
-
restore(target, true);
|
|
2710
|
-
parked = !restorePinned || !restoreExact ? target : null;
|
|
2711
|
-
returning = !!parked && returnBudget > 0;
|
|
2712
|
-
if (!returning) {
|
|
2713
|
-
parked = null;
|
|
2714
|
-
parkedStuck = false;
|
|
2715
|
-
returnBudget = 0;
|
|
2716
|
-
}
|
|
2717
|
-
return false;
|
|
2718
|
-
}
|
|
2719
|
-
function isReturning() {
|
|
2720
|
-
return returning;
|
|
2721
|
-
}
|
|
2722
|
-
function thaw() {
|
|
2723
|
-
settleReturn();
|
|
2724
|
-
}
|
|
2725
|
-
function foldFrozenGrowth(box, el, delta) {
|
|
2726
|
-
var elTop = el.getBoundingClientRect().top;
|
|
2727
|
-
foldInto(box, held, elTop, delta);
|
|
2728
|
-
foldInto(box, parked, elTop, delta);
|
|
2729
|
-
}
|
|
2730
|
-
function foldInto(box, a, elTop, delta) {
|
|
2731
|
-
if (!a || a.top >= 0) return;
|
|
2732
|
-
var rowEl = findRow(box, a);
|
|
2733
|
-
if (!rowEl) return;
|
|
2734
|
-
var within = elTop - rowEl.getBoundingClientRect().top;
|
|
2735
|
-
if (within < 0 || within >= rowEl.offsetHeight) return;
|
|
2736
|
-
if (within >= -a.top) return;
|
|
2737
|
-
a.top -= delta;
|
|
2738
|
-
a.scrollHeight += delta;
|
|
2739
2663
|
}
|
|
2740
2664
|
function forget() {
|
|
2741
2665
|
held = null;
|
|
2742
|
-
release();
|
|
2743
2666
|
}
|
|
2744
2667
|
return {
|
|
2745
2668
|
capture,
|
|
@@ -2747,13 +2670,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
2747
2670
|
preserve,
|
|
2748
2671
|
remember,
|
|
2749
2672
|
hold,
|
|
2750
|
-
park,
|
|
2751
|
-
settleReturn,
|
|
2752
|
-
isReturning,
|
|
2753
|
-
release,
|
|
2754
2673
|
pinBottom,
|
|
2755
|
-
isFrozen: frozen,
|
|
2756
|
-
thaw,
|
|
2757
2674
|
absorb,
|
|
2758
2675
|
forget
|
|
2759
2676
|
};
|
|
@@ -6565,7 +6482,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
6565
6482
|
(function() {
|
|
6566
6483
|
var MCP_PROD = "https://mcp.broadwayinc.computer";
|
|
6567
6484
|
var MCP_DEV = "https://mcp-dev.broadwayinc.computer";
|
|
6568
|
-
var BQ_VERSION = "1.8.
|
|
6485
|
+
var BQ_VERSION = "1.8.18" ;
|
|
6569
6486
|
var ATTACHMENT_URL_EXPIRES_SECONDS = 600;
|
|
6570
6487
|
var GOOGLE_AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
|
|
6571
6488
|
var GOOGLE_TOKEN_URL = "https://oauth2.googleapis.com/token";
|
|
@@ -8505,7 +8422,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8505
8422
|
enqueueAttachmentSend({ text, batchId, stageId, pinned });
|
|
8506
8423
|
}
|
|
8507
8424
|
function scrollToBottom() {
|
|
8508
|
-
if (
|
|
8425
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8509
8426
|
CS.stickToBottom = true;
|
|
8510
8427
|
chatScrollAnchor.pinBottom();
|
|
8511
8428
|
return Promise.resolve();
|
|
@@ -8518,7 +8435,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8518
8435
|
}
|
|
8519
8436
|
function scrollToBottomIfSticky() {
|
|
8520
8437
|
if (!CS.stickToBottom) return Promise.resolve();
|
|
8521
|
-
if (
|
|
8438
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8522
8439
|
chatScrollAnchor.pinBottom();
|
|
8523
8440
|
return Promise.resolve();
|
|
8524
8441
|
}
|
|
@@ -8527,25 +8444,25 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8527
8444
|
chatScrollAnchor.pinBottom();
|
|
8528
8445
|
});
|
|
8529
8446
|
}
|
|
8530
|
-
function settleScrollAfterRefresh(
|
|
8531
|
-
|
|
8532
|
-
if (chatScrollAnchor.settleReturn()) CS.stickToBottom = true;
|
|
8533
|
-
return;
|
|
8534
|
-
}
|
|
8447
|
+
function settleScrollAfterRefresh() {
|
|
8448
|
+
anchorWroteSinceScroll = true;
|
|
8535
8449
|
if (CS.stickToBottom) scrollToBottomIfSticky();
|
|
8536
8450
|
else chatScrollAnchor.hold();
|
|
8537
8451
|
}
|
|
8538
8452
|
var lastHistoryScrollTop = 0;
|
|
8453
|
+
var anchorWroteSinceScroll = false;
|
|
8539
8454
|
function onHistoryScroll() {
|
|
8540
8455
|
if (!CS.messagesBox || CS.chatSettingsOpen) return;
|
|
8541
8456
|
var el = CS.messagesBox;
|
|
8542
|
-
if (
|
|
8457
|
+
if (typeof document !== "undefined" && document.hidden) {
|
|
8543
8458
|
lastHistoryScrollTop = el.scrollTop;
|
|
8544
8459
|
return;
|
|
8545
8460
|
}
|
|
8546
8461
|
var atBottom = el.scrollHeight - el.scrollTop - el.clientHeight <= 16;
|
|
8462
|
+
var ours = anchorWroteSinceScroll;
|
|
8463
|
+
anchorWroteSinceScroll = false;
|
|
8547
8464
|
if (!atBottom) CS.stickToBottom = false;
|
|
8548
|
-
else if (el.scrollTop >= lastHistoryScrollTop) CS.stickToBottom = true;
|
|
8465
|
+
else if (!ours && el.scrollTop >= lastHistoryScrollTop) CS.stickToBottom = true;
|
|
8549
8466
|
lastHistoryScrollTop = el.scrollTop;
|
|
8550
8467
|
chatScrollAnchor.remember();
|
|
8551
8468
|
if (el.scrollTop <= 60) pageOlderHistoryUntilTaller();
|
|
@@ -8556,25 +8473,17 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
8556
8473
|
function onMessagesImageSettled(e) {
|
|
8557
8474
|
var t = e && e.target;
|
|
8558
8475
|
if (!t || t.tagName !== "IMG") return;
|
|
8476
|
+
anchorWroteSinceScroll = true;
|
|
8559
8477
|
chatScrollAnchor.absorb(previewLayoutBox(t));
|
|
8560
8478
|
}
|
|
8561
8479
|
var _touchStartY = 0;
|
|
8562
8480
|
function onMessagesWheel(e) {
|
|
8563
|
-
chatScrollAnchor.release();
|
|
8564
8481
|
if (e.deltaY < 0) CS.stickToBottom = false;
|
|
8565
8482
|
}
|
|
8566
8483
|
function onMessagesTouchStart(e) {
|
|
8567
|
-
chatScrollAnchor.release();
|
|
8568
8484
|
_touchStartY = e.touches && e.touches[0] ? e.touches[0].clientY : 0;
|
|
8569
8485
|
}
|
|
8570
|
-
function onMessagesKeyDown() {
|
|
8571
|
-
chatScrollAnchor.release();
|
|
8572
|
-
}
|
|
8573
|
-
function onMessagesPointerDown() {
|
|
8574
|
-
chatScrollAnchor.release();
|
|
8575
|
-
}
|
|
8576
8486
|
function onMessagesTouchMove(e) {
|
|
8577
|
-
chatScrollAnchor.release();
|
|
8578
8487
|
var y = e.touches && e.touches[0] ? e.touches[0].clientY : 0;
|
|
8579
8488
|
if (y > _touchStartY + 4) CS.stickToBottom = false;
|
|
8580
8489
|
}
|
|
@@ -9704,6 +9613,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
9704
9613
|
}
|
|
9705
9614
|
function autoGrowInput(el) {
|
|
9706
9615
|
if (!el) return;
|
|
9616
|
+
var prevH = el.offsetHeight;
|
|
9707
9617
|
el.style.height = "auto";
|
|
9708
9618
|
var cs = window.getComputedStyle(el);
|
|
9709
9619
|
var border = (parseFloat(cs.borderTopWidth) || 0) + (parseFloat(cs.borderBottomWidth) || 0);
|
|
@@ -9716,6 +9626,9 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
9716
9626
|
el.style.height = h2 + "px";
|
|
9717
9627
|
el.style.overflowY = "hidden";
|
|
9718
9628
|
}
|
|
9629
|
+
var nextH = el.offsetHeight;
|
|
9630
|
+
if (CS.stickToBottom) chatScrollAnchor.pinBottom();
|
|
9631
|
+
if (nextH < prevH) ensureHistoryFillsViewport();
|
|
9719
9632
|
}
|
|
9720
9633
|
function buildMessageEl(msg, idx) {
|
|
9721
9634
|
var cls = ["bq-message"];
|
|
@@ -10242,13 +10155,6 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10242
10155
|
isStuck: function() {
|
|
10243
10156
|
return !!CS.stickToBottom;
|
|
10244
10157
|
},
|
|
10245
|
-
// A hidden tab keeps mutating this list - a resumed poll, the head refresh
|
|
10246
|
-
// and its deferred background batch, a settling request - and every one of
|
|
10247
|
-
// those would otherwise move a scroll position nobody is looking at. Freeze
|
|
10248
|
-
// instead, and put the reader back once they can see it (settleScroll).
|
|
10249
|
-
isFrozen: function() {
|
|
10250
|
-
return typeof document !== "undefined" && !!document.hidden;
|
|
10251
|
-
},
|
|
10252
10158
|
rawFallback: true
|
|
10253
10159
|
});
|
|
10254
10160
|
function captureScrollAnchor() {
|
|
@@ -10261,6 +10167,7 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10261
10167
|
chatScrollAnchor.pinBottom();
|
|
10262
10168
|
return;
|
|
10263
10169
|
}
|
|
10170
|
+
anchorWroteSinceScroll = true;
|
|
10264
10171
|
chatScrollAnchor.restore(anchor);
|
|
10265
10172
|
}
|
|
10266
10173
|
function syncDraftingIndicator() {
|
|
@@ -10380,20 +10287,21 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10380
10287
|
CS.messagesBox.appendChild(el);
|
|
10381
10288
|
});
|
|
10382
10289
|
syncDraftingIndicator();
|
|
10383
|
-
restoreScrollAnchor(anchor);
|
|
10384
10290
|
hydrateMessageImagePreviews();
|
|
10291
|
+
restoreScrollAnchor(anchor);
|
|
10385
10292
|
}
|
|
10386
10293
|
function refreshMessageBubble(idx) {
|
|
10387
10294
|
if (idx < 0 || idx >= CS.messages.length) return;
|
|
10388
10295
|
var oldEl = CS.messageEls[idx];
|
|
10389
10296
|
if (!oldEl || !oldEl.parentNode) return;
|
|
10297
|
+
anchorWroteSinceScroll = true;
|
|
10390
10298
|
chatScrollAnchor.preserve(function() {
|
|
10391
10299
|
var newEl = buildMessageEl(CS.messages[idx], idx);
|
|
10392
10300
|
if (oldEl.classList.contains("bq-index-pass")) newEl.classList.add("bq-index-pass");
|
|
10393
10301
|
oldEl.parentNode.replaceChild(newEl, oldEl);
|
|
10394
10302
|
CS.messageEls[idx] = newEl;
|
|
10303
|
+
hydrateMessageImagePreviews();
|
|
10395
10304
|
});
|
|
10396
|
-
hydrateMessageImagePreviews();
|
|
10397
10305
|
}
|
|
10398
10306
|
function renderChat() {
|
|
10399
10307
|
clearImagePreviewCache(S.projectId || "default");
|
|
@@ -10472,8 +10380,6 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10472
10380
|
box.addEventListener("wheel", onMessagesWheel, { passive: true });
|
|
10473
10381
|
box.addEventListener("touchstart", onMessagesTouchStart, { passive: true });
|
|
10474
10382
|
box.addEventListener("touchmove", onMessagesTouchMove, { passive: true });
|
|
10475
|
-
box.addEventListener("keydown", onMessagesKeyDown, { passive: true });
|
|
10476
|
-
box.addEventListener("pointerdown", onMessagesPointerDown, { passive: true });
|
|
10477
10383
|
box.addEventListener("load", onMessagesImageSettled, true);
|
|
10478
10384
|
box.addEventListener("error", onMessagesImageSettled, true);
|
|
10479
10385
|
if (document.fonts && document.fonts.addEventListener) {
|
|
@@ -10862,20 +10768,12 @@ Index the REMAINING windows - one record per row/item, looking at any page image
|
|
|
10862
10768
|
}
|
|
10863
10769
|
if (!S._visBound && typeof document !== "undefined" && document.addEventListener) {
|
|
10864
10770
|
S._visBound = true;
|
|
10865
|
-
window.addEventListener("blur", function() {
|
|
10866
|
-
chatScrollAnchor.park();
|
|
10867
|
-
});
|
|
10868
|
-
window.addEventListener("focus", function() {
|
|
10869
|
-
settleScrollAfterRefresh(true);
|
|
10870
|
-
});
|
|
10871
10771
|
document.addEventListener("visibilitychange", function() {
|
|
10872
10772
|
if (document.visibilityState === "hidden") {
|
|
10873
|
-
chatScrollAnchor.park();
|
|
10874
10773
|
if (session && session.pausePolling) session.pausePolling("hidden");
|
|
10875
10774
|
return;
|
|
10876
10775
|
}
|
|
10877
10776
|
if (document.visibilityState === "visible") {
|
|
10878
|
-
settleScrollAfterRefresh(true);
|
|
10879
10777
|
var refreshed = S.user ? ensureMcpGrantFresh() : null;
|
|
10880
10778
|
Promise.resolve(refreshed).catch(function() {
|
|
10881
10779
|
}).then(function() {
|