Components / Media
Asset
이미지, 아이콘, 아바타 등을 표시하는 미디어 래퍼 컴포넌트입니다. 다양한 shape와 fallback 처리를 지원합니다.
사용법
Asset은 작품 썸네일, 작가 프로필, 갤러리 아이콘 등 다양한 미디어를 일관된 형태로 표시합니다.
<Asset shape="rounded" size={64} src="/artwork.jpg" />
<Asset shape="circle" size={64} src="/artist.jpg" />
<Asset shape="square" size={64} src="/gallery.jpg" /> <div style="width:48px;height:48px;background:var(--alpha-4);display:flex;align-items:center;justify-content:center"> <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="var(--text-muted)" stroke-width="1.5"><rect x="3" y="3" width="18" height="18" rx="2"/><circle cx="8.5" cy="8.5" r="1.5"/><polyline points="21 15 16 10 5 21"/></svg> </div>
Shape: square / rounded / circle
콘텐츠 유형에 따라 적절한 형태를 선택합니다.
default (직각)
radius: 0
hover only
radius: 3px
circle (아바타)
radius: 50%
<Asset shape="square" /> {/* 갤러리 썸네일 */}
<Asset shape="rounded" /> {/* 작품 이미지, 기본값 */}
<Asset shape="circle" /> {/* 작가 프로필 */} Size 옵션
사용 맥락에 따라 다양한 크기를 지원합니다. number(px) 또는 프리셋 문자열을 전달합니다.
24px
36px
48px
64px
96px
<Asset size={24} /> {/* 인라인 아이콘 */}
<Asset size={36} /> {/* 리스트 아이템 */}
<Asset size={48} /> {/* 카드 썸네일 */}
<Asset size={64} /> {/* 상세 프로필 */}
<Asset size={96} /> {/* 히어로 프로필 */} Fallback 처리
이미지 로드 실패 시 배경색 + 이니셜 또는 아이콘으로 대체합니다.
Initial
Icon
Empty
<!-- 이니셜 fallback --> <Asset src="/broken.jpg" fallback="initial" name="박수근" /> <!-- 아이콘 fallback --> <Asset src="/broken.jpg" fallback="icon" /> <!-- 빈 placeholder --> <Asset src="/broken.jpg" fallback="empty" />
접근성
Asset은 시각적 미디어를 표시하므로, 대체 텍스트를 반드시 제공합니다.
| 속성 | 값 | 설명 |
|---|---|---|
alt | "{설명}" | 이미지의 대체 텍스트입니다. 장식 이미지는 빈 문자열을 사용합니다. |
role | "img" | fallback(div) 사용 시 이미지 역할을 명시합니다. |
aria-label | "{이름}" | 아바타 사용 시 이름 정보를 제공합니다. |
사용 방법 예시
작가 프로필, 작품 리스트에서 Asset이 사용되는 모습입니다.
박수근
한국화 · 작품 24점
김환기
유화 · 작품 18점
이중섭
유화 · 작품 31점
인터페이스
Asset 컴포넌트의 Props를 정의합니다.
AssetProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
src | — | — | string | 이미지 URL입니다. |
shape | — | rounded | square | rounded | circle | 미디어의 모양입니다. |
size | — | 48 | number (px) | 너비와 높이입니다. |
fallback | — | empty | initial | icon | empty | 로드 실패 시 대체 표시 방식입니다. |
name | — | — | string | initial fallback 시 이니셜 추출에 사용합니다. |
alt | — | "" | string | 이미지 대체 텍스트입니다. |
Components / Typography
Paragraph
텍스트, 아이콘, 배지, 링크 등을 조합하는 복합 텍스트 컴포넌트입니다. 7단계 타이포그래피 스케일(t1~t7)과 말줄임 처리를 지원합니다.
사용법
Paragraph는 일관된 타이포그래피 스케일로 텍스트를 렌더링합니다. Text, Icon, Badge, Link 서브 컴포넌트를 조합합니다.
박수근 — 빨래터
한국 근현대 미술의 거장 박수근의 대표작으로, 소박한 일상의 아름다움을 담아낸 작품입니다. 더 알아보기
<Paragraph scale="t3"> <Paragraph.Text>박수근 — 빨래터</Paragraph.Text> </Paragraph> <Paragraph scale="t5" color="secondary"> <Paragraph.Text>한국 근현대 미술의...</Paragraph.Text> <Paragraph.Link href="/detail">더 알아보기</Paragraph.Link> </Paragraph>
<p style="font-family:var(--sans);font-size:var(--text-sm);line-height:1.7;color:var(--text)"> 본문 텍스트입니다. 작품의 가치와 의미를 전달합니다. </p>
Typography Scale (t1~t7)
7단계 스케일로 텍스트의 크기와 역할을 정의합니다. t1~t3은 제목, t4~t5는 본문, t6~t7은 캡션/라벨입니다.
<Paragraph scale="t1">...</Paragraph> {/* 28px, Bold, 제목 */}
<Paragraph scale="t5">...</Paragraph> {/* 15px, Regular, 본문, 기본값 */}
<Paragraph scale="t7">...</Paragraph> {/* 11px, Regular, 라벨 */} Sub-Components
Text, Icon, Badge, Link 4가지 서브 컴포넌트를 자유롭게 조합합니다.
<Paragraph> <Paragraph.Icon name="diamond" /> <Paragraph.Text>추천 작품</Paragraph.Text> <Paragraph.Badge color="green">New</Paragraph.Badge> <Paragraph.Link href="/more">자세히</Paragraph.Link> </Paragraph>
Ellipsis (말줄임표)
긴 텍스트를 지정한 줄 수에서 잘라내고 말줄임표(...)를 표시합니다.
1줄 말줄임
한국 근현대 미술의 거장 박수근의 대표작으로, 소박한 일상의 아름다움을 담아낸 작품
2줄 말줄임
한국 근현대 미술의 거장 박수근의 대표작으로, 소박한 일상의 아름다움을 담아낸 작품입니다. 따뜻한 색감과 질감이 인상적입니다.
<Paragraph ellipsis={1}>...</Paragraph> {/* 1줄 후 잘라냄 */}
<Paragraph ellipsis={2}>...</Paragraph> {/* 2줄 후 잘라냄 */}
{/* aria-label에 전체 텍스트를 반드시 제공하세요 */} 접근성
Paragraph는 텍스트 콘텐츠의 구조와 접근성을 보장합니다.
| 속성 | 값 | 설명 |
|---|---|---|
aria-label | "{전체텍스트}" | ellipsis 사용 시 전체 텍스트를 제공합니다. |
lang | "ko" | "en" | 텍스트 언어를 명시합니다. (Pretendard/Space Grotesk 분기) |
role (Link) | "link" | Link 서브 컴포넌트의 역할입니다. |
사용 방법 예시
작품 상세 페이지에서 Paragraph가 사용되는 모습입니다.
박수근 — 빨래터
한국 근현대 미술의 거장 박수근의 대표작으로, 소박한 일상의 아름다움을 담아낸 작품입니다. 더 알아보기
인터페이스
Paragraph 및 서브 컴포넌트의 Props를 정의합니다.
ParagraphProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
scale | — | t5 | t1 | t2 | t3 | t4 | t5 | t6 | t7 | 타이포그래피 스케일입니다. |
weight | — | auto | regular | medium | semibold | bold | 글씨 굵기. auto면 스케일에 따라 자동입니다. |
color | — | text | text | secondary | muted | red | 텍스트 색상 토큰입니다. |
ellipsis | — | — | number (lines) | 말줄임 처리할 최대 줄 수입니다. |
children | — | ReactNode | Text, Icon, Badge, Link 서브 컴포넌트를 조합합니다. |
Paragraph.Text / Paragraph.Icon / Paragraph.Badge / Paragraph.Link
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
children | — | ReactNode | 서브 컴포넌트 콘텐츠입니다. | |
href | — | — | string | Link 서브 컴포넌트의 URL입니다. |
name | — | — | string | Icon 서브 컴포넌트의 아이콘 이름입니다. |
color | — | — | string | Badge 서브 컴포넌트의 색상입니다. |
Components / Typography
Highlight
텍스트의 일부를 시각적으로 강조하는 인라인 컴포넌트입니다. 배경색, 밑줄, 굵기+색상 등 다양한 방식을 지원합니다.
사용법
Highlight는 가격, 할인율, 작가명 등 핵심 텍스트를 강조합니다. variant를 지정하여 강조 방식을 선택합니다.
이 작품의 감정가는 12,000,000원이며, 박수근 작가의 대표작입니다.
이 작품의 감정가는 <Highlight>12,000,000원</Highlight>이며, <Highlight>박수근</Highlight> 작가의 대표작입니다.
<mark style="background:var(--red-brand-muted);color:var(--red-brand);padding:2px 4px">highlighted text</mark>
Background 하이라이트
배경색으로 텍스트를 강조합니다. 기본 variant이며, 색상을 지정할 수 있습니다.
현재 가격: ₩12,000,000
할인율: -15%
상태: 경매 진행중
<Highlight variant="background" color="red">₩12,000,000</Highlight> <Highlight variant="background" color="green">-15%</Highlight> <Highlight variant="background" color="blue">경매 진행중</Highlight>
Underline 하이라이트
밑줄로 텍스트를 강조합니다. 본문 흐름을 방해하지 않으면서 핵심 정보를 표시합니다.
박수근 작가의 작품은 한국 근대미술을 대표합니다.
감정가 ₩12,000,000으로 평가되었습니다.
<Highlight variant="underline" color="red">박수근</Highlight> <Highlight variant="underline" color="orange">₩12,000,000</Highlight>
Bold + Color 하이라이트
굵기와 색상을 조합하여 강조합니다. 배경 없이 텍스트 자체를 부각시킵니다.
30% 할인 중인 김환기 작가의 작품을 한정 판매합니다.
<Highlight variant="bold" color="red">30%</Highlight> <Highlight variant="bold" color="dark">김환기</Highlight> <Highlight variant="bold" color="blue">한정 판매</Highlight>
접근성
| 속성 | 값 | 설명 |
|---|---|---|
role | "mark" | 강조된 텍스트 영역임을 명시합니다. |
aria-label | "강조: {text}" | 색상만으로 의미를 전달하지 않도록 라벨을 제공합니다. |
| 시맨틱 태그 | <mark> | HTML mark 요소를 기본 렌더링 태그로 사용합니다. |
사용 방법 예시
빨래터
박수근 · 유화 · 1954
감정가
₩12,000,000
-15% 할인 전월 대비
한국 근대미술의 거장 박수근의 대표작으로, 국보급 작품입니다.
인터페이스
HighlightProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
variant | — | background | background | underline | bold | 강조 표현 방식입니다. |
color | — | red | red | green | blue | orange | dark | 강조 색상입니다. |
children | — | string | 강조할 텍스트입니다. | |
as | — | mark | mark | span | strong | 렌더링할 HTML 태그입니다. |
intensity | — | medium | light | medium | strong | 강조 강도입니다. 배경 투명도/밑줄 두께에 영향합니다. |
Components / Layout & List
List Footer
리스트 하단에 배치되는 더보기, 페이지네이션, 로딩 상태 영역입니다. 작품 목록, 경매 내역 등 긴 리스트 끝에서 추가 콘텐츠 탐색을 유도합니다.
사용법
기본 리스트 푸터는 더보기 버튼을 표시합니다. 리스트의 마지막 아이템 아래에 배치하세요.
<List>
{items.map(item => <ListItem key={item.id} {...item} />)}
<ListFooter type="more" onMore={handleLoadMore} />
</List> <div style="padding:var(--space-4);text-align:center;border-top:1px solid var(--border)"> <button style="font-size:var(--text-sm);color:var(--text-muted);background:none;border:none;cursor:pointer">더 보기</button> </div>
페이지네이션
전체 페이지 수와 현재 페이지를 표시하는 페이지네이션 모드입니다.
<ListFooter
type="pagination"
currentPage={1}
totalPages={12}
onPageChange={handlePageChange}
/> 로딩 스피너
무한 스크롤 등에서 추가 데이터를 불러오는 중일 때 표시합니다.
<ListFooter type="loading" message="작품을 불러오는 중…" />
접근성
| 속성 | 값 | 설명 |
|---|---|---|
role | navigation | 페이지네이션 모드에서 네비게이션 역할을 부여합니다 |
aria-label | "페이지 탐색" | 페이지네이션 영역의 목적을 설명합니다 |
aria-current | "page" | 현재 활성 페이지를 나타냅니다 |
aria-live | "polite" | 로딩 상태 변경을 스크린 리더에 알립니다 |
사용 방법 예시
인터페이스
ListFooterProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
type | — | "more" | "pagination" | "loading" | 리스트 푸터 유형 | |
message | "더보기" | string | 버튼 또는 로딩 텍스트 | |
currentPage | 1 | number | 현재 페이지 (pagination 모드) | |
totalPages | — | number | 전체 페이지 수 (pagination 모드) | |
remainCount | — | number | 남은 아이템 수 (more 모드) | |
onMore | — | () => void | 더보기 클릭 핸들러 | |
onPageChange | — | (page: number) => void | 페이지 변경 핸들러 |
Components / Layout & List
Post
SNS형 게시글 카드 컴포넌트입니다. 프로필, 본문, 이미지, 인터랙션 영역으로 구성되며, 갤러리 소식, 전시 후기, 작가 인터뷰 등 피드 콘텐츠에 사용됩니다.
사용법
기본 포스트는 프로필 영역, 텍스트 본문, 인터랙션 버튼으로 구성됩니다.
다음 주 금요일, 신진 작가 3인의 그룹전 "경계의 시선"이 오픈합니다. 회화, 조각, 미디어아트가 어우러진 이번 전시에 많은 관심 부탁드립니다.
<Post
author={{ name: "아트스페이스 갤러리", avatar: "/gallery.jpg" }}
timestamp="2시간 전"
content="다음 주 금요일, 신진 작가 3인의 그룹전이 오픈합니다."
likes={24}
comments={8}
/> <article style="padding:var(--space-4);border-bottom:1px solid var(--border)">
<div style="display:flex;align-items:center;gap:var(--space-3);margin-bottom:var(--space-3)">
<div style="width:36px;height:36px;border-radius:50%;background:var(--alpha-8)"></div>
<div>
<div style="font-size:var(--text-sm);font-weight:600">작성자명</div>
<div style="font-size:var(--text-xs);color:var(--text-muted)">2 hours ago</div>
</div>
</div>
<p style="font-size:var(--text-sm);line-height:1.6;margin:0">Post content here</p>
</article> 이미지 포함
단일 이미지를 포함한 포스트입니다. 이미지는 본문과 인터랙션 사이에 배치됩니다.
새 작업실에서의 첫 번째 작품이 완성되었습니다. 빛이 좋은 공간에서 작업하니 색감이 달라지네요.
<Post
author={{ name: "작가 이수연", avatar: "/artist.jpg" }}
timestamp="어제"
content="새 작업실에서의 첫 번째 작품이 완성되었습니다."
images={["/studio.jpg"]}
likes={56}
comments={12}
/> 다중 이미지
여러 이미지를 그리드 형태로 표시합니다. 4장 이상은 오버레이 카운터로 나타냅니다.
서울 아트페어 2026 현장 스케치입니다. 올해는 특히 동남아 갤러리의 참여가 눈에 띄었습니다.
<Post
author={{ name: "전시 리뷰어 박지현", avatar: "/reviewer.jpg" }}
timestamp="3일 전"
content="서울 아트페어 2026 현장 스케치입니다."
images={["/fair1.jpg", "/fair2.jpg", "/fair3.jpg", ...moreImages]}
likes={142}
comments={31}
/> 접근성
| 속성 | 값 | 설명 |
|---|---|---|
role | article | 포스트가 독립적인 콘텐츠 단위임을 명시합니다 |
aria-label | string | 포스트 요약 정보를 제공합니다 (작성자, 시간) |
alt | string | 이미지에 대체 텍스트를 제공합니다 |
aria-pressed | boolean | 좋아요 버튼의 토글 상태를 전달합니다 |
사용 방법 예시
이번 주말 오프닝 리셉션에 초대합니다. 작가와의 대화도 준비되어 있습니다.
올해 가장 인상 깊었던 전시를 꼽자면 단연 국립현대미술관의 회고전입니다.
인터페이스
PostProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
author | — | { name: string; avatar?: string } | 작성자 정보 | |
timestamp | — | string | Date | 작성 시간 표시 | |
content | — | string | ReactNode | 게시글 본문 콘텐츠 | |
images | [] | string[] | 첨부 이미지 URL 배열 | |
likes | 0 | number | 좋아요 수 | |
comments | 0 | number | 댓글 수 | |
liked | false | boolean | 현재 사용자의 좋아요 여부 | |
onLike | — | () => void | 좋아요 클릭 핸들러 |
Components / Layout & List
Table Row
테이블 형태의 데이터 행 컴포넌트입니다. 구조화된 데이터를 일관된 행 레이아웃으로 표시하며, 선택 및 상호작용을 지원합니다.
사용법
<TableRow
cells={["무제 No.203", "김환기", "₩85,000,000", "판매중"]}
onClick={() => openDetail(id)}
/> <table style="width:100%;border-collapse:collapse;font-size:var(--text-sm)">
<thead>
<tr style="border-bottom:2px solid var(--border)">
<th style="text-align:left;padding:var(--space-3);font-weight:600">Name</th>
<th style="text-align:left;padding:var(--space-3);font-weight:600">Status</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom:1px solid var(--border)">
<td style="padding:var(--space-3)">Item</td>
<td style="padding:var(--space-3)"><span class="ch-badge ch-badge--green">Active</span></td>
</tr>
</tbody>
</table> 변형
접근성
| 속성 | 값 | 설명 |
|---|---|---|
role | row | 테이블 행 역할을 스크린 리더에 전달합니다 |
aria-selected | true | false | 선택 가능한 행의 선택 상태를 전달합니다 |
aria-rowindex | 행 인덱스 | 전체 테이블에서의 행 위치를 전달합니다 |
tabindex | 0 | 클릭 가능한 행의 키보드 포커스를 지원합니다 |
| 키보드 | Enter / Space | 포커스된 행을 선택하거나 클릭합니다 |
사용 방법 예시
인터페이스
TableRowProps
| 속성 | 필수 | 기본값 | 타입 | 설명 |
|---|---|---|---|---|
cells | — | ReactNode[] | 행에 표시할 셀 데이터 배열 | |
onClick | — | () => void | 행 클릭 시 호출되는 콜백 | |
selected | false | boolean | 행 선택 상태 | |
striped | false | boolean | 줄무늬 배경 표시 여부 | |
divider | true | boolean | 하단 구분선 표시 여부 |