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