/**
 * 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.
 *
 * NOTE: the ticket conversation row is NOT here — it renders the shared
 * `<ChatMessageRow>` (`components/chat/chat-message-row.tsx`), the SAME
 * component the OpenMSP Slack-community feed uses, so the two surfaces stay
 * pixel-identical by construction.
 */
import type { ReactNode } from 'react';
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.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.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.Element;
//# sourceMappingURL=dev-card-row.d.ts.map