- Shipped
- September 2, 2026 at 4:36 AM UTC
- Author
- Kamo
- Commit
- f2d59e6
Inbox, Drafts, Sent, Junk, Trash and Archive stop moving. They hold that order at the top of the folder list, and everything the member made sits underneath under a "My Folders" heading, still freely reorderable. The pinned rows are not registered with dnd-kit at all rather than refusing the drop: a row that merely decoders to move is still a drop target, so dropping a folder onto the inbox would animate the whole list and then silently put it back. They keep the grip column as empty space, so both groups share one left edge instead of reading as two lists. Pinning is deliberately narrower than isSystemFolder, which matches the leaf at any depth so a member's own Clients.Archive draws the archive icon. That is the right call for an icon and the wrong one for a position, so pinnedRank looks at roots only — a folder someone filed under their own parent stays theirs to arrange, as do the subfolders of a pinned folder. Spam sits in Junk's slot. The backend normalises to Junk wherever it writes, so a server listing "Spam" is naming the same folder and should not fall in among the member's own. The rank lives in folderTargets, which already owns the shared folder vocabulary, so the move picker orders its roots the same way and the two surfaces cannot drift apart again. applyFolderOrder moves to lib/email beside it: vitest's include globs do not cover app/hooks, so ordering logic left there was collected by nothing and passed by never running. Members who dragged their inbox before this change still name it in their saved preference. Those entries are ignored, and the next drag writes them out.