/**
 * Shared row chrome for any `DevSectionPage` list (delivery, tickets,
 * future sections). One source of truth for the layout that every
 * dev-section card row uses:
 *   left column  → title (h3) / subtitle (h5 uppercase) / description
 *                  (h4 line-clamp-3), each in a fixed min-height block
 *                  so rows align across the grid
 *   right column → caller-supplied stacked badges
 *
 * Surface stays small on purpose — `rightBadges` is a `ReactNode` so
 * the caller decides how many badges (delivery: 2, tickets: 1-2,
 * future: anything). No behavior baked in: the caller wraps the row
 * in a `<div>` (static, like delivery) or `<button>` (clickable, like
 * tickets) and renders the row content via this component.
 *
 * Pair with `DevCardRowSkeletonList` for the loading state — the
 * skeleton mirrors the same min-heights so the in-flight UI doesn't
 * shift the layout when real data lands.
 */
import type { ReactNode } from 'react';
import { type TicketAttachment } from '../../ui/ticket-attachments-list';
export interface DevCardRowContentProps {
    title: string;
    /** Single-line uppercase metadata (e.g. "UPDATED today, #4271, Code review"). */
    subtitle: string;
    /** 3-line description block. Empty string renders the fallback. */
    description: string;
    /** Fallback copy when `description` is empty. Defaults to a generic
     *  string; ticket / delivery surfaces override. */
    emptyDescription?: string;
    /** Right column — caller renders its own stacked badges. */
    rightBadges: ReactNode;
}
export declare function DevCardRowContent({ title, subtitle, description, emptyDescription, rightBadges, }: DevCardRowContentProps): import("react/jsx-runtime").JSX.Element;
export interface ConversationCardRowProps {
    /** Display name of the message author. "You" for the current customer,
     *  "Support team" for any non-customer engagement. */
    author: string;
    /** Optional short role label rendered as an inline chip beside the
     *  author name — e.g. "You", "Original message", "Resolution". Keeps
     *  the header line scannable on long threads. */
    role?: string;
    /** Avatar image URL. Falls back to `author` initials when missing
     *  (initials derived by `<SquareAvatar>` via `getFirstLastInitials`). */
    avatarSrc?: string;
    /** ISO timestamp. Renders via `formatRelativeTime` with the absolute
     *  string in the `title` for hover-precision. `null`/`undefined`
     *  hides the timestamp entirely (e.g. the original ticket body which
     *  shares the ticket's `created_at`). */
    timestamp?: string | null;
    /** Free-form message body. Empty string + zero attachments renders
     *  nothing (the row is skipped at the caller level). */
    body: string;
    /** Files attached to this message. Rendered through the lib's
     *  `<TicketAttachmentsList>` so the chip styling, file-icon picker
     *  and download button match every other attachments surface. */
    attachments?: TicketAttachment[];
    /** Author bucket — kept for semantic markup + future styling needs.
     *  Does NOT drive avatar color anymore: the avatar always renders
     *  with the canonical `<SquareAvatar>` defaults (ODS palette,
     *  derived by the component itself). Adding bespoke bg-color
     *  overrides per role drifted from the ODS theme and was reverted. */
    variant?: 'current-user' | 'support';
}
export declare function ConversationCardRow({ author, role, avatarSrc, timestamp, body, attachments, variant, }: ConversationCardRowProps): import("react/jsx-runtime").JSX.Element | null;
/**
 * Skeleton variant matching `ConversationCardRow`'s layout. Used by
 * the ticket-detail-drawer's timeline panel while engagements load —
 * mirrors avatar + header + body so the loading→loaded swap doesn't
 * reshape the row vertically.
 */
export declare function ConversationCardRowSkeleton(): import("react/jsx-runtime").JSX.Element;
/** Multi-row skeleton list — drop-in for the conversation timeline's
 *  loading state. Defaults to 2 rows so the placeholder fits in a
 *  reasonable vertical footprint without dominating the drawer. */
export declare function ConversationCardRowSkeletonList({ rows }: {
    rows?: number;
}): import("react/jsx-runtime").JSX.Element;
/**
 * Skeleton rendering for a single row — the bars mirror the same
 * min-heights as `DevCardRowContent` so the loading→loaded swap
 * doesn't reflow.
 */
export declare function DevCardRowSkeleton(): import("react/jsx-runtime").JSX.Element;
/**
 * The standard "5 skeleton rows inside a bordered card" loading state
 * used by every list shell. Both delivery (`delivery-table.tsx`) and
 * tickets (`tickets-list.tsx`) mount this directly.
 */
export declare function DevCardRowSkeletonList({ rows }: {
    rows?: number;
}): import("react/jsx-runtime").JSX.Element;
//# sourceMappingURL=dev-card-row.d.ts.map