Write apps/web/docs/components-messaging.md for src/components/messaging/: MessageThread, InboundMessageRow, EncryptedThumbnail, UnavailableMessagePlaceholder — the components that render the decrypted (or undecryptable) message stream.
Acceptance criteria:
- Each component documented with props and where it is rendered
- Documents the states a message row can be in — decrypted, unavailable/pre-link, deleted tombstone, system event, file/image — and which component handles each
- Explains
UnavailableMessagePlaceholder and the distinction it must preserve: "this device legitimately has no envelope" is not the same as "decryption failed"
- Documents
EncryptedThumbnail's decrypt-to-object-URL flow and its cleanup obligation
Write
apps/web/docs/components-messaging.mdforsrc/components/messaging/:MessageThread,InboundMessageRow,EncryptedThumbnail,UnavailableMessagePlaceholder— the components that render the decrypted (or undecryptable) message stream.Acceptance criteria:
UnavailableMessagePlaceholderand the distinction it must preserve: "this device legitimately has no envelope" is not the same as "decryption failed"EncryptedThumbnail's decrypt-to-object-URL flow and its cleanup obligation