<!-- source-hash: 756619c21c965403499e06eb7fef94fa -->
Pure presentation component for rendering investor update cards in two density modes (`default` and `sm`), with no internal click logic — callers supply the resolved `href`.

## Key Components

### `InvestorUpdateCard`
Main card component. Renders differently based on the `size` prop:
- **`default`** — delegates to `AdminContentCard` with image, title, summary, badges, and period meta
- **`sm`** — compact horizontal layout using shared `COMPACT_CARD_*` utility classes

### `InvestorUpdateCardSkeleton`
Loading placeholder matching the visual footprint of each density mode. Uses `animate-pulse` for the default size.

### `InvestorUpdateCardProps`

| Prop | Type | Description |
|------|------|-------------|
| `update` | `InvestorUpdate` | Entity data |
| `href` | `string` | Resolved detail URL (caller-supplied) |
| `target` | `'_blank'` | Optional new-tab behavior |
| `placeholderUrl` | `string \| null` | OG fallback when `featured_image` is absent |
| `size` | `'default' \| 'sm'` | Card density (defaults to `'default'`) |

## Usage Example

```typescript
// Default density — full card
<InvestorUpdateCard
  update={investorUpdate}
  href={`/investor-updates/${investorUpdate.slug}`}
  placeholderUrl="/images/update-placeholder.png"
/>

// Compact horizontal — e.g. inside a chat dispatch or sidebar list
<InvestorUpdateCard
  update={investorUpdate}
  href={`/investor-updates/${investorUpdate.slug}`}
  target="_blank"
  rel="noopener noreferrer"
  size="sm"
/>

// Skeleton while data loads
<InvestorUpdateCardSkeleton size="sm" />
```

> **Design note:** The component intentionally owns zero click/navigation logic. Tab behavior (`target="_blank"`) is resolved externally (e.g. via `computeIsNewTab`) and passed in, keeping the component fully declarative.