import React, { Children, HTMLAttributes, forwardRef } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import './CIcon.css' export interface CIconSvgProps extends Omit, 'content'> { /** * A string of all className you want applied to the component. */ className?: string /** * Use for replacing default CIcon component classes. Prop is overriding the 'size' prop. */ customClassName?: string | string[] /** * The height attribute defines the vertical length of an icon. */ height?: number /** * Size of the icon. Available sizes: 'sm', 'lg', 'xl', 'xxl', '3xl...9xl', 'custom', 'custom-size'. */ size?: | 'custom' | 'custom-size' | 'sm' | 'lg' | 'xl' | 'xxl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | '8xl' | '9xl' /** * Title tag content. */ title?: string /** * The width attribute defines the horizontal length of an icon. */ width?: number } export const CIconSvg = forwardRef( ({ children, className, customClassName, height, size, title, width, ...rest }, ref) => { const _className = customClassName ? classNames(customClassName) : classNames( 'icon', { [`icon-${size}`]: size, [`icon-custom-size`]: height || width, }, className, ) return ( <> {Children.map(children, (child) => { if (React.isValidElement(child)) { return React.cloneElement(child as React.ReactElement, { 'aria-hidden': true, className: _className, focusable: 'false', ref: ref, role: 'img', ...rest, }) } return })} {title && {title}} ) }, ) CIconSvg.propTypes = { className: PropTypes.string, customClassName: PropTypes.string, height: PropTypes.number, size: PropTypes.oneOf([ 'custom', 'custom-size', 'sm', 'lg', 'xl', 'xxl', '3xl', '4xl', '5xl', '6xl', '7xl', '8xl', '9xl', ]), title: PropTypes.string, width: PropTypes.number, } CIconSvg.displayName = 'CIconSvg'