/** * 로딩 스피너 컴포넌트 (표준화됨) * * 사용 가이드: * - LoadingSpinner: 인라인/버튼 내부/작은 영역용 * - ContentLoadingSpinner: 컨텐츠 영역 로딩용 (상세/수정 페이지) * - PageLoadingSpinner: 페이지 전환용 (loading.tsx, 전체 페이지) * * 스타일: border-4 border-solid border-primary border-r-transparent */ import React from 'react'; // ============================================ // 1. 기본 스피너 (인라인/버튼 내부용) // ============================================ interface LoadingSpinnerProps { size?: 'xs' | 'sm' | 'md' | 'lg'; className?: string; text?: string; } const sizeClasses = { xs: 'h-3 w-3 border-2', sm: 'h-4 w-4 border-2', md: 'h-8 w-8 border-3', lg: 'h-12 w-12 border-4' }; export const LoadingSpinner: React.FC = ({ size = 'md', className = '', text }) => { return (
{text &&

{text}

}
); }; // ============================================ // 2. 컨텐츠 영역 스피너 (상세/수정 페이지용) // ============================================ interface ContentLoadingSpinnerProps { text?: string; } export const ContentLoadingSpinner: React.FC = ({ text = '불러오는 중...' }) => { return (

{text}

); }; // ============================================ // 3. 페이지 레벨 스피너 (페이지 전환용) // ============================================ interface PageLoadingSpinnerProps { text?: string; } export const PageLoadingSpinner: React.FC = ({ text = '페이지를 불러오는 중...' }) => { return (

{text}

); }; // ============================================ // 4. 테이블/리스트 오버레이 스피너 // ============================================ interface TableLoadingSpinnerProps { text?: string; rows?: number; } export const TableLoadingSpinner: React.FC = ({ text = '데이터를 불러오는 중...', rows = 5 }) => { return (

{text}

); }; // ============================================ // 5. 버튼 내부 스피너 (저장 중 등) // ============================================ export const ButtonSpinner: React.FC = () => { return (
); };