icon.tsx 911 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import classNames from 'classnames'
  2. import { bsClassName } from '@/features/utils/bootstrap-5'
  3. type IconOwnProps = {
  4. type: string
  5. spin?: boolean
  6. fw?: boolean
  7. modifier?: string
  8. accessibilityLabel?: string
  9. }
  10. export type IconProps = IconOwnProps &
  11. Omit<React.ComponentProps<'i'>, keyof IconOwnProps>
  12. function Icon({
  13. type,
  14. spin,
  15. fw,
  16. modifier,
  17. className = '',
  18. accessibilityLabel,
  19. ...rest
  20. }: IconProps) {
  21. const iconClassName = classNames(
  22. 'fa',
  23. `fa-${type}`,
  24. {
  25. 'fa-spin': spin,
  26. 'fa-fw': fw,
  27. [`fa-${modifier}`]: modifier,
  28. },
  29. className
  30. )
  31. return (
  32. <>
  33. <i className={iconClassName} aria-hidden="true" {...rest} />
  34. {accessibilityLabel && (
  35. <span
  36. className={bsClassName({ bs5: 'visually-hidden', bs3: 'sr-only' })}
  37. >
  38. {accessibilityLabel}
  39. </span>
  40. )}
  41. </>
  42. )
  43. }
  44. export default Icon