import React, { ElementType, forwardRef, HTMLAttributes } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import { PolymorphicRefForwardingComponent } from '../../helpers' import { colorPropType } from '../../props' import type { Colors } from '../../types' export interface CPlaceholderProps extends HTMLAttributes { /** * Set animation type to better convey the perception of something being actively loaded. */ animation?: 'glow' | 'wave' /** * Component used for the root node. Either a string to use a HTML element or a component. */ as?: ElementType /** * A string of all className you want applied to the component. */ className?: string /** * Sets the color context of the component to one of CoreUI’s themed colors. * * @type 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | string */ color?: Colors /** * Size the component extra small, small, or large. */ size?: 'xs' | 'sm' | 'lg' /** * The number of columns on extra small devices (<576px). */ xs?: number /** * The number of columns on small devices (<768px). */ sm?: number /** * The number of columns on medium devices (<992px). */ md?: number /** * The number of columns on large devices (<1200px). */ lg?: number /** * The number of columns on X-Large devices (<1400px). */ xl?: number /** * The number of columns on XX-Large devices (≥1400px). */ xxl?: number } const BREAKPOINTS = [ 'xxl' as const, 'xl' as const, 'lg' as const, 'md' as const, 'sm' as const, 'xs' as const, ] export const CPlaceholder: PolymorphicRefForwardingComponent<'span', CPlaceholderProps> = forwardRef( ({ children, animation, as: Component = 'span', className, color, size, ...rest }, ref) => { const repsonsiveClassNames: string[] = [] BREAKPOINTS.forEach((bp) => { const breakpoint = rest[bp] delete rest[bp] const infix = bp === 'xs' ? '' : `-${bp}` if (typeof breakpoint === 'number') { repsonsiveClassNames.push(`col${infix}-${breakpoint}`) } if (typeof breakpoint === 'boolean') { repsonsiveClassNames.push(`col${infix}`) } }) return ( {children} ) } ) CPlaceholder.propTypes = { animation: PropTypes.oneOf(['glow', 'wave']), as: PropTypes.elementType, children: PropTypes.node, className: PropTypes.string, color: colorPropType, size: PropTypes.oneOf(['xs', 'sm', 'lg']), } CPlaceholder.displayName = 'CPlaceholder'