The Edge of the Screen Is Tomorrow — Drag to Move a Task Across Days in the Daily View
It started with one piece of feedback from a thread. In Fecit mobile's daily timeline and list, drag a task to the left edge of the screen to move it to yesterday, or the right edge to move it to tomorrow. Then we chased an optimistic update that wouldn't stick and a flicker where the block snapped back before disappearing.
The Edge of the Screen Is Tomorrow — Drag to Move a Task Across Days in the Daily View
This feature began with a single piece of feedback from a thread. Tap a date in Fecit mobile’s calendar and the daily view for that day opens. In timeline mode you can drag a block to change its time and pull the top or bottom handle to change its length. But you can’t change the date. To push something you didn’t finish today to tomorrow, you had to open the detail and edit the date. The weekly timeline lets you drag into the next day’s column, but the daily view has only one column.
1. With one column, the screen edge is the neighbor
Day moves in the weekly timeline divide the horizontal drag distance by the column width to count days. The daily view has no width to divide by. So we changed the rule. If your finger lands within 48pt of the left edge of the screen, it’s yesterday; within 48pt of the right edge, it’s tomorrow. The judgment uses the finger’s position, not the block’s. An all-day block is as wide as the screen, so judging by the block’s edge would put it in the “tomorrow” zone the moment you lift it.
Vertical movement still works. Drag to change the time and land on the edge, and both the time change and the day move apply together. Same grammar as the weekly timeline.
2. Visible before you get there
At first the blue band appeared only when your finger entered the edge zone. The decision went the other way: “Show the yesterday/tomorrow markers on the edges even before you get there. That’s how people learn they can drop there.”
That was right. A drop zone nobody knows about might as well not exist. Now the moment you lift a block, faint bands with “Yesterday” and “Tomorrow” labels appear on both edges. Only the side your finger enters gets darker, with a single light haptic tap. The labels sit rotated ninety degrees inside the vertical band, and in the first version “Next day” was truncated to “Next…”. Rotation is a transform applied after layout, so the text box was clipped inside the 40pt band width before it turned. We widened the box well past the band, and shortened the copy to “Yesterday/Tomorrow” while we were at it.
3. The screen stays; the toast speaks
We also had to decide whether the screen follows the task to its new date after the drop. It stays. Pushing several unfinished tasks to tomorrow one after another feels natural that way, and the week strip at the top shows where they went. The block disappears and a toast says “Moved to the next day.” Tap “View” on the toast to jump to that date.
4. The optimistic update wouldn’t stick
The first reaction after trying it on a device was, “This isn’t an optimistic drop?” After releasing, the block sat where it was until the server replied.
The drop code was writing the new date to the local cache first. The problem came next. When the cache changes, the screen merges the re-query result with the previous models, and there’s a guard that reuses the old model when the revision matches. It’s there to avoid pointless re-renders. Optimistic writes don’t bump the revision, so the model carrying the new date was thrown away and the old-date model stayed. Until the server response raised the revision.
Vertical time drags had the same problem, but it never showed. The block stayed glued to your finger, so the screen already looked moved even when the data arrived late. A day move needs the block to vanish, so there was nowhere to hide. Kanban rank and creation time were already compared separately for exactly this reason. Start and due dates joined that list.
5. It snaps back, then disappears
Once that was fixed, the next reaction was, “It goes back to where it was, then disappears.” This one was a timing gap between two threads. When a block is dropped outside the edge zone, the animation that snaps it back to its original spot starts immediately on the UI thread. Removing the block from the cache update comes a beat later on the JS thread. In between, you could see the block returning.
For edge drops, the block now hides in place on the UI thread instead of snapping back. The cache update that follows does the actual removal. We added a safety net too: if the cache write is blocked and the block is still there, it becomes visible again after 1.5 seconds. An invisible block that never leaves is the worst possible outcome.
6. The list view too
The daily view has a list mode alongside the timeline. “No drag and drop in the list?” was the last piece of feedback. The list is sorted by start time, so a reordering drag makes no sense. We added only the edge drop, with no reordering. The long-press row component built for manual ordering in the memo list came over as is, minus the insertion line and slot detection, plus the finger’s horizontal coordinate. Lift a row and the same bands appear, the same rule moves it, and the same toast speaks.
Blocks spanning two days, virtual routine occurrences, and actual-time record blocks were never draggable, so they’re excluded here as well. Desktop doesn’t have this yet. One piece of feedback, four decisions, and two bugs made up the day.