diff --git a/components/ui/loading-spinner.tsx b/components/ui/loading-spinner.tsx new file mode 100644 index 0000000..d7a95e3 --- /dev/null +++ b/components/ui/loading-spinner.tsx @@ -0,0 +1,109 @@ +"use client"; + +import { cn } from "@/lib/utils"; + +/** + * [로딩 스피너 컴포넌트] + * + * 전역적으로 사용 가능한 로딩 스피너입니다. + * - 크기 조절 가능 (sm, md, lg) + * - 색상 커스터마이징 가능 + * - 텍스트와 함께 사용 가능 + * + * @example + * // 기본 사용 + * + * + * @example + * // 크기 및 텍스트 지정 + * + * + * @example + * // 버튼 내부에서 사용 + * + */ + +interface LoadingSpinnerProps { + /** 스피너 크기 */ + size?: "sm" | "md" | "lg"; + /** 스피너와 함께 표시할 텍스트 */ + text?: string; + /** 추가 CSS 클래스 */ + className?: string; + /** 스피너 색상 (Tailwind 클래스) */ + color?: string; +} + +export function LoadingSpinner({ + size = "md", + text, + className, + color = "border-gray-900 dark:border-white", +}: LoadingSpinnerProps) { + // 크기별 스타일 매핑 + const sizeClasses = { + sm: "h-4 w-4 border-2", + md: "h-8 w-8 border-3", + lg: "h-12 w-12 border-4", + }; + + return ( +
+ {/* ========== 회전 스피너 ========== */} +
+ {/* ========== 로딩 텍스트 (선택적) ========== */} + {text && ( + + {text} + + )} +
+ ); +} + +/** + * [인라인 스피너 컴포넌트] + * + * 버튼 내부나 작은 공간에서 사용하기 적합한 미니 스피너입니다. + * + * @example + * + */ +export function InlineSpinner({ className }: { className?: string }) { + return ( + + + + + ); +}