import type { ReactNode } from 'react';
export interface ChatMessageRowProps {
    /** Display name (bold, top-left). */
    displayName: string;
    /** Avatar image URL. Proxied via `useProxiedImageUrl`; falls back to
     *  initials in a same-sized `rounded-lg` box when absent. */
    avatarUrl?: string | null;
    /** Pre-formatted relative-time label (e.g. "2h ago"). Caller formats it —
     *  Slack passes its server `displayTime`, tickets pass
     *  `formatRelativeTime(createdAt)`. Empty/undefined hides the time. */
    timeLabel?: string | null;
    /** Message body. Empty + no footer renders nothing under the header. */
    body: string;
    /** Per-surface slot under the body: Slack reply badge / ticket attachments. */
    footer?: ReactNode;
}
export declare function ChatMessageRow({ displayName, avatarUrl, timeLabel, body, footer, }: ChatMessageRowProps): import("react").JSX.Element;
/**
 * Skeleton with 1:1 structural parity to `<ChatMessageRow>` — SAME wrapper
 * (`flex gap-2 md:gap-3`), SAME avatar box (`w-8 h-8 md:w-10 md:h-10
 * rounded-lg`), SAME header `mb-1`, and bar heights matching the real
 * name/time/body line-heights so the loading→loaded swap does not reflow.
 */
export declare function ChatMessageRowSkeleton(): import("react").JSX.Element;
//# sourceMappingURL=chat-message-row.d.ts.map