{
  "$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": true,
            "description": "전체 페이지 수"
          },
          "maxVisiblePages": {
            "type": "number",
            "required": false,
            "default": 5,
            "description": "표시할 최대 페이지 번호 수"
          },
          "showFirstLast": {
            "type": "boolean",
            "required": false,
            "default": true,
            "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": "사용자 정의 클래스"
          }
        }
      }
    ]
  }
}
