{"$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)"},"unstyled":{"type":"boolean","required":false,"default":false,"description":"기본 Tailwind 클래스(inline-flex 등) 주입 끄기 — 순수 CSS 로 display\/정렬을 잡는 v2 마크업용"},"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":"Strong","type":"basic","description":"HTML strong element wrapper","path":"src\/components\/basic\/Strong.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"B","type":"basic","description":"HTML b element wrapper","path":"src\/components\/basic\/B.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"Small","type":"basic","description":"HTML small element wrapper","path":"src\/components\/basic\/Small.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"Dl","type":"basic","description":"HTML dl element wrapper","path":"src\/components\/basic\/Dl.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"Dt","type":"basic","description":"HTML dt element wrapper","path":"src\/components\/basic\/Dt.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"Dd","type":"basic","description":"HTML dd element wrapper","path":"src\/components\/basic\/Dd.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":"사용자 정의 클래스"}}},{"name":"Iframe","type":"basic","description":"iframe element wrapper (같은 오리진 내부 경로 전용 — 업소 상세 모달 미리보기 오버레이)","path":"src\/components\/basic\/Iframe.tsx","props":{"src":{"type":"string","required":true,"description":"프레임에 띄울 내부 경로 (예: \/businesses\/123)"},"title":{"type":"string","required":false,"default":"미리보기","description":"접근성 제목"},"className":{"type":"string","required":false,"default":"","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":"BannerSlider","type":"composite","description":"배너존 슬라이더 (sirsoft-banner 존 API 의 banners 배열을 회전 노출)","path":"src\/components\/composite\/BannerSlider.tsx","props":{"banners":{"type":"array","required":false,"default":[],"description":"배너 배열 [{id, title, image_url, link_url, target}]"},"effect":{"type":"string","required":false,"default":"fade","description":"전환 효과 (fade | slide | 3d-up | blur)"},"width":{"type":"number","required":false,"default":1280,"description":"존 기준 가로 (종횡비 계산용)"},"height":{"type":"number","required":false,"default":180,"description":"존 기준 세로 (최대 높이)"},"autoHeightMobile":{"type":"boolean","required":false,"default":false,"description":"좁은 화면(기본 ≤780px)에서 가로 100% · 세로 auto 로 흘린다 (종횡비·최대높이 무시, 전환 효과 생략)"},"mobileMaxWidth":{"type":"number","required":false,"default":780,"description":"autoHeightMobile 이 적용될 최대 폭(px)"},"adminEditUrl":{"type":"string","required":false,"default":"","description":"값이 있으면 지금 보이는 배너 위에 수정 링크를 띄운다. ':id' 자리에 배너 id 가 들어간다 (예: \/admin\/banners\/:id\/edit). 권한 판단은 레이아웃이 한다"},"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":"InfiniteScrollTrigger","type":"composite","description":"무한 스크롤 감시 지점 — 목록 맨 아래에 두면 화면에 들어올 때 onReachEnd 로 다음 페이지를 요청한다 (페이지네이션 대체)","path":"src\/components\/composite\/InfiniteScrollTrigger.tsx","props":{"disabled":{"type":"boolean","required":false,"default":false,"description":"더 불러올 것이 없으면 true — 관찰을 멈춘다"},"loading":{"type":"boolean","required":false,"default":false,"description":"불러오는 중이면 true — 중복 요청을 막는다"},"rootMargin":{"type":"number","required":false,"default":300,"description":"화면 아래 몇 px 전에 미리 당길지"},"loadingText":{"type":"string","required":false,"description":"불러오는 중 문구"},"endText":{"type":"string","required":false,"description":"더 없을 때 문구"},"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}},"events":["onReachEnd"]},{"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 키 닫기, 포커스 트랩). 바깥 클릭으로는 닫히지 않는다 — 필요하면 closeOnBackdropClick 으로 켠다.","path":"src\/components\/composite\/Modal.tsx","props":{"isOpen":{"type":"boolean","required":true,"description":"모달 열림 상태"},"closeOnBackdropClick":{"type":"boolean","required":false,"default":"false","description":"바깥(오버레이) 클릭으로 닫을지. 기본은 꺼짐(2026-08-15 지시) — 입력 중 오클릭으로 내용이 날아가는 것을 막는다. closeOnOverlayClick 은 같은 뜻의 별칭이다."},"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":"사용자 정의 클래스"}}},{"name":"SloganEditor","type":"composite","description":"슬로건 스타일 툴바 에디터 — 색상·크기·두께를 조절해 인라인 스타일 HTML(span)로 조립한다. 관리자 화면과 동일한 컴포넌트를 프론트(마이페이지)에도 포팅해 편집 경험을 통일한다.","path":"src\/components\/composite\/SloganEditor.tsx","props":{"content":{"type":"string","required":false,"description":"초기 슬로건 값 (HTML 또는 레거시 JSON 문자열)"},"name":{"type":"string","required":false,"default":"slogan","description":"onChange 콜백에 실릴 필드명"},"onChange":{"type":"function","required":false,"description":"값 변경 콜백 — {target:{name,value}} 형태"},"className":{"type":"string","required":false,"default":"","description":"사용자 정의 클래스"}}},{"name":"EventRoulette","type":"composite","description":"포인트 룰렛·럭키박스 참여 위젯 (추첨은 서버가 하고 결과 연출만 담당)","path":"src\/components\/composite\/EventRoulette.tsx","props":{"eventId":{"type":"number","required":true,"description":"이벤트 ID"},"slots":{"type":"array","required":false,"default":[],"description":"상금표 슬롯 [{index, label}] — 확률·가중치는 내려오지 않음"},"variant":{"type":"string","required":false,"default":"wheel","description":"연출 종류 (wheel: 룰렛 휠, box: 럭키박스)"},"costPoints":{"type":"number","required":false,"default":0,"description":"1회 참여 비용 (포인트)"},"remaining":{"type":"number","required":false,"description":"남은 참여 횟수. 비우면 무제한"},"balance":{"type":"number","required":false,"description":"내 포인트 잔액"},"canEnter":{"type":"boolean","required":false,"default":false,"description":"참여 가능 여부 (서버 판단)"},"budgetReached":{"type":"boolean","required":false,"default":false,"description":"오늘 일별 지급 상한 소진 여부"},"lastResult":{"type":"object","required":false,"description":"직전 참여 결과 {slot, label, points, is_win}"},"refetchDataSource":{"type":"string","required":false,"default":"event","description":"참여 후 다시 불러올 데이터소스 ID"},"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"ScratchTicket","type":"composite","description":"일일미션 즉석복권 한 장 — 오로라 티켓 + 당첨금 칸 은박 긁기(당첨은 서버가 정하고 연출만 담당)","path":"src\/components\/composite\/ScratchTicket.tsx","props":{"eventId":{"type":"number","required":true,"description":"이벤트 ID"},"ticket":{"type":"object","required":true,"description":"복권 한 장 {id, mission_date, days_left, expires_at}"},"disabled":{"type":"boolean","required":false,"default":false,"description":"막힌 이유가 있으면 true — 은박은 보이되 긁히지 않음"},"disabledReason":{"type":"string","required":false,"default":"","description":"막힌 이유 첫 줄(긁으려 할 때 안내)"},"threshold":{"type":"number","required":false,"default":0.6,"description":"다 벗겨지는 기준(긁은 면적 비율 0~1)"},"refetchDataSource":{"type":"string","required":false,"default":"event","description":"벗겨진 뒤 다시 받을 데이터소스 ID"},"resultStateKey":{"type":"string","required":false,"default":"lotteryResult","description":"결과를 넣을 _local 키"},"imageSrc":{"type":"string","required":false,"description":"티켓 원판 그림"},"silverSrc":{"type":"string","required":false,"description":"은박 질감 그림"},"className":{"type":"string","required":false,"default":"","description":"사용자 정의 클래스"}}},{"name":"LotteryCouponWinners","type":"composite","description":"복권 긁기 페이지 「할인권 당첨자」 — 금액 필터 · 닉네임 검색 · 쪽 나눔(PC 10 표 · 휴대폰 5 카드), 공개 API coupon-winners 를 직접 부른다","path":"src\/components\/composite\/LotteryCouponWinners.tsx","props":{"eventId":{"type":"number","required":true,"description":"이벤트 ID(일일미션)"},"amounts":{"type":"array","required":false,"default":[],"description":"필터 칩 금액들(stats.lottery.prizes.coupons[].amount)"},"refreshKey":{"type":"string","required":false,"default":null,"description":"바뀌면 지금 조건 그대로 다시 받는다(쿠폰 당첨 번호)"},"perPage":{"type":"number","required":false,"default":10,"description":"PC 한 쪽 인원"},"mobilePerPage":{"type":"number","required":false,"default":5,"description":"휴대폰(640px 이하) 한 쪽 인원"},"className":{"type":"string","required":false,"default":"","description":"사용자 정의 클래스"}}},{"name":"LiveBroadcaster","type":"composite","description":"업소 라이브 방송 송출 (sirsoft-live) — 게이트 확인·WebRTC 송출·재시작 UX 내장","path":"src\/components\/composite\/LiveBroadcaster.tsx","props":{"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"LivePlayer","type":"composite","description":"라이브 방송 시청 (sirsoft-live) — WebRTC 기본, HLS 자동 폴백, ?mode= 강제 폴백","path":"src\/components\/composite\/LivePlayer.tsx","props":{"streamId":{"type":"string","required":true,"description":"g7_live_streams.id (라우트 :id)"},"className":{"type":"string","required":false,"description":"사용자 정의 클래스"}}},{"name":"LiveNotice","type":"composite","description":"라이브 방송 시작 전역 알림 칩 (sirsoft-live) — 클릭하면 시청 화면으로 이동","path":"src\/components\/composite\/LiveNotice.tsx","props":{"noticeId":{"type":"number","required":false,"description":"방송 행 id (전역 liveNoticeId) — 없으면 렌더하지 않음"},"businessName":{"type":"string","required":false,"description":"업소 이름 (전역 liveNoticeName)"}}},{"name":"ConnectionDiagnostics","type":"composite","description":"회원 접속 진단(\/diagnose) 입구 — 진단 전용 묶음(diag.iife.js)을 받아 진단 창을 띄운다. 페이지 안 안내 칸만 그린다 (2026-11-07)","path":"src\/components\/composite\/ConnectionDiagnostics.tsx","props":{"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":"사용자 정의 클래스"}}}]}}