/** * Icon registry — string `icon_name` → React component. * * SINGLE SOURCE OF TRUTH (no, really this time) for every icon-name → * React-component lookup across the lib + the hub. Two DB columns feed * in with DIFFERENT conventions: * * - `chat_admin_slash_commands.icon_name` — kebab-case (`'rocket'`, * `'hubspot'`, `'github'`, `'dollar-sign'`). * - `social_platforms.icon_name` — PascalCase component names * (`'LinkedInIcon'`, `'XLogo'`, `'YouTubeIcon'`, `'Github'`). * * The registry stores entries under kebab-case keys (URL/DB-friendly, * shell-safe, matches `lucide-react`'s own file-naming convention). * The PascalCase variants come in via `normalizeIconKey()`, which maps * known PascalCase aliases → kebab-case before the lookup runs. * * Adding a new icon: import the component below, add a `'name': Component` * entry in `ICON_REGISTRY`, and (if the same icon also flows in from a DB * column that uses PascalCase) add a `PascalName → 'name'` row to * `PASCAL_TO_KEBAB_ALIASES`. * * Fallback: an unknown / null icon_name resolves to `FileText` so a chip * never renders without an icon. */ import { type ComponentType, type ReactNode } from 'react'; /** * Loose icon-component shape: every entry accepts `className`; `color` is * optional (lucide + most brand icons accept it; OpenFrameLogo doesn't, * but `color` is optional so passing `undefined` is a no-op). Loose enough * to accept both lucide's `LucideIcon` and our brand SVG components. */ type IconComponent = ComponentType<{ className?: string; color?: string; }>; /** * The kebab-case registry. ALL lookups go through here; PascalCase * aliases route through `normalizeIconKey()` first. */ export declare const ICON_REGISTRY: Record; /** * Normalize an icon key to the registry's canonical kebab-case form. * Accepts PascalCase variants (from `social_platforms.icon_name`-style * columns) and passes kebab-case keys through unchanged. */ export declare function normalizeIconKey(key: string): string; /** * Resolve an `icon_name` to its React component. Accepts both PascalCase * and kebab-case keys (normalizes PascalCase first). Unknown / null / * undefined names fall back to `FileText` — chips always render with * SOMETHING rather than a missing glyph. The fallback is intentional: * a typo in a new admin-authored row shouldn't crash render. */ export declare function getIconComponent(iconName: string | null | undefined): ComponentType<{ className?: string; color?: string; }>; export type DynamicIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; /** * Render an icon by name with a size preset + optional className. * Replaces the old `src/utils/dynamic-icons.tsx#getDynamicIcon`. Accepts * both PascalCase and kebab-case keys (via `normalizeIconKey()`). */ export declare function getDynamicIcon(iconName: string | undefined | null, size?: DynamicIconSize, className?: string): ReactNode; export {}; //# sourceMappingURL=icon-registry.d.ts.map