본문으로 건너뛰기

List

같은 형태의 행을 세로로 쌓는 컴포넌트입니다. 내비게이션, 설정 항목, 검색 결과처럼 반복되는 목록에 씁니다.

tsx
import { List, ListItem } from 'neba';

<List>
  <ListItem startIcon={<GlobeIcon />} description="4분 전 배포" onClick={open} selected>
    production
  </ListItem>
  <ListItem startIcon={<GlobeIcon />} description="2시간 전 배포" onClick={open}>
    staging
  </ListItem>
</List>;

Props

List

Prop타입기본값설명
variant공통'solid' | 'outline' | 'text''outline'표면의 무게. 담는 쪽이므로 시트는 물들지 않습니다. Card 안에서는 text를 쓰세요. 카드가 이미 시트입니다
size공통'xs' | 'sm' | 'md' | 'lg' | 'xl''md'행의 타입 스케일과 여백. 항목이 아니라 목록이 가지는 축입니다
color공통'primary' | 'secondary' | 'success' | 'warning' | 'danger' | 'info''primary'의미론적 색 역할. 임의 색상값은 받지 않습니다
density공통'default' | 'compact''default'여백만 바꿉니다. 높이와 글자 크기는 그대로
elevation공통0 | 1 | 2 | 30그림자 깊이. 0은 그림자 없음
dividersbooleanfalse행 사이를 여백 대신 하이라인으로 나눕니다. 들리는 것보다 많이 바뀝니다. 선이 시트 양끝까지 닿아야 하므로 목록은 안쪽 여백을, 행은 둥근 모서리를 내놓습니다
renderuseRender.RenderPropul 대신 다른 것으로, 순서가 의미를 가지면 render={<ol />}
childrenReactNodeListItem들

sizedensityList에만 지정합니다. context를 통해 모든 ListItem에 전달되므로 행마다 반복할 필요가 없습니다.

ListItem

Prop타입기본값설명
startIconReactNode라벨 앞 내용, 아이콘, 아바타, 상태 점
endIconReactNode라벨 뒤 내용. 누를 수 있는 영역 안에 있습니다
descriptionReactNode라벨 아래 둘째 줄
actionReactNode행 끝에 고정되는 컨트롤, 스위치, 메뉴 버튼. 일부러 누를 수 있는 영역 바깥입니다: 버튼 안의 버튼은 브라우저가 파싱하면서 고쳐 쓰는 마크업입니다
onClick(event) => void넘기면 행이 진짜 button이 됩니다
hrefstring넘기면 행이 진짜 a가 됩니다
selectedbooleanfalse고른 행, 열려 있는 페이지, 켜진 필터. 링크에는 aria-current="page"가, 버튼에는 aria-current="true"가 붙습니다
disabledbooleanfalse사용 불가. 색 계열을 버리고 중립 회색이 됩니다
childrenReactNode라벨

예시

dividers

dividers를 켜면 행 사이에 선이 그려집니다. 선이 sheet 양끝까지 닿아야 하므로 목록의 안쪽 여백과 행의 둥근 모서리가 함께 사라지고, 행은 떠 있는 타일이 아니라 구획된 줄로 바뀝니다.

variant

Card 안에 넣을 때는 variant="text"를 쓰세요. Card가 이미 sheet이므로 테두리가 겹치지 않습니다.

onClick · href · action

onClick이나 href를 주면 행 전체가 각각 <button> 또는 <a>가 됩니다. action은 그 클릭 영역 바깥에 놓이는 별도의 컨트롤 자리입니다. 행을 눌러 이동하면서 오른쪽 스위치는 따로 조작해야 하는 경우를 위한 것입니다.

접근성

  • Listrole="list"를 명시합니다. Tailwind의 reset이 <ul>의 불릿을 제거하면 Safari가 목록이라는 의미까지 함께 잃기 때문입니다.
  • ListItem의 겉은 항상 <li>이고, onClick이나 href에 따라 그 안에 <button> 또는 <a>가 들어갑니다.
  • selected는 링크에 aria-current="page", 버튼에 aria-current="true"를 붙입니다. 선택된 행은 toggle이 아니므로 aria-pressed는 쓰지 않습니다.

Released under the MIT License