aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2026-09-03 23:18:45 -0700
committerAdam Soltys <[email protected]>2026-09-03 23:18:45 -0700
commit787dd33d40cc33c32dc9f138561c1b58f6a765e7 (patch)
tree8d28e14e772bb83c3222d5beb7469583c1588b4e
parentc5e830ea95dff7cfb167b7c9e17840be3b6a6756 (diff)
downloadcoinosv3-787dd33d40cc33c32dc9f138561c1b58f6a765e7.tar.gz
coinosv3-787dd33d40cc33c32dc9f138561c1b58f6a765e7.zip
TEMP: carousel drag diagnostics (window.__dl ring buffer) logging each release decision (vel/travelled/dir/from/best) and settle outcome, to capture what a real failing flick does. To be removed once diagnosed
Co-Authored-By: Claude Fable 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01MrkLsNScXe9b6BviUSdmMr
-rw-r--r--src/app.js14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/app.js b/src/app.js
index fa2f966..956d465 100644
--- a/src/app.js
+++ b/src/app.js
@@ -3179,6 +3179,16 @@ function offlineBanner() {
// Lightning) or Savings (on-chain). The balance card headline, the Receive
// pane, and the gift source all follow it.
const ACCOUNT_KEY = 'btc-wallet-account';
+// TEMP carousel diagnostics: a ring buffer of the last drag decisions, read
+// via window.__dl to see what a real failing flick actually did. Remove once
+// the snap-back report is settled.
+function dlog(s) {
+ try {
+ const a = (window.__dl = window.__dl || []);
+ a.push(Math.round(performance.now()) + ' ' + s);
+ if (a.length > 60) a.shift();
+ } catch {}
+}
// Spending is opt-in: a wallet is born on-chain only, and the second balance
// (with its toggle, swipe, and Move money) appears once the user sets it up —
// or the moment money is already there (a restored wallet, a claimed gift),
@@ -3409,7 +3419,7 @@ function balanceCard() {
// While a finger or mouse button is still DOWN nothing switches — hovering
// a card mid-drag is browsing, not choosing; release is the choice.
const settle = (el) => {
- if (el._dragging) return;
+ if (el._dragging) { dlog('settle-skip:dragging'); return; }
const mid = el.scrollLeft + el.clientWidth / 2;
let best = 0, bestD = Infinity;
[...el.children].forEach((k, i) => {
@@ -3417,6 +3427,7 @@ function balanceCard() {
if (d < bestD) { bestD = d; best = i; }
});
const view = ORDER2[best];
+ dlog('settle sl=' + Math.round(el.scrollLeft) + ' nearest=' + view + ' cur=' + accountSel());
if (view && view !== accountSel()) {
// the scroll already rests on this card — mark it aligned so the
// post-render pass skips its layout read instead of re-aligning
@@ -3511,6 +3522,7 @@ function balanceCard() {
if (Math.abs(vel) > 0.12) dir = vel < 0 ? 1 : -1; // quick flick
else if (Math.abs(travelled) > 0.15) dir = travelled > 0 ? 1 : -1; // pulled ~a sixth of a card
const best = Math.max(0, Math.min(kids.length - 1, fromIdx + dir));
+ dlog('release vel=' + (Math.round(vel * 100) / 100) + ' travelled=' + (Math.round(travelled * 100) / 100) + ' dir=' + dir + ' from=' + fromIdx + ' best=' + best + ' sl=' + Math.round(el.scrollLeft));
const k = kids[best];
if (k) el.scrollTo({ left: k.offsetLeft + k.offsetWidth / 2 - el.clientWidth / 2, behavior: 'smooth' });
// Restore mandatory snap only once THIS glide has come to rest, and