Stage 17 round 6 (#3): drag-reorder rack tiles with a visual gap
CI / changes (pull_request) Successful in 2s
CI / unit (pull_request) Successful in 8s
CI / integration (pull_request) Successful in 14s
CI / ui (pull_request) Successful in 30s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m7s

Dragging a rack tile and dropping it back on the rack reorders it: the dragged tile is
lifted out (the drag ghost stands in) and the tiles at/after the pointer's drop slot slide
right to open a gap there, so the drop position is visible. On drop the rack and its stable
ids are permuted (reorderIndices, unit-tested). Reorder applies only with no pending tiles,
so it stays a clean permutation; dropping on a board cell still places as before. Server
persistence of the order follows (#4).
This commit is contained in:
Ilia Denisov
2026-06-07 12:21:09 +02:00
parent 35666e1705
commit 2b0b1c0035
4 changed files with 106 additions and 7 deletions
+10
View File
@@ -10,6 +10,7 @@ import {
rackView,
recallAt,
recallIndex,
reorderIndices,
reset,
toSubmit,
} from './placement';
@@ -122,3 +123,12 @@ describe('placementFromHint', () => {
expect(p.pending.map((t) => t.letter)).toEqual(['A']);
});
});
describe('reorderIndices', () => {
it('lifts an element and drops it at the given slot among the others', () => {
expect(reorderIndices(4, 0, 2)).toEqual([1, 2, 0, 3]);
expect(reorderIndices(4, 3, 0)).toEqual([3, 0, 1, 2]);
expect(reorderIndices(4, 1, 1)).toEqual([0, 1, 2, 3]); // back to identity
expect(reorderIndices(3, 0, 99)).toEqual([1, 2, 0]); // slot clamped to the end
});
});