Barrel file that consolidates all chat-surface entity card components, primitives, and utilities into a single import path for consumers. ## Key Components ### Supporting Primitives - **`EntityAuthorCard`** — Author display card with metadata cells (`EntityMetadataValueCell`, `EntityMetadataAuthorCell`) - **`EntityPortraitCard`** — Portrait-style entity card with person data - **`BlogImagePlaceholder`** — Placeholder component for blog cover images - **`useCoverImageFallback` / `hideOnError`** — Hook and utility for cover image error handling - **`AdminContentCard`** — Admin-facing content card - **`WhatIShippedCard`** — Shipped-item card with skeleton loader ### Chat Surface Cards - **`BlockCard`**, **`ChatTicketItem`**, **`ChatVideoEntityCard`** — Flat inline chat cards - **`ProductReleaseCard`** — Release card with size variants and prop builders (`defaultBuildProductReleaseCardProps`, `buildProductReleaseCardProps`) - **`BlogCard`**, **`CaseStudyCard`**, **`CustomerInterviewCard`**, **`InvestorUpdateCard`** — Content-type cards with skeleton loaders - **`OnboardingGuideCard`**, **`RoadmapCard`**, **`GitHubActivityCard`**, **`SlackMessageCard`** — Operational entity cards - **`HubspotTicketCard`**, **`DataRoomDocCard`**, **`ProgramCard`**, **`CampaignCardAdmin`**, **`GenericEntityCard`** — Integration and generic cards ### Dispatch System - **`renderChatInlineEntityCard`** — Function that resolves and renders the correct card for a given entity type - **`ChatCardLoader`** — Component wrapper driven by `CHAT_CARD_REGISTRY` in `dispatch.tsx` ### Utilities - **`programItemToStripProfile`** — Adapter converting program items to strip profile format - **`TaskTypeIcon`**, **`RoadmapVoteButton`** — Shared UI primitives used across card types ## Usage Example ```typescript import { BlogCard, BlogCardSkeleton, ProductReleaseCard, buildProductReleaseCardProps, ChatCardLoader, renderChatInlineEntityCard, type BlogCardProps, } from '@openframe/lib/entity-cards' // Render a blog card — consumer provides the anchor wrapper const props: BlogCardProps = { href: '/blog/my-post', title: 'Hello', coverUrl: '...' } ; // Dispatch a card by entity type in a chat surface renderChatInlineEntityCard({ type: 'blog', entity: blogEntity }, options) // Build rich product release card props const cardProps = buildProductReleaseCardProps(release, { size: 'lg' }) ``` > **Design contract:** All cards in this directory are pure-presentation components — they accept a pre-resolved `href` and entity data as props and contain no internal navigation logic. Consumers are responsible for wrapping cards with their own anchor components (`NavLinkAnchor` or `NavLinkAnchorViaRuntime`).