use-files-list-hotkeys.tsfeat(files): every file surface renders one row (design: unified-files-ui phases 3-6) /brain, a conversation's Files tab and an agent's Output/Memory tabs were ten row renderers that had each re-decided indentation, icon chrome, type size, selected colour and separators. The same file looked like a different object depending on where you found it. They now all render FileListRow. Shape is Google Drive's, reworked from review: - the column header IS the top row; no count strip above it - the right edge is one fixed cell holding a ⋮ menu, so a row with four affordances and a row with one still end at the same x - no "Edited by" column — the actor rides inside Modified ("3 days ago by Jesse Li", "by you" for the viewer). The two read as one fact, and splitting them spent a column's width to say something the reader reassembles anyway - a folder's count sits beside its title, "Archives (50)", not as a lone number at the far right where it reads as a column only some rows have - "New file"/"New folder" live in the header's + and in each folder's own ⋮, never a strip above the list that pushes the files down the page - a scope root is a ROW, not a section header. It is a folder — you open it, drop into it, create inside it — so it gets the folder's row, just a prominent one Selection and keyboard, matching the thread list where it exists and diverging only where the divergence is the point: - hovering cross-fades the tile into a square checkbox in the same footprint; pure CSS, because a tree re-rendering every row on mouse-move is unusable - hover reaches the keyboard by CustomEvent into a ref, never state - keys act on hover FIRST, then selection — the cursor is the more specific statement of intent - the letters are the task list's (w delete, x select, ⇧X range), but w CONFIRMS here: mail can delete instantly because its undo stack reverses a label change, and a folder takes its whole subtree with it Two bugs the migration surfaced, both from Radix restoring focus to a menu trigger a tick after close: a popover opened from a ⋮ item dismissed itself, and Rename's autofocused input blurred and cancelled in the same frame. Co-Authored-By: Claude Opus 5 (1M context) <<email>>Aug 31, 2026, 11:21 PM