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 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) 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
+ }
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 = 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
+ );
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
- var sawFrozen = false;
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
- if (!unbounded && (delta > slack || delta < -slack)) {
2552
- 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
+ };
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, { 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
+ });
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
- if (!unbounded && (adelta > aslack || adelta < -aslack)) continue;
2586
- var awant = box.scrollTop + adelta;
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.14" ;
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 (chatScrollAnchor.isFrozen()) {
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 (chatScrollAnchor.isFrozen()) {
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(afterAbsence) {
8513
- if (afterAbsence || chatScrollAnchor.isReturning()) {
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 (chatScrollAnchor.isFrozen()) {
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) 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
+ }
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 = 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
+ );
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
- var sawFrozen = false;
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
- if (!unbounded && (delta > slack || delta < -slack)) {
2694
- 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
+ };
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, { 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
+ });
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
- if (!unbounded && (adelta > aslack || adelta < -aslack)) continue;
2728
- var awant = box.scrollTop + adelta;
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
  };