2023-08-01 19:31:35 +12:00
|
|
|
import { Loader2 } from 'lucide-react';
|
2024-11-07 09:04:24 +13:00
|
|
|
import { ReactNode } from 'react';
|
2023-08-01 19:31:35 +12:00
|
|
|
import clsx from 'clsx';
|
|
|
|
|
|
|
|
import { Icon } from '@@/Icon';
|
|
|
|
|
2023-08-27 23:01:35 +02:00
|
|
|
type Size = 'xs' | 'sm' | 'md';
|
|
|
|
|
2023-08-01 19:31:35 +12:00
|
|
|
export type Props = {
|
2024-11-07 09:04:24 +13:00
|
|
|
children: ReactNode;
|
2023-08-27 23:01:35 +02:00
|
|
|
className?: string;
|
|
|
|
size?: Size;
|
|
|
|
};
|
|
|
|
|
|
|
|
const sizeStyles: Record<Size, string> = {
|
2025-05-13 22:15:04 +12:00
|
|
|
xs: 'text-xs gap-1',
|
|
|
|
sm: 'text-sm gap-2',
|
|
|
|
md: 'text-md gap-2',
|
2023-08-01 19:31:35 +12:00
|
|
|
};
|
|
|
|
|
2024-11-07 09:04:24 +13:00
|
|
|
export function InlineLoader({ children, className, size = 'sm' }: Props) {
|
2023-08-01 19:31:35 +12:00
|
|
|
return (
|
|
|
|
<div
|
2023-08-27 23:01:35 +02:00
|
|
|
className={clsx(
|
2025-05-13 22:15:04 +12:00
|
|
|
'text-muted flex items-center',
|
2023-08-27 23:01:35 +02:00
|
|
|
className,
|
|
|
|
sizeStyles[size]
|
|
|
|
)}
|
2023-08-01 19:31:35 +12:00
|
|
|
>
|
2025-05-13 22:15:04 +12:00
|
|
|
<Icon icon={Loader2} className="animate-spin-slow flex-none" />
|
2023-08-01 19:31:35 +12:00
|
|
|
{children}
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|