{/* Header */} {reply.author?.avatarUrl ? ( ) : ( {(reply.author?.displayName ?? reply.author?.handle ?? '?')[0]?.toUpperCase()} )} {reply.author?.displayName ?? reply.author?.handle ?? reply.authorDid} ยท {formatRelativeTime(reply.createdAt)} {isEdited(reply.createdAt, reply.indexedAt) && ( (edited) )} #{postNumber} {/* Content */} {isEditingReply ? ( setIsEditingReply(false)} className="rounded-md px-3 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-foreground" > Cancel {saving ? 'Saving...' : 'Save'} ) : selfLabels && selfLabels.length > 0 ? ( ) : ( )} {/* Plugin slot for post content extensions (e.g., signatures) */} {/* TODO: Compute isFirstByAuthor properly when signatures plugin is built */} {/* Footer */} {reactions && onReactionToggle && ( )} {formatRelativeTime(reply.createdAt)} {canEdit && !isEditingReply && ( { setIsEditingReply(true) setEditContent(displayContent) }} className="flex items-center gap-1 text-muted-foreground transition-colors hover:text-foreground" aria-label={`Edit reply by ${reply.author?.handle ?? reply.authorDid}`} > Edit )} {canDelete && ( setShowDeleteConfirm(true)} className="flex items-center gap-1 text-muted-foreground transition-colors hover:text-destructive" aria-label={`Delete reply by ${reply.author?.handle ?? reply.authorDid}`} > Delete )} {onReply && ( onReply({ uri: reply.uri, cid: reply.cid, authorHandle: reply.author?.handle ?? reply.authorDid, snippet: reply.content.slice(0, 100), }) } > Reply )} {canReport && onReport && }