Render the dropped card at release, and pin the hold's timeout
03's sharpened settle rule: rendering the arrangement means rendering the card — at release the shadow swaps for the dropped card(s) drawn in place immediately, the appear never waiting for the echo reload. The committed hold now carries the landing (ids, payload titles, operation) and surfaces read one DropLanding seam: within-board moves draw the real faces at their proposed slots under the arriving card's own key, so the echo is an invisible content swap; cross-board card arrivals draw payload-titled faces keyed positionally, so the echo reads as an ordinary arrival. Cross-board lane arrivals deliberately keep their shadow until the echo — a lane's face is a whole column with no honest payload equivalent. The 1500 ms failed-write timeout is now seamed (injectable duration, extracted expire) and pinned by tests. Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
@@ -456,6 +456,14 @@ struct BoardDropContext {
|
||||
///
|
||||
/// The commit is the **destination** store's, one `performWrite` bracket per gesture whatever the
|
||||
/// set's size (DRAG-REORDER.md § The drop commits).
|
||||
///
|
||||
/// The write is the first half; the second is the **settle** (`DragSession.commit`). The write is
|
||||
/// still in flight when this returns, so the session flips from proposing to committed and the
|
||||
/// slot the shadows were holding starts drawing the dropped cards themselves — "at release the
|
||||
/// shadow is replaced by the dropped card(s) drawn in place immediately, the appear never waiting
|
||||
/// for the echo" (03-board-ui.md § Motion, sharpened 2026-07-28). The survivors and the resolved
|
||||
/// operation are handed over rather than re-derived, because the overlay must show exactly what
|
||||
/// this call wrote: the same run, and a copy's originals back where a copy leaves them.
|
||||
func commitDrop() -> Bool {
|
||||
guard session.isActive, let kind = session.kind, let sourceRoot = session.sourceRoot else {
|
||||
return false
|
||||
@@ -514,8 +522,9 @@ struct BoardDropContext {
|
||||
}
|
||||
}
|
||||
|
||||
// The committed-overlay hold: keep drawing the arrangement until this store's next snapshot.
|
||||
session.commit(into: store)
|
||||
// The committed-overlay hold: keep drawing the arrangement — the dropped cards included —
|
||||
// until this store's next snapshot.
|
||||
session.commit(into: store, survivors: survivors, operation: operation)
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user