| import { cn } from '@/lib/utils'; |
| import type { HTMLAttributes } from 'react'; |
|
|
| type LoaderIconProps = { |
| size?: number; |
| }; |
|
|
| const LoaderIcon = ({ size = 16 }: LoaderIconProps) => ( |
| <svg |
| height={size} |
| strokeLinejoin="round" |
| style={{ color: 'currentcolor' }} |
| viewBox="0 0 16 16" |
| width={size} |
| > |
| <title>Loader</title> |
| <g clipPath="url(#clip0_2393_1490)"> |
| <path d="M8 0V4" stroke="currentColor" strokeWidth="1.5" /> |
| <path d="M8 16V12" opacity="0.5" stroke="currentColor" strokeWidth="1.5" /> |
| <path |
| d="M3.29773 1.52783L5.64887 4.7639" |
| opacity="0.9" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M12.7023 1.52783L10.3511 4.7639" |
| opacity="0.1" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M12.7023 14.472L10.3511 11.236" |
| opacity="0.4" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M3.29773 14.472L5.64887 11.236" |
| opacity="0.6" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M15.6085 5.52783L11.8043 6.7639" |
| opacity="0.2" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M0.391602 10.472L4.19583 9.23598" |
| opacity="0.7" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M15.6085 10.4722L11.8043 9.2361" |
| opacity="0.3" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| <path |
| d="M0.391602 5.52783L4.19583 6.7639" |
| opacity="0.8" |
| stroke="currentColor" |
| strokeWidth="1.5" |
| /> |
| </g> |
| <defs> |
| <clipPath id="clip0_2393_1490"> |
| <rect fill="white" height="16" width="16" /> |
| </clipPath> |
| </defs> |
| </svg> |
| ); |
|
|
| export type LoaderProps = HTMLAttributes<HTMLDivElement> & { |
| size?: number; |
| }; |
|
|
| export const Loader = ({ className, size = 16, ...props }: LoaderProps) => ( |
| <div className={cn('inline-flex animate-spin items-center justify-center', className)} {...props}> |
| <LoaderIcon size={size} /> |
| </div> |
| ); |
|
|