<!-- source-hash: 7e8d4cbbf42c408ee48d1318fbf9c4e3 -->
Unified SEO & Open Graph editor component that combines meta fields (title, description, keywords), OG image upload, and a live preview into a single reusable panel. Designed for content editors across blog posts, case studies, and product releases.

## Key Components

### `OGEditorPreview`
Main exported component that renders a card-style panel with:
- **SEO Title + Keywords** — side-by-side `Input` fields (responsive grid)
- **SEO Description + OG Image** — `Textarea` paired with an injected upload widget
- **OG Preview** — rendered below a divider via the `OGPreviewComponent` slot

### `OGEditorPreviewProps`
Full interface defining:

| Prop | Type | Description |
|------|------|-------------|
| `seoTitle` / `seoDescription` / `seoKeywords` | `string` | Controlled SEO field values |
| `ogImageUrl` | `string` | Current OG image URL |
| `title` / `summary` / `featuredImage` | `string` | Auto-populate sources from parent content |
| `categories` | `Array<{name, slug}>` | Optional category metadata |
| `OGImageUploadComponent` | `React.ReactNode` | Upload widget injected by parent |
| `OGPreviewComponent` | `React.ReactNode` | Preview widget injected by parent |
| `disabled` | `boolean` | Disables all inputs |

## Usage Example

```typescript
import { OGEditorPreview } from './og-editor-preview';

<OGEditorPreview
  seoTitle={post.seoTitle}
  seoDescription={post.seoDescription}
  seoKeywords={post.seoKeywords}
  ogImageUrl={post.ogImageUrl}
  title={post.title}
  summary={post.summary}
  featuredImage={post.featuredImage}
  onSeoTitleChange={(val) => updateField('seoTitle', val)}
  onSeoDescriptionChange={(val) => updateField('seoDescription', val)}
  onSeoKeywordsChange={(val) => updateField('seoKeywords', val)}
  onOgImageUrlChange={(val) => updateField('ogImageUrl', val)}
  OGImageUploadComponent={<OGImageUploader postId={post.id} />}
  OGPreviewComponent={<OGPreview title={post.seoTitle} description={post.seoDescription} image={post.ogImageUrl} />}
/>
```

> Upload and preview widgets are passed as render props (`React.ReactNode`), keeping this component decoupled from specific upload or preview implementations.