index.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 'use client'
  2. import type { FC } from 'react'
  3. import React from 'react'
  4. import cn from '@/utils/classnames'
  5. type Props = {
  6. className?: string
  7. icon: React.ReactNode
  8. iconBgClassName?: string
  9. title: React.ReactNode
  10. description: string
  11. noRadio?: boolean
  12. isChosen?: boolean
  13. onChosen?: () => void
  14. chosenConfig?: React.ReactNode
  15. chosenConfigWrapClassName?: string
  16. }
  17. const RadioCard: FC<Props> = ({
  18. icon,
  19. iconBgClassName = 'bg-[#F5F3FF]',
  20. title,
  21. description,
  22. noRadio,
  23. isChosen,
  24. onChosen = () => { },
  25. chosenConfig,
  26. chosenConfigWrapClassName,
  27. className,
  28. }) => {
  29. return (
  30. <div
  31. className={cn(
  32. 'relative cursor-pointer rounded-xl border-[0.5px] border-components-option-card-option-border bg-components-option-card-option-bg p-3',
  33. isChosen && 'border-[1.5px] bg-components-option-card-option-selected-bg',
  34. className,
  35. )}
  36. >
  37. <div className='flex gap-x-2' onClick={onChosen}>
  38. <div className={cn(iconBgClassName, 'flex size-8 shrink-0 items-center justify-center rounded-lg shadow-md')}>
  39. {icon}
  40. </div>
  41. <div className='grow'>
  42. <div className='system-sm-semibold mb-1 text-text-secondary'>{title}</div>
  43. <div className='system-xs-regular text-text-tertiary'>{description}</div>
  44. </div>
  45. {!noRadio && (
  46. <div className='absolute right-3 top-3'>
  47. <div className={cn(
  48. 'h-4 w-4 rounded-full border border-components-radio-border bg-components-radio-bg shadow-xs',
  49. isChosen && 'border-[5px] border-components-radio-border-checked',
  50. )}></div>
  51. </div>
  52. )}
  53. </div>
  54. {((isChosen && chosenConfig) || noRadio) && (
  55. <div className='mt-2 flex gap-x-2'>
  56. <div className='size-8 shrink-0'></div>
  57. <div className={cn(chosenConfigWrapClassName, 'grow')}>
  58. {chosenConfig}
  59. </div>
  60. </div>
  61. )}
  62. </div>
  63. )
  64. }
  65. export default React.memo(RadioCard)