{ "$schema": "https://json-schema.org/draft/2020-12/schema", "templateId": "sirsoft-basic", "version": "1.0.0", "components": { "basic": [ { "name": "Button", "type": "basic", "description": "HTML button element wrapper", "path": "src/components/basic/Button.tsx", "props": { "variant": { "type": "string", "required": false, "default": "primary", "description": "버튼 변형 (primary | secondary | danger | success | ghost | outline)" }, "size": { "type": "string", "required": false, "default": "md", "description": "버튼 크기 (sm | md | lg)" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" }, "children": { "type": "ReactNode", "required": false, "description": "버튼 내용" } } }, { "name": "Input", "type": "basic", "description": "HTML input element wrapper", "path": "src/components/basic/Input.tsx", "bindingType": "checkable", "props": { "label": { "type": "string", "required": false, "description": "레이블 텍스트" }, "error": { "type": "string", "required": false, "description": "에러 메시지" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" } } }, { "name": "Textarea", "type": "basic", "description": "HTML textarea element wrapper", "path": "src/components/basic/Textarea.tsx", "props": { "label": { "type": "string", "required": false, "description": "레이블 텍스트" }, "error": { "type": "string", "required": false, "description": "에러 메시지" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" } } }, { "name": "Select", "type": "basic", "description": "HTML select element wrapper", "path": "src/components/basic/Select.tsx", "props": { "label": { "type": "string", "required": false, "description": "레이블 텍스트" }, "error": { "type": "string", "required": false, "description": "에러 메시지" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" }, "children": { "type": "ReactNode", "required": false, "description": "옵션 요소들" } } }, { "name": "Option", "type": "basic", "description": "HTML option element wrapper", "path": "src/components/basic/Option.tsx", "props": { "value": { "type": "string | number", "required": true, "description": "옵션 값" }, "disabled": { "type": "boolean", "required": false, "default": false, "description": "비활성화 여부" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Checkbox", "type": "basic", "description": "HTML checkbox input wrapper", "path": "src/components/basic/Checkbox.tsx", "bindingType": "checked", "props": { "label": { "type": "string", "required": false, "description": "레이블 텍스트" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" } } }, { "name": "PasswordInput", "type": "basic", "description": "비밀번호 입력 컴포넌트 (보기/숨기기, 조건 검증, 확인 일치)", "path": "src/components/basic/PasswordInput.tsx", "props": { "label": { "type": "string", "required": false, "description": "레이블 텍스트" }, "error": { "type": "string", "required": false, "description": "에러 메시지" }, "showToggle": { "type": "boolean", "required": false, "default": true, "description": "비밀번호 보기/숨기기 버튼 표시" }, "showValidation": { "type": "boolean", "required": false, "default": false, "description": "비밀번호 조건 검증 표시" }, "isConfirmField": { "type": "boolean", "required": false, "default": false, "description": "비밀번호 확인 필드로 사용" }, "confirmTarget": { "type": "string", "required": false, "description": "비밀번호 확인 대상 값" }, "showRules": { "type": "array", "required": false, "description": "표시할 규칙 키 목록 (minLength, hasUppercase, hasLowercase, hasNumber, hasSpecial)" }, "wrapperClassName": { "type": "string", "required": false, "description": "입력 필드 wrapper 클래스" }, "validationClassName": { "type": "string", "required": false, "description": "검증 결과 표시 영역 클래스" }, "className": { "type": "string", "required": false, "default": "", "description": "사용자 정의 클래스" } } }, { "name": "Div", "type": "basic", "description": "HTML div element wrapper", "path": "src/components/basic/Div.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Span", "type": "basic", "description": "HTML span element wrapper", "path": "src/components/basic/Span.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "P", "type": "basic", "description": "HTML p element wrapper", "path": "src/components/basic/P.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "H1", "type": "basic", "description": "HTML h1 element wrapper", "path": "src/components/basic/H1.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "H2", "type": "basic", "description": "HTML h2 element wrapper", "path": "src/components/basic/H2.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "H3", "type": "basic", "description": "HTML h3 element wrapper", "path": "src/components/basic/H3.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "H4", "type": "basic", "description": "HTML h4 element wrapper", "path": "src/components/basic/H4.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Label", "type": "basic", "description": "HTML label element wrapper", "path": "src/components/basic/Label.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "A", "type": "basic", "description": "HTML a element wrapper", "path": "src/components/basic/A.tsx", "props": { "href": { "type": "string", "required": false, "description": "링크 URL" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Nav", "type": "basic", "description": "HTML nav element wrapper", "path": "src/components/basic/Nav.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Ul", "type": "basic", "description": "HTML ul element wrapper", "path": "src/components/basic/Ul.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Li", "type": "basic", "description": "HTML li element wrapper", "path": "src/components/basic/Li.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Form", "type": "basic", "description": "HTML form element wrapper", "path": "src/components/basic/Form.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Table", "type": "basic", "description": "HTML table element wrapper", "path": "src/components/basic/Table.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Thead", "type": "basic", "description": "HTML thead element wrapper", "path": "src/components/basic/Thead.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Tbody", "type": "basic", "description": "HTML tbody element wrapper", "path": "src/components/basic/Tbody.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Tr", "type": "basic", "description": "HTML tr element wrapper", "path": "src/components/basic/Tr.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Th", "type": "basic", "description": "HTML th element wrapper", "path": "src/components/basic/Th.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Td", "type": "basic", "description": "HTML td element wrapper", "path": "src/components/basic/Td.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Icon", "type": "basic", "description": "FontAwesome icon wrapper", "path": "src/components/basic/Icon.tsx", "props": { "name": { "type": "string", "required": true, "description": "아이콘 이름 (FontAwesome)" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Img", "type": "basic", "description": "HTML img element wrapper", "path": "src/components/basic/Img.tsx", "props": { "src": { "type": "string", "required": true, "description": "이미지 URL" }, "alt": { "type": "string", "required": false, "description": "대체 텍스트" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Hr", "type": "basic", "description": "HTML hr element wrapper", "path": "src/components/basic/Hr.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } } ], "composite": [ { "name": "Header", "type": "composite", "description": "사이트 헤더 (로고, 네비게이션, 검색, 사용자 메뉴)", "path": "src/components/composite/Header.tsx", "props": { "siteName": { "type": "string", "required": false, "default": "그누보드7", "description": "사이트 이름" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Footer", "type": "composite", "description": "사이트 푸터 (저작권, 링크, 소셜)", "path": "src/components/composite/Footer.tsx", "props": { "siteName": { "type": "string", "required": false, "default": "그누보드7", "description": "사이트 이름" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "MobileNav", "type": "composite", "description": "모바일 네비게이션 드로어", "path": "src/components/composite/MobileNav.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "ProductCard", "type": "composite", "description": "상품 카드", "path": "src/components/composite/ProductCard.tsx", "props": { "product": { "type": "object", "required": true, "description": "상품 데이터" }, "showDiscount": { "type": "boolean", "required": false, "default": true, "description": "할인율 표시 여부" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "RichTextEditor", "type": "composite", "description": "리치 텍스트 에디터", "path": "src/components/composite/RichTextEditor.tsx", "props": { "value": { "type": "string", "required": false, "description": "에디터 내용" }, "placeholder": { "type": "string", "required": false, "description": "플레이스홀더" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "ImageGallery", "type": "composite", "description": "이미지 갤러리 (썸네일 + 메인 이미지)", "path": "src/components/composite/ImageGallery.tsx", "props": { "images": { "type": "array", "required": true, "description": "이미지 URL 배열" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "ProductImageViewer", "type": "composite", "description": "상품 이미지 뷰어 (메인 이미지 + 썸네일 + 라이트박스)", "path": "src/components/composite/ProductImageViewer.tsx", "props": { "images": { "type": "array", "required": true, "description": "상품 이미지 배열 (ProductImageResource 응답)" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "QuantitySelector", "type": "composite", "description": "수량 선택기 (+/- 버튼)", "path": "src/components/composite/QuantitySelector.tsx", "props": { "value": { "type": "number", "required": false, "default": 1, "description": "현재 수량" }, "min": { "type": "number", "required": false, "default": 1, "description": "최소 수량" }, "max": { "type": "number", "required": false, "default": 99, "description": "최대 수량" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "PostReactions", "type": "composite", "description": "게시글 리액션 버튼 그룹", "path": "src/components/composite/PostReactions.tsx", "props": { "postId": { "type": "number", "required": true, "description": "게시글 ID" }, "reactions": { "type": "object", "required": false, "description": "리액션 데이터" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "SocialLoginButtons", "type": "composite", "description": "소셜 로그인 버튼 그룹", "path": "src/components/composite/SocialLoginButtons.tsx", "props": { "providers": { "type": "array", "required": false, "default": [ "google", "naver", "kakao" ], "description": "활성화할 소셜 로그인 프로바이더" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "FileUploader", "type": "composite", "description": "파일 업로드 컴포넌트", "path": "src/components/composite/FileUploader.tsx", "props": { "accept": { "type": "string", "required": false, "description": "허용 파일 타입" }, "maxSize": { "type": "number", "required": false, "default": 10485760, "description": "최대 파일 크기 (bytes)" }, "multiple": { "type": "boolean", "required": false, "default": false, "description": "다중 파일 허용 여부" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Toast", "type": "composite", "description": "토스트 알림 컴포넌트", "path": "src/components/composite/Toast.tsx", "props": { "toasts": { "type": "array", "required": false, "description": "토스트 배열 (전역 상태 _global.toasts)" }, "position": { "type": "string", "required": false, "default": "top-right", "description": "토스트 표시 위치 (top-left | top-center | top-right | bottom-left | bottom-center | bottom-right)" }, "duration": { "type": "number", "required": false, "default": 3000, "description": "기본 자동 닫힘 시간 (ms)" } } }, { "name": "PageTransitionIndicator", "type": "composite", "description": "페이지 전환 로딩 인디케이터", "path": "src/components/composite/PageTransitionIndicator.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "PageTransitionBlur", "type": "composite", "description": "페이지 전환 시 전체 콘텐츠 블러 오버레이", "path": "src/components/composite/PageTransitionBlur.tsx", "props": { "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "PageSkeleton", "type": "composite", "description": "레이아웃 컴포넌트 트리 기반 동적 스켈레톤 UI 렌더러", "path": "src/components/composite/PageSkeleton.tsx", "props": { "components": { "type": "array", "required": true, "description": "레이아웃 JSON의 components 배열 (엔진에서 자동 전달)" }, "options": { "type": "object", "required": true, "description": "스켈레톤 옵션 (animation, iteration_count) (엔진에서 자동 전달)" } } }, { "name": "PageLoading", "type": "composite", "description": "페이지 로딩 인디케이터 (스피너 + 텍스트)", "path": "src/components/composite/PageLoading.tsx", "props": { "options": { "type": "object", "required": false, "description": "로딩 옵션 (text) (엔진에서 자동 전달)" } } }, { "name": "ThemeToggle", "type": "composite", "description": "테마 전환 토글 (auto/light/dark)", "path": "src/components/composite/ThemeToggle.tsx", "props": { "autoText": { "type": "string", "required": false, "default": "System", "description": "자동 모드 텍스트" }, "lightText": { "type": "string", "required": false, "default": "Light", "description": "라이트 모드 텍스트" }, "darkText": { "type": "string", "required": false, "default": "Dark", "description": "다크 모드 텍스트" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "NotificationCenter", "type": "composite", "description": "알림 센터 드롭다운 — 알림 목록 표시, 무한스크롤, 읽음 추적, 안 읽은 필터, 개별/전체 삭제", "path": "src/components/composite/NotificationCenter.tsx", "props": { "notifications": { "type": "array", "required": false, "default": [], "description": "알림 아이템 목록 (id, title, message, time, read, iconName, data)" }, "unreadCount": { "type": "number", "required": false, "default": 0, "description": "서버 기반 미읽음 알림 수" }, "hasMore": { "type": "boolean", "required": false, "default": false, "description": "추가 로드 가능 여부 (무한스크롤)" }, "loading": { "type": "boolean", "required": false, "default": false, "description": "로딩 상태" }, "titleText": { "type": "string", "required": false, "default": "알림", "description": "드롭다운 제목" }, "emptyText": { "type": "string", "required": false, "description": "알림 없음 텍스트" }, "markAllReadText": { "type": "string", "required": false, "description": "모두 읽음 버튼 텍스트" }, "deleteAllText": { "type": "string", "required": false, "description": "모두 삭제 버튼 텍스트" }, "unreadOnlyText": { "type": "string", "required": false, "description": "안 읽은 알림만 체크박스 텍스트" }, "unreadOnly": { "type": "boolean", "required": false, "default": false, "description": "안 읽은 알림만 필터 상태" }, "dropdownAlign": { "type": "string", "required": false, "default": "right", "description": "드롭다운 정렬 방향 (right/left)" }, "className": { "type": "string", "required": false, "description": "추가 CSS 클래스" } }, "events": [ "onClose", "onNotificationClick", "onLoadMore", "onMarkAllRead", "onDeleteAll", "onDelete", "onUnreadOnlyToggle" ] }, { "name": "Pagination", "type": "composite", "description": "페이지네이션 컴포넌트 (페이지 번호, 이전/다음, 처음/마지막 버튼)", "path": "src/components/composite/Pagination.tsx", "props": { "currentPage": { "type": "number", "required": true, "description": "현재 페이지 번호" }, "totalPages": { "type": "number", "required": false, "description": "전체 페이지 수. 총 건수를 정확히 세지 못한 목록은 null (페이지 번호 목록과 마지막 페이지 점프가 감춰지고 이전/다음만 남음)" }, "maxVisiblePages": { "type": "number", "required": false, "default": 5, "description": "표시할 최대 페이지 번호 수" }, "showFirstLast": { "type": "boolean", "required": false, "default": true, "description": "처음/마지막 버튼 표시 여부" }, "showFirst": { "type": "boolean", "required": false, "description": "처음 버튼 표시 여부 (미지정 시 showFirstLast 를 따름)" }, "showLast": { "type": "boolean", "required": false, "description": "마지막 버튼 표시 여부 (미지정 시 showFirstLast 를 따름). 총 건수가 부정확해 totalPages 가 null 이면 이 값과 무관하게 감춰짐" }, "hasMorePages": { "type": "boolean", "required": false, "description": "다음 페이지 존재 여부. 총 건수를 모르는 목록에서 '다음' 버튼 활성 여부를 이 값으로 판정" }, "prevText": { "type": "string", "required": false, "description": "이전 버튼 텍스트" }, "nextText": { "type": "string", "required": false, "description": "다음 버튼 텍스트" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "SearchBar", "type": "composite", "description": "검색 바 컴포넌트 (입력 필드, 선택적 버튼, 자동완성 지원)", "path": "src/components/composite/SearchBar.tsx", "props": { "name": { "type": "string", "required": false, "default": "search", "description": "입력 필드 name 속성" }, "placeholder": { "type": "string", "required": false, "description": "플레이스홀더 텍스트" }, "value": { "type": "string", "required": false, "description": "입력 필드 값" }, "showButton": { "type": "boolean", "required": false, "default": false, "description": "검색 버튼 표시 여부" }, "suggestions": { "type": "array", "required": false, "description": "자동완성 제안 목록" }, "showSuggestions": { "type": "boolean", "required": false, "default": false, "description": "자동완성 표시 여부" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Avatar", "type": "composite", "description": "사용자 아바타 (이미지 또는 이름 첫 글자)", "path": "src/components/composite/Avatar.tsx", "props": { "name": { "type": "string", "required": false, "description": "사용자 이름" }, "avatar": { "type": "string", "required": false, "description": "아바타 이미지 URL" }, "size": { "type": "string", "required": false, "default": "md", "description": "아바타 크기 (xs | sm | md | lg | xl)" }, "text": { "type": "string", "required": false, "description": "레이아웃 JSON에서 text 속성으로 전달되는 이름" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "UserInfo", "type": "composite", "description": "사용자 정보 표시 및 드롭다운 메뉴 (이름, 서브텍스트, 프로필 링크, 비회원 배지)", "path": "src/components/composite/UserInfo.tsx", "props": { "name": { "type": "string", "required": false, "description": "사용자 이름" }, "userId": { "type": "string | number", "required": false, "description": "사용자 ID" }, "subText": { "type": "string", "required": false, "description": "서브 텍스트 (날짜, 시간 등)" }, "isGuest": { "type": "boolean", "required": false, "default": false, "description": "비회원 여부" }, "showDropdown": { "type": "boolean", "required": false, "default": true, "description": "드롭다운 표시 여부" }, "clickable": { "type": "boolean", "required": false, "default": true, "description": "프로필 클릭 가능 여부" }, "profilePath": { "type": "string", "required": false, "default": "/users/{userId}", "description": "프로필 경로 패턴" }, "text": { "type": "string", "required": false, "description": "레이아웃 JSON에서 text 속성으로 전달되는 이름" }, "menuItems": { "type": "array", "required": false, "description": "커스텀 메뉴 항목" }, "hideMenuItems": { "type": "array", "required": false, "description": "숨길 기본 메뉴 키 배열" }, "appendMenuItems": { "type": "array", "required": false, "description": "추가할 메뉴 항목" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "HtmlContent", "type": "composite", "description": "HTML 또는 일반 텍스트 콘텐츠 표시 (DOMPurify XSS 보호)", "path": "src/components/composite/HtmlContent.tsx", "props": { "content": { "type": "string", "required": false, "description": "표시할 콘텐츠" }, "text": { "type": "string", "required": false, "description": "레이아웃 JSON에서 text 속성으로 전달되는 콘텐츠" }, "isHtml": { "type": "boolean", "required": false, "default": true, "description": "HTML 렌더링 여부" }, "purifyConfig": { "type": "object", "required": false, "description": "DOMPurify 설정 객체" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "BrandMark", "type": "composite", "description": "결제 브랜드 마크 (색 배지 또는 인라인 SVG 로고, DOMPurify 화이트리스트 sanitize)", "path": "src/components/composite/BrandMark.tsx", "props": { "brandMark": { "type": "object", "required": false, "description": "브랜드 마크 데이터 { text, class } 또는 { svg }" }, "size": { "type": "number", "required": false, "default": 32, "description": "마크 컨테이너 크기(px)" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "HtmlEditor", "type": "composite", "description": "HTML/텍스트 에디터 (WYSIWYG, 미리보기, Form 자동 바인딩)", "path": "src/components/composite/HtmlEditor.tsx", "props": { "name": { "type": "string", "required": false, "default": "content", "description": "입력 필드 name 속성" }, "value": { "type": "string", "required": false, "description": "에디터 초기 값" }, "placeholder": { "type": "string", "required": false, "description": "플레이스홀더 텍스트" }, "isHtml": { "type": "boolean", "required": false, "default": true, "description": "HTML 모드 여부" }, "showPreview": { "type": "boolean", "required": false, "default": false, "description": "미리보기 모드 활성화" }, "minHeight": { "type": "string", "required": false, "default": "200px", "description": "최소 높이" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Modal", "type": "composite", "description": "모달 다이얼로그 (ESC 키 닫기, 포커스 트랩, 오버레이 클릭 닫기)", "path": "src/components/composite/Modal.tsx", "props": { "isOpen": { "type": "boolean", "required": true, "description": "모달 열림 상태" }, "onClose": { "type": "function", "required": true, "description": "모달 닫기 핸들러" }, "title": { "type": "string", "required": false, "description": "모달 제목" }, "width": { "type": "string", "required": false, "default": "500px", "description": "모달 너비" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" }, "children": { "type": "ReactNode", "required": false, "description": "모달 내용" } } }, { "name": "ConfirmDialog", "type": "composite", "description": "확인/취소 다이얼로그", "path": "src/components/composite/ConfirmDialog.tsx", "props": { "isOpen": { "type": "boolean", "required": true, "description": "다이얼로그 열림 상태" }, "onClose": { "type": "function", "required": true, "description": "닫기 핸들러" }, "title": { "type": "string", "required": true, "description": "다이얼로그 제목" }, "message": { "type": "string | ReactNode", "required": true, "description": "다이얼로그 메시지" }, "confirmText": { "type": "string", "required": false, "description": "확인 버튼 텍스트" }, "cancelText": { "type": "string", "required": false, "description": "취소 버튼 텍스트" }, "onConfirm": { "type": "function", "required": true, "description": "확인 버튼 클릭 핸들러" }, "confirmButtonVariant": { "type": "string", "required": false, "default": "primary", "description": "확인 버튼 스타일 (primary | secondary | danger | ghost)" }, "isLoading": { "type": "boolean", "required": false, "default": false, "description": "로딩 상태" } } }, { "name": "AvatarUploader", "type": "composite", "description": "아바타 이미지 업로드 컴포넌트 (원형 UI, 즉시 업로드)", "path": "src/components/composite/AvatarUploader.tsx", "props": { "src": { "type": "string", "required": false, "description": "현재 아바타 URL" }, "fallbackText": { "type": "string", "required": false, "default": "U", "description": "이미지 없을 때 표시할 텍스트 (이니셜)" }, "size": { "type": "string", "required": false, "default": "lg", "description": "아바타 크기 (sm | md | lg | xl)" }, "uploadEndpoint": { "type": "string", "required": false, "default": "/api/me/avatar", "description": "업로드 API 엔드포인트" }, "deleteEndpoint": { "type": "string", "required": false, "default": "/api/me/avatar", "description": "삭제 API 엔드포인트" }, "showDeleteButton": { "type": "boolean", "required": false, "default": true, "description": "삭제 버튼 표시 여부" }, "accept": { "type": "string", "required": false, "default": "image/*", "description": "허용 파일 타입" }, "maxSize": { "type": "number", "required": false, "default": 5, "description": "최대 파일 크기 (MB)" }, "readOnly": { "type": "boolean", "required": false, "default": false, "description": "읽기 전용 모드" }, "confirmDelete": { "type": "boolean", "required": false, "default": true, "description": "삭제 확인 다이얼로그 표시 여부" }, "deleteConfirmMessage": { "type": "string", "required": false, "description": "삭제 확인 메시지" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "TabNavigation", "type": "composite", "description": "탭 네비게이션 (underline/pills/enclosed 변형)", "path": "src/components/composite/TabNavigation.tsx", "props": { "tabs": { "type": "array", "required": true, "description": "탭 목록 (id, label, iconName)" }, "activeTabId": { "type": "string", "required": false, "description": "활성 탭 ID" }, "variant": { "type": "string", "required": false, "default": "underline", "description": "탭 스타일 (underline | pills | enclosed)" }, "onTabChange": { "type": "function", "required": false, "description": "탭 변경 핸들러" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "SlotContainer", "type": "composite", "description": "동적 슬롯 컨테이너 — 레이아웃 JSON 노드(slot)/확장 주입 조각을 떙겨 렌더 (빈 슬롯=미렌더). 헤더 통화 등 모듈 주입 UI 소비", "path": "src/components/composite/SlotContainer.tsx", "props": { "slotId": { "type": "string", "required": true, "description": "렌더할 슬롯 ID" }, "className": { "type": "string", "required": false, "description": "컨테이너 클래스" }, "emptyContent": { "type": "node", "required": false, "description": "빈 슬롯일 때 표시할 내용" } } }, { "name": "ExpandableContent", "type": "composite", "description": "콘텐츠 펼치기/접기 (높이 초과 시 그라데이션 + 버튼 표시)", "path": "src/components/composite/ExpandableContent.tsx", "props": { "maxHeight": { "type": "number", "required": false, "default": 500, "description": "접힌 상태 최대 높이 (px)" }, "expandText": { "type": "string", "required": false, "description": "펼치기 버튼 텍스트" }, "collapseText": { "type": "string", "required": false, "description": "접기 버튼 텍스트" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } } ], "layout": [ { "name": "Container", "type": "layout", "description": "레이아웃 컨테이너", "path": "src/components/layout/Container.tsx", "props": { "maxWidth": { "type": "string", "required": false, "default": "7xl", "description": "최대 너비 (sm | md | lg | xl | 2xl | 7xl)" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Flex", "type": "layout", "description": "Flexbox 레이아웃", "path": "src/components/layout/Flex.tsx", "props": { "direction": { "type": "string", "required": false, "default": "row", "description": "정렬 방향 (row | col)" }, "gap": { "type": "string", "required": false, "description": "간격" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "Grid", "type": "layout", "description": "Grid 레이아웃", "path": "src/components/layout/Grid.tsx", "props": { "cols": { "type": "number", "required": false, "default": 1, "description": "열 수" }, "gap": { "type": "string", "required": false, "description": "간격" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "SectionLayout", "type": "layout", "description": "섹션 레이아웃 (제목, 부제목, 패딩 등)", "path": "src/components/layout/SectionLayout.tsx", "props": { "title": { "type": "string", "required": false, "description": "섹션 제목" }, "subtitle": { "type": "string", "required": false, "description": "섹션 부제목" }, "padding": { "type": "string", "required": false, "default": "md", "description": "패딩 크기 (none | sm | md | lg | xl)" }, "background": { "type": "string", "required": false, "default": "white", "description": "배경색 (white | gray | transparent)" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } }, { "name": "ThreeColumnLayout", "type": "layout", "description": "3단 레이아웃 (좌측, 중앙, 우측)", "path": "src/components/layout/ThreeColumnLayout.tsx", "props": { "leftWidth": { "type": "string", "required": false, "default": "1fr", "description": "좌측 열 너비" }, "centerWidth": { "type": "string", "required": false, "default": "2fr", "description": "중앙 열 너비" }, "rightWidth": { "type": "string", "required": false, "default": "1fr", "description": "우측 열 너비" }, "gap": { "type": "string", "required": false, "default": "6", "description": "열 간격" }, "className": { "type": "string", "required": false, "description": "사용자 정의 클래스" } } } ] } }