/** * `` — THE single source of truth for a Slack-channel-style * message row. Rendered by BOTH: * - the OpenMSP Slack-community feed (hub `components/slack/chat-interface.tsx`) * - the customer ticket conversation feed (lib `ticket-detail-drawer.tsx`) * * Both surfaces render THIS component, so they are pixel-identical by * construction — avatar size, font sizes, weights, spacing, and line-heights * can never drift apart. The markup is the verbatim Slack `MessageItem` layout * (avatar `w-8 h-8 md:w-10 md:h-10 rounded-lg object-cover` + bold name + * relative time + `whitespace-pre-wrap` body). Colors are ODS theme tokens * ONLY (`text-ods-text-primary` / `text-ods-text-secondary`). The `text-[Npx]` * / `font-body` / `leading-*` utilities are FONT/SIZE, not color — they are * required to match the Slack typography exactly. * * `footer` is the only per-surface variation slot: the Slack feed passes its * "N replies" badge; the ticket feed passes ``. */ 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 — a plain string (rendered `whitespace-pre-wrap`) or a * pre-rendered node (the Slack surfaces pass mrkdwn-formatted nodes). * Empty/absent + no footer renders nothing under the header. */ body: string | ReactNode; /** 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 `` — 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