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 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) continue;
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 = collectAlts(box, boxTop, fallbackAt + 1, true);
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
- var sawFrozen = false;
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
- if (!unbounded && (delta > slack || delta < -slack)) {
2554
- lost(box, anchor);
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, { key: alt.key, top: alt.top, pos: alt.pos, scrollTop: anchor.scrollTop, scrollHeight: anchor.scrollHeight, el: alt.el });
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
- if (!unbounded && (adelta > aslack || adelta < -aslack)) continue;
2588
- var awant = box.scrollTop + adelta;
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.16" ;
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 (chatScrollAnchor.isFrozen()) {
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 (chatScrollAnchor.isFrozen()) {
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(afterAbsence) {
8531
- if (afterAbsence || chatScrollAnchor.isReturning()) {
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 (chatScrollAnchor.isFrozen()) {
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() {