| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 | import { RiCheckLine, RiCloseLine } from '@remixicon/react'import AppIcon from '@/app/components/base/app-icon'import cn from '@/utils/classnames'const iconSizeMap = {  xs: 'w-4 h-4 text-base',  tiny: 'w-6 h-6 text-base',  small: 'w-8 h-8',  medium: 'w-9 h-9',  large: 'w-10 h-10',}const Icon = ({  className,  src,  installed = false,  installFailed = false,  size = 'large',}: {  className?: string  src: string | {    content: string    background: string  }  installed?: boolean  installFailed?: boolean  size?: 'xs' | 'tiny' | 'small' | 'medium' | 'large'}) => {  const iconClassName = 'flex justify-center items-center gap-2 absolute bottom-[-4px] right-[-4px] w-[18px] h-[18px] rounded-full border-2 border-components-panel-bg'  if (typeof src === 'object') {    return (      <div className={cn('relative', className)}>        <AppIcon          size={size}          iconType={'emoji'}          icon={src.content}          background={src.background}          className='rounded-md'        />      </div>    )  }  return (    <div      className={cn('relative shrink-0 rounded-md bg-contain bg-center bg-no-repeat', iconSizeMap[size], className)}      style={{        backgroundImage: `url(${src})`,      }}    >      {        installed        && <div className={cn(iconClassName, 'bg-state-success-solid')}>          <RiCheckLine className='h-3 w-3 text-text-primary-on-surface' />        </div>      }      {        installFailed        && <div className={cn(iconClassName, 'bg-state-destructive-solid')}>          <RiCloseLine className='h-3 w-3 text-text-primary-on-surface' />        </div>      }    </div>  )}export default Icon
 |