From f32e7343e8350fcf7a6d2bf754f636e8001f86cc Mon Sep 17 00:00:00 2001 From: jelveh Date: Sat, 8 Aug 2026 00:07:57 -0700 Subject: [PATCH] fix(gui): refill the folder well when the merge countdown restarts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The merge dwell pins its stillness anchor at first contact with the tile, and a hand decelerating INTO a target routinely covers more than the 7px allowance between that moment and the first tick — so the countdown quietly restarts. The well's fill, tuned to the same 460ms, had already completed by then and just sat there half-open: a drop it seemed to promise a folder for actually reordered. Restart the fill with the countdown, so what the well shows is always the countdown that is actually running. --- src/gui/src/UI/Dashboard/TabApps.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/gui/src/UI/Dashboard/TabApps.js b/src/gui/src/UI/Dashboard/TabApps.js index b0d5fcfb2..47b8b55e4 100644 --- a/src/gui/src/UI/Dashboard/TabApps.js +++ b/src/gui/src/UI/Dashboard/TabApps.js @@ -1966,6 +1966,16 @@ const TabApps = { if ( moved > DRAG_MERGE_TRAVEL ) { d.mergeAnchorX = d.lastClientX; d.mergeAnchorY = d.lastClientY; + // The well's fill IS this countdown to the user (the CSS + // transition runs the same DRAG_MERGE_DWELL_MS) — and the + // hand that decelerates INTO a tile routinely trips this + // restart, because the anchor was pinned back at first + // contact. Refill from empty, or the well sits full while + // the countdown quietly runs again, promising a folder the + // drop wouldn't make. + overTile.classList.remove('myapps-tile-merge-pending'); + void overTile.offsetWidth; // commit the empty state + overTile.classList.add('myapps-tile-merge-pending'); d.mergeTimer = setTimeout(tick, DRAG_MERGE_DWELL_MS); return; }