+ {/* Avatar + extra-participants badge */}
+
+
+ {initials(primary)}
- )}
- {thread.pinned && (
-
- )}
- {timeLabel(thread.last_message_at)}
+ {extra > 0 && (
+
+ +{extra}
+
+ )}
+
+
+ {/* Sender column */}
+
+
+ {names}
+
+ {thread.message_count > 1 && (
+
+ {thread.message_count}
+
+ )}
+
+
+ {/* Subject + snippet (extra left margin -> 3x the gap to the sender). */}
+
+
+ {thread.subject}
+
+
{thread.snippet}
+
+
+ {/* Right rail: four evenly-spaced icons, vertically centred. The
+ paperclip and pin keep fixed slots (archive/trash reserve their
+ space while hidden), and the date is an overlay on the right that
+ is simply hidden on hover to reveal archive + trash — so nothing
+ ever shifts between the normal and hover states. */}
+
+ {/* Attachment: fixed slot (reserved even when empty) so the rail
+ width — and thus the excerpt width — is the same in every row. */}
+
+ {thread.has_attachments && }
+
+ {/* Pin: pink and always shown when pinned; otherwise revealed on hover. */}
+
+ {/* Archive (or Restore in Trash/Spam/Archive) + delete: hover-only,
+ but reserve their slots always. In Trash, delete is permanent. */}
+ {isRemovalFolder ? (
+
+ ) : (
+
+ )}
+
+ {/* Date overlay, aligned to the right edge (over the archive/trash
+ slots); hidden on hover so the actions show through. */}
+
+ {timeLabel(thread.last_message_at)}
+
+
-