React

List

가로 행으로 구성된 콘텐츠를 표현하는 컴포넌트입니다.

Installation

npx @seed-design/cli@latest add ui:list

Usage

import { ListHeader } from "seed-design/ui/list-header";
import { List, ListItem } from "seed-design/ui/list";

<VStack>
  <ListHeader as="h2">리스트 헤더</ListHeader>
  <List>
    <ListItem title="리스트 아이템 1" />
    <ListDivider />
    <ListItem title="리스트 아이템 2" />
  </List>
</VStack>

Props

ListHeader

Prop

Type

List

VStackProps와 동일합니다.

List Items

Examples

Using ListHeader

ListHeaderList 밖에 위치합니다.

Affixes (Prefix/Suffix)

Clickable List Items

ListButtonItem 또는 ListLinkItem를 사용해서 리스트 항목 전체를 클릭 가능하도록 만들 수 있습니다.

prefix 또는 suffix에 클릭할 수 있는 요소를 포함하는 경우 z-index: 1, position: relative, isolation: isolate 등의 스타일을 적용하여 클릭 이벤트가 리스트 항목과 별개로 동작하도록 하세요. ActionButton, ToggleButton 등 SEED React 컴포넌트는 추가적으로 스타일을 적용하지 않아도 됩니다.

inputs in List Items

ListSwitchItem, ListCheckItem, ListRadioItem을 사용해서 리스트 항목에 input 요소를 포함할 수 있습니다. 이때, Switchmark, Checkmark 또는 Radiomark와 같은 컨트롤 요소를 prefixsuffix 영역에 넣어 사용합니다.

Accessibility

List는 기본적으로 <ul>입니다. ListCheckItemListRadioItem를 사용하는 경우 List에 적절한 role을 부여해야 합니다.

<List as="fieldset">
  <ListCheckItem
    suffix={<Checkmark size="large" />}
    title="알림 수신 동의"
    detail="푸시 알림을 받으시겠습니까?"
  />
  <ListCheckItem
    suffix={<Checkmark size="large" />}
    title="마케팅 정보 수신 동의"
    detail="마케팅 정보를 받으시겠습니까?"
  />
</List>
<List asChild>
  <RadioGroup.Root defaultValue="짜장" aria-label="점심 메뉴"> {/* <div role="radiogroup"> */}
    <ListRadioItem
      suffix={<Radiomark size="large" />}
      value="짜장"
      title="짜장"
    />
    <ListRadioItem
      suffix={<Radiomark size="large" />}
      value="짬뽕"
      title="짬뽕"
    />
  </RadioGroup.Root>
</List>

Disabled

Variants

Highlighted

With Bottom Sheet

Alignment

alignItems prop으로 prefixsuffix의 정렬 방식을 조정할 수 있습니다.

Border Radius

ListitemBorderRadius prop을 설정하여 active 상태에서 적용되는 리스트 항목의 radius를 조정할 수 있습니다. 리스트가 카드 등 모서리가 둥근 컨테이너 안에 포함되는 경우 유용합니다.

Customization and Composition

Usage

@seed-design/react 패키지에서 제공하는 ListListHeader 컴포넌트는 다음과 같은 구조로 사용됩니다.

ListHeader
List.Root
└── List.Item
    ├── List.Prefix (선택사항)
    ├── List.Content
    │   ├── List.Title
    │   └── List.Detail (선택사항)
    └── List.Suffix (선택사항)
└── List.Item
    ├── ...
import { ListHeader, List, Icon } from "@seed-design/react";

<ListHeader>
  내 정보
</ListHeader>
<List.Root>
  <List.Item>
    <List.Prefix>
      <Icon svg={<IconPersonCircleLine />} />
    </List.Prefix>
    <List.Content>
      <List.Title>내 프로필</List.Title>
      <List.Detail>다른 사람들에게 보이는 내 정보를 관리합니다.</List.Detail>
    </List.Content>
    <List.Suffix>
      <Icon svg={<IconArrowRightLine />} />
    </List.Suffix>
  </List.Item>
  <List.Item>
    {/* ... */}
  </List.Item>
</List.Root>
  • ListHeader: 리스트의 제목이나 설명을 표시하는 헤더 역할
  • List.Root: 모든 리스트 항목을 감싸는 컨테이너 역할
    • List.Item: 개별 리스트 항목. 클릭 가능한 영역을 정의
    • List.Prefix: 아이콘, Avatar, Checkmark 등을 표시할 수 있는 시작 영역
    • List.Content: 주요 콘텐츠가 들어가는 중앙 영역
      • List.Title: 리스트 항목의 제목
      • List.Detail: 부가 설명이나 세부 정보
    • List.Suffix: 아이콘, Action Button, Toggle Button 등을 표시할 수 있는 끝 영역

asChild prop으로 적절한 시맨틱 요소와 조합하기

Composition

asChild prop에 대해 자세히 알아봅니다.

Using asChild prop in List.Content

리스트 항목 전체 영역을 클릭 가능한 버튼으로 만드는 경우 활용할 수 있는 패턴입니다. 이 경우 List.ItemasChild prop을 사용하지 않도록 유의하세요. List.Prefix 또는 List.Suffix에 버튼을 넣는 경우 button이 중첩되는 등 유효하지 않은 HTML이 생성됩니다.

import { List as SeedList } from "@seed-design/react";

<SeedList.Item>
  <SeedList.Content asChild>
    <button type="button" onClick={() => alert("사용자 클릭됨")}>
      <SeedList.Title>사용자</SeedList.Title>
    </button>
  </SeedList.Content>
  <SeedList.Suffix>
    <ActionButton
      size="xsmall"
      variant="brandSolid"
      onClick={() => alert("보기 클릭됨")}
    >
      보기
    </ActionButton>
  </SeedList.Suffix>
</SeedList.Item>

Snippet으로 제공되는 ListButtonItemListLinkItem는 이 패턴을 쉽게 구현할 수 있도록 돕습니다.

import { ListButtonItem } from "seed-design/ui/list";

<ListButtonItem
  onClick={() => alert("사용자 클릭됨")}
  title="사용자"
  detail="항목 6개"
  suffix={
    <ActionButton
      size="xsmall"
      variant="brandSolid"
      onClick={() => alert("보기 클릭됨")}
    >
      보기
    </ActionButton>
  }
/>

Using asChild prop in List.Item

리스트 항목 전체 영역을 label로 만들고, List.Prefix 또는 List.SuffixSwitchmark, Checkmark 또는 Radiomark를 넣는 경우 활용할 수 있는 패턴입니다.

import { List as SeedList } from "@seed-design/react";
import { Checkbox } from "@seed-design/react/primitive";

<SeedList.Item asChild> {/* <label> */}
  <Checkbox.Root defaultChecked>
    <SeedList.Content>
      <SeedList.Title>동의</SeedList.Title>
    </SeedList.Content>
    <SeedList.Suffix>
      <Checkmark />
    </SeedList.Suffix>
    <Checkbox.HiddenInput />
  </Checkbox.Root>
</SeedList.Item>

Snippet으로 제공되는 ListSwitchItem, ListCheckItemListRadioItem는 이 패턴을 쉽게 구현할 수 있도록 돕습니다.

import { ListCheckItem } from "seed-design/ui/list";

<ListCheckItem
  defaultChecked
  title="동의"
  suffix={<Checkmark size="large" />}
/>

Last updated on

On this page