<!-- source-hash: d7e38b48af56d6db68e8de321044b39c -->
Single source of truth for resolving icon name strings (kebab-case or PascalCase) to React components, with sized rendering helpers.

## Key Components

### Exports

| Export | Type | Description |
|--------|------|-------------|
| `ICON_REGISTRY` | `Record<string, IconComponent>` | Kebab-case map of all registered icon names to React components |
| `normalizeIconKey(key)` | `(string) => string` | Converts PascalCase icon names to canonical kebab-case; passes kebab keys through unchanged |
| `getIconComponent(iconName)` | `(string\|null\|undefined) => ComponentType` | Resolves any icon name to a component; falls back to `FileText` |
| `getDynamicIcon(iconName, size, className)` | `(...) => ReactNode` | Renders a sized icon element directly; falls back to `Globe` |
| `DynamicIconSize` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl'` | Size preset type (12px–48px) |

### Key Conventions

- **Registry keys** are always kebab-case (e.g. `'dollar-sign'`, `'book-open'`)
- **Brand vs. Lucide variants** share the same base name: `'github'` → brand icon, `'github-lucide'` → Lucide outline
- **PascalCase aliases** (`social_platforms.icon_name` column) are resolved via `PASCAL_TO_KEBAB_ALIASES` before lookup
- **Unknown names** never crash render — `getIconComponent` falls back to `FileText`, `getDynamicIcon` falls back to `Globe`

## Usage Example

```typescript
import { getIconComponent, getDynamicIcon, normalizeIconKey } from './icon-registry'

// Resolve a component for use in JSX (kebab or PascalCase both work)
const Icon = getIconComponent('rocket')          // → Rocket
const Icon2 = getIconComponent('LinkedInIcon')   // → LinkedInIcon (via alias)
const Icon3 = getIconComponent('unknown-icon')   // → FileText (fallback)

// Render a sized icon node directly
const node = getDynamicIcon('youtube', 'lg')         // 32px YouTubeIcon with brand color
const node2 = getDynamicIcon('dollar-sign', 'sm', 'text-green-500')

// Normalize a PascalCase key manually
normalizeIconKey('GitHubIcon')   // → 'github'
normalizeIconKey('globe')        // → 'globe' (pass-through)
```

### Adding a New Icon

1. Import the component at the top of the file
2. Add a `'kebab-name': Component` entry to `ICON_REGISTRY`
3. If the icon is stored as PascalCase in any DB column, add a `PascalName → 'kebab-name'` row to `PASCAL_TO_KEBAB_ALIASES`