({ size = 'medium', className, label, labelProps = {}, ...rest }: SpinnerProps)
| 62 | } |
| 63 | |
| 64 | export function Spinner({ size = 'medium', className, label, labelProps = {}, ...rest }: SpinnerProps) { |
| 65 | const { className: labelClassName, ...labelRest } = labelProps; |
| 66 | |
| 67 | return ( |
| 68 | <div className='inline-flex flex-col items-center justify-center gap-3'> |
| 69 | <div className={clsxMerge(spinnerContainerVariants({ size }))} {...rest}> |
| 70 | <div className={clsxMerge(spinnerVariants({ size }), className)}></div> |
| 71 | <svg |
| 72 | width='100%' |
| 73 | height='100%' |
| 74 | fill='none' |
| 75 | className='absolute animate-spin stroke-blue-700' |
| 76 | xmlns='http://www.w3.org/2000/svg' |
| 77 | {...spinSVGProps[size]} |
| 78 | > |
| 79 | <path d='M12.5 23c6.075 0 11-4.925 11-11s-4.925-11-11-11-11 4.925-11 11' strokeLinecap='round' /> |
| 80 | </svg> |
| 81 | </div> |
| 82 | {label && ( |
| 83 | <span className={clsxMerge('text-xs font-semibold text-blue-700', labelClassName)} {...labelRest}> |
| 84 | {label} |
| 85 | </span> |
| 86 | )} |
| 87 | {!label && <span className='sr-only'>Loading...</span>} |
| 88 | </div> |
| 89 | ); |
| 90 | } |
| 91 | |
| 92 | Spinner.displayName = 'Spinner'; |
nothing calls this directly
no test coverage detected