Repository navigation
feat(ui,desktop): swipe an Inbox row right to mark it read or unread - #3641
Merged
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
luke-agent
Bot
force-pushed
the
luke/feat-inbox-swipe
branch
from
October 18, 2026 17:03
2a4e3b4 to
bc9e69f
Compare
luke-agent
Bot
force-pushed
the
luke/feat-inbox-read-unread
branch
from
October 18, 2026 17:03
97c5d12 to
99c92f4
Compare
luke-agent
Bot
force-pushed
the
luke/feat-inbox-swipe
branch
from
October 18, 2026 17:20
178c0b6 to
59eb1b3
Compare
luke-agent
Bot
force-pushed
the
luke/feat-inbox-swipe
branch
from
October 18, 2026 17:36
59eb1b3 to
0d4a06a
Compare
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Oct 18, 2026
luke-agent
Bot
force-pushed
the
luke/feat-inbox-swipe
branch
from
October 18, 2026 17:56
0d4a06a to
26b1ed1
Compare
github-merge-queue
Bot
removed this pull request from the merge queue due to a conflict with the base branch
Oct 18, 2026
A ListRow may offer one swipe right (`swipe`), two-stage as Mail's: past 24px a release leaves the row open on the act's button, which a click presses; past 60% of the row it arms, the button brighter and its label riding the row's edge, and a release acts with no click. A pointer drag and a trackpad's two-finger swipe (horizontal wheel deltas, let go once the wheel rests on the frames' own clock) both drive it. A press or a wheel elsewhere, a click on the open row, or swiping it back closes it; swiping left does nothing. A cancelled pointer never acts, and nor does a swipe whose act changed under it as the list redrew the row. The face moves on transform and the button shows on opacity, timed from the motion tokens, so reduced motion holds the settling still. The Inbox's rows offer it as Read or Unread, marking the item through the same act as the hover button, the menu, and U. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…elds to a press and to scrolling A press on the row's own acts is theirs, never a swipe's; a press or a wheel anywhere interrupts a trackpad's swipe still waiting for its wheel to rest, which then does nothing; and a wheel more up or down than sideways always scrolls the list, a swipe under way or not. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
…en let go Closing a row lets go of a pointer's swipe still held, releasing its capture and swallowing its release's click, so a press or a wheel elsewhere mid-drag leaves the act undone. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
Only a pointer's click follows a swipe's release; a keyboard's click, which no press came before, always lands, so an interrupted swipe let go off its row leaves the row's Enter working. Co-authored-by: luke-agent[bot] <339870089+luke-agent[bot]@users.noreply.github.com>
luke-agent
Bot
force-pushed
the
luke/feat-inbox-swipe
branch
from
October 18, 2026 18:07
26b1ed1 to
8acf4bd
Compare
14 tasks done
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR 3 of 3 for the Inbox list rows: the two-stage swipe from
docs/proposals/inbox-threads.md§4 (approved by Dean). It builds on #3633 (unread and marking read), now merged.@luke/uiListRowswipe(list-row.tsx,use-row-swipe.ts,list-row.css). A row can offer one act on a right swipe:{ label, icon, onAct }. The swipe has two stages, like Mail:requestAnimationFrame's own clock, the wayuse-row-drag.tstimes things. NosetTimeout.pointercancel);docs/DESIGN.md):transformand settles on--duration-fast/--spring-fast. While the finger or wheel is moving it follows with no transition.opacity. It stays hidden at rest, so its edge never shows round the face's rounded corners, and it hides only after the face has slid home.U.The Inbox (
inbox-list.tsx). Rows offer the swipe as Read (MailOpen) on an unread item and Unread (Mail) on a read one. It marks the item through the same act as the hover button, the menu, andU.Bundle budget. The swipe adds about 1.6KB gzipped to the panel's up-front graph. This PR no longer touches
apps/desktop/bundle-budget.json. An earlier push re-recorded the panel's baseline, because main stood 33 bytes under its ceiling. Main has since re-recorded every baseline (#3305), so the panel now has its 5% room again, and this PR builds within it.Screenshots
Captured with Playwright from the jsdom fixtures and the built
styles.css. The swipe states were set on the rendered rows: Backfill rests open, and Retry is swiped long and armed.Evidence
@luke/uiand@luke/desktop, 0 errors.apps/desktop/srcandpackages/ui/src.pnpm exec vitest run packages/uiplus the desktop-inbox, desktop-tasks, desktop-home, person-page, desktop-factory, and automations-page suites. 78 files, 689 tests, all passing.list-row.test.ts(+13):desktop-inbox.test.ts(+1): a long swipe marks an unread item read, and a short swipe opens on Unread for a read item, whose button marks it. Neither opens the item.desktop-inbox.test.tsanddesktop-tasks.test.ts) now find a row's press asli button.luke-list-row-main, because a swiped row's press stands inside its sliding face.Invariants
./scripts/check.shgreen. (CI)LUKE_UPDATE_FIXTURESnot run, or diff explained line by line). (CI)AGENTS.md"Testing")astype assertion outside the allowlisted files. (CI via anti-slop)Effect.runPromise/runSync/runForkoutside the runtime edges and the shimstools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-run-promise-outside-edges)setTimeout/setInterval/new Promise/AbortController/fs.watchoutside the filestools/anti-slop/effect-edges.jsonrecords. (CI viaanti-slop/no-raw-async-primitives)pnpm discarded-effect)vitest run --reporter=json)AGENTS.md's "The permanent adaptors" with the reason it stays.CLAUDE.md/AGENTS.mdsentence naming a changed part is edited; root pair stays byte-identical. (CI for pair existence; manual for wording)PRIVACY.mdunchanged, or the change is a product decision called out in the PR body.package.jsondeps match what the sources import by bare specifier;effectviacatalog:. (CI)@effect/platform-node,effect/sql) behind a barrel the renderer or a web function opens. (CI: existing renderernode:grep plus a new grep for those specifiers in renderer bundles)Notes
x - deltaX). The thresholds (24px, 60%) are the show's starting values.Made with Luke
Summary by cubic
Adds a two-stage swipe to Inbox list rows so an item can be marked read or unread without opening it. A short swipe right leaves the row resting open on a Read or Unread button; swiping past 60% of the row arms it and marks the item on release. Pointer drags and trackpad two-finger swipes both drive it, via a new
swipeprop on@luke/ui'sListRow.Uuse.Written for commit 8acf4bd. Summary will update on new commits.