<!-- source-hash: 153106e38c4d90f80e36ec34a77c2d0d -->
Barrel export file that consolidates all chat-surface entity card components under a single import path, enabling consumers to access any presentation card without knowing its subdirectory location.

## Key Components

### Supporting Primitives
- **`EntityAuthorCard`** — Renders author metadata with `EMPTY_AUTHOR_PLACEHOLDER` fallback
- **`BlogImagePlaceholder`** — Placeholder image for blog content
- **`AdminContentCard`** — Admin-facing content card

### Flat Cards
- **`BlockCard`** — Generic block-level card
- **`ChatTicketItem`** — Ticket representation within chat surfaces
- **`ChatVideoEntityCard`** — Video entity display in chat

### Pure-Presentation Cards (with Skeleton variants)
| Card | Skeleton | Notes |
|------|----------|-------|
| `BlogCard` | `BlogCardSkeleton` | — |
| `CaseStudyCard` | `CaseStudyCardSkeleton` | — |
| `CustomerInterviewCard` | `CustomerInterviewCardSkeleton` | — |
| `InvestorUpdateCard` | `InvestorUpdateCardSkeleton` | — |
| `OnboardingGuideCard` | `OnboardingGuideCardSkeleton` | — |
| `RoadmapCard` | `RoadmapCardSkeleton` | Includes `VoteType` + `RoadmapVoteButton` |
| `GitHubActivityCard` | `GitHubActivityCardSkeleton` | — |
| `SlackMessageCard` | `SlackMessageCardSkeleton` | — |
| `HubspotTicketCard` | `HubspotTicketCardSkeleton` | — |
| `DataRoomDocCard` | `DataRoomDocCardSkeleton` | — |
| `ProgramCard` | `ProgramCardSkeleton` | — |
| `CampaignCardAdmin` | `CampaignCardAdminSkeleton` | — |
| `GenericEntityCard` | `GenericEntityCardSkeleton` | Fallback catch-all |

### Dispatch Layer
- **`renderChatInlineEntityCard`** — Renders the correct card given an entity type
- **`ChatCardLoader`** — Async card loader; new card types registered in `./dispatch.tsx` via `CHAT_CARD_REGISTRY`

## Usage Example

```typescript
// Single import replaces per-directory imports
import {
  BlogCard,
  BlogCardSkeleton,
  RoadmapCard,
  ChatCardLoader,
  renderChatInlineEntityCard,
  type BlogCardProps,
  type ChatCardRenderOptions,
} from '@/components/entity-cards'

// Pure-presentation: consumer owns the anchor
function MyFeed({ post }: { post: BlogCardProps }) {
  return (
    <NavLinkAnchor href={post.href}>
      <BlogCard {...post} />
    </NavLinkAnchor>
  )
}

// Dynamic dispatch — resolves card type at runtime
function ChatEntity({ entity, options }: { entity: unknown; options: ChatCardRenderOptions }) {
  return renderChatInlineEntityCard(entity, options)
}
```

> **Design contract:** All cards in this directory are **pure presentation** — they accept a pre-resolved `href` and entity data as props and contain no internal navigation logic. Click handling belongs to the consumer (`NavLinkAnchor` or `NavLinkAnchorViaRuntime`).