Get startedFoundationsComponentsPatternsRules

Table Tree

테이블 트리는 계층 구조 데이터를 펼치고 접을 수 있는 행으로 보여줘요.

설치

pnpm dlx shadcn@latest add https://rebar.conmarket-landing.workers.dev/r/steel/table-tree.json

Examples

Basic

headers, columns, columnWidths, items 만 넘기면 바로 표가 그려져요. columns 의 각 컴포넌트는 항목의 content 를 props 로 받아 셀을 그려요. 항목에 children 이 있으면 첫 셀 앞에 펼침 버튼이 생겨요.

셀은 최소 높이 40px, 위아래 8px·좌우 24px 패딩이고 행 사이에는 1px border 선이, 머리글 아래에는 2px 선이 그어져요. 하위 단계마다 첫 셀이 24px씩 들여쓰기되고, 펼침 버튼(compact subtle 아이콘 버튼)은 들여쓰기 칸 안에 놓여요.

Advanced

Headers, Header, Rows, Row, Cell 을 직접 조합하면 셀 내용을 자유롭게 꾸밀 수 있어요. Header 에 준 width 는 같은 열의 Cell 에도 적용돼요. Cell 의 singleLine 은 한 줄로 말줄임해요.

Uncontrolled

Row 가 펼침 상태를 스스로 관리해요. isDefaultExpanded 로 처음 상태만 정해요.

Controlled

isExpanded 로 펼침 상태를 넘기고, onExpand·onCollapse 에서 상태를 바꿔요. "모두 펼치기"처럼 바깥에서 한꺼번에 제어할 때 써요.

Loading states

Rows 의 items 가 undefined 면 맨 위 단계가, Row 의 items 가 undefined 면 그 하위 단계가 로딩 스피너를 보여줘요. onExpand 에서 하위 데이터를 불러오면 비동기 트리를 만들 수 있어요.

Expand on row click

shouldExpandOnClick 을 켜면 행 아무 곳이나 눌러도 펼치고 접어요. 텍스트를 드래그해 선택하는 중에는 동작하지 않아요. 셀에 버튼·메뉴 같은 상호작용 요소가 있으면 켜지 않아요.

Usage guidelines

묶음 안에 또 묶음이 있는 데이터를 보여줄 때 써요. 사람들이 위 단계만 훑어보다가 필요할 때 아래 단계로 파고들 수 있어 정보량이 많아도 덜 부담스러워요. 페이지 나누기·정렬·순서 변경이 필요하면 Dynamic Table 을, 계층이 없는 단순한 표는 기본 HTML 표를 써요.

Do· 중요한 정보는 위 단계에
대부분의 사람이 펼치지 않고도 필요한 정보를 얻도록 핵심 내용을 최상위 행에 둬요.
Don't· 깊은 들여쓰기
단계를 너무 깊게 만들지 않아요. 화면 확대를 쓰는 사람은 깊이 들여쓴 셀을 찾기 어려워요.
Do· 줄바꿈
셀 너비를 넘는 내용은 줄바꿈하고, 필요하면 글자 수를 제한해요.
Don't· 말줄임
말줄임은 내용을 가려 접근성이 떨어져요. 꼭 필요할 때만 singleLine 을 써요.
  • 표는 구조화된 데이터에만 쓰고, 화면 배치 용도로 쓰지 않아요.
  • 열 머리글은 쉬운 말로 분명하게 써요.

Accessibility

  • 루트는 role="treegrid" 이고 행은 role="row", 셀은 role="gridcell", 머리글은 role="columnheader" 예요. 하위 행이 있는 행에는 aria-expanded 와 aria-level 이 붙어요.
  • label(aria-label) 이나 referencedLabel(aria-labelledby) 중 하나로 표 이름을 꼭 정해요.
  • 펼침 버튼은 Tab 으로 이동하고 Enter·Space 로 펼치고 접어요. 펼쳤을 때는 aria-controls 로 하위 행 영역을 가리켜요.
  • 펼침 버튼 이름은 기본 "itemId 행 펼치기" 예요. mainColumnForExpandCollapseLabel 로 "제품 기획 행 펼치기"처럼 행 내용을 넣어 주고, expandLabel·collapseLabel 로 문구를 바꿔요.
  • 로딩 스피너 이름은 Rows 의 loadingLabel 로 정해요.

Props

TableTree

Prop

Type

Rows

Prop

Type

Row

Prop

Type

Cell · Header

Prop

Type

On this page