import { withUniwind } from 'uniwind'; import { cn } from '@cdx-ui/utils'; import type { ForgeIcon, ForgeIconProps } from '@cdx-ui/icons'; export type IconProps = ForgeIconProps & { className?: string; // TODO: Why does this need to specified manually? as: ForgeIcon; }; function IconImpl({ as: IconComponent, ...props }: IconProps) { return ; } // Double-wrap: the inner `withUniwind` (auto mapping) resolves general // `className` utilities (margin, padding, positioning, etc.) into the `style` // prop so they reach the SVG on native. The outer `withUniwind` (custom mapping) // extracts `size` and `color` from the same `className`. Without the inner // wrapper, a custom mapping alone skips the `className` → `style` merge, so // layout classes like `mt-3` are dropped on native (they still apply on web, // where RNW keeps `className` as a real CSS class). const StyledIcon = withUniwind(withUniwind(IconImpl), { size: { fromClassName: 'className', styleProperty: 'width', }, color: { fromClassName: 'className', styleProperty: 'color', }, }); /** * A wrapper component for CDX icons with Uniwind `className` support via `withUniwind`. * * This component allows you to render any CDX icon while applying utility classes * using `uniwind`. It avoids the need to wrap or configure each icon individually. * * @component * @example * ```tsx * import { Icon } from '@cdx-ui/components'; * import { ArrowRight } from '@cdx-ui/icons'; * * * ``` * * @param {ForgeIcon} as - The Forge icon component to render. * @param {string} className - Utility classes to style the icon using Uniwind. * @param {number} size - Icon size (overrides the size class). * @param {...ForgeIconProps} ...props - Additional icon props passed to the "as" icon. */ export function Icon({ as: IconComponent, className, ...props }: IconProps) { return ( ); }