doksam-ui
홈ProfilesTokensIconsComponentsPatternsTemplatesRules
Patterns

콘텐츠 피드 패턴

그리드·리스트·테이블 3종 뷰토글과 group-data variant 전환 기법입니다.

#1

뷰토글 3종 (그리드/리스트/테이블)

그리드·리스트·테이블 사이를 전환하는 목록 상단 뷰토글입니다. 그리드/리스트는 카드 마크업을 공유하고, 테이블만 별도 컴포넌트로 교체됩니다.

  • 가이드

    온보딩 체크리스트 작성 가이드

    신규 합류자가 첫 주에 완료해야 할 항목을 단계별로 정리합니다.

    김도현2026-07-02
  • 릴리스

    릴리스 노트 자동화 파이프라인

    태그 푸시 시 CHANGELOG를 자동 생성하는 CI 구성을 설명합니다.

    이서연2026-06-28
  • 가이드

    디자인 토큰 네이밍 규칙

    색상·간격·타이포 토큰을 일관되게 명명하는 규칙입니다.

    박지훈2026-06-20
  • 운영

    장애 대응 런북 v3

    서비스 장애 발생 시 1차 대응자가 따라야 할 절차입니다.

    최민아2026-06-15
  • 운영

    API 레이트리밋 정책

    엔드포인트별 호출 제한과 초과 시 처리 방식을 안내합니다.

    정우성2026-06-10
  • 릴리스

    v2.4 릴리스 하이라이트

    이번 릴리스의 주요 변경점과 마이그레이션 가이드입니다.

    이서연2026-06-01
const [view, setView] = useState<"grid" | "list" | "table">("grid")

{view === "table" ? (
  <ContentTable items={items} />
) : (
  <ul data-view={view} className="group/feed grid grid-cols-1 gap-3 data-[view=grid]:sm:grid-cols-2">
    {items.map((item) => (
      <li key={item.id}><ContentCard item={item} /></li>
    ))}
  </ul>
)}
  • 그리드/리스트는 같은 <ContentCard>를 재사용하고, 부모 <ul>의 data-view 값만 바뀐다 — 카드 자체는 분기하지 않는다.
  • 테이블 뷰는 열 구조가 근본적으로 다르므로 그리드/리스트와 별도 컴포넌트(ContentTable)로 분리한다.
  • 뷰 전환 버튼은 aria-pressed로 현재 뷰를 알리고, role="group"으로 묶어 스크린리더에서 토글 그룹임을 드러낸다.
#2

group-data variant 카드 비교

동일한 ContentCard 마크업이 조상의 data-view 값만 다를 때 어떻게 레이아웃이 바뀌는지 나란히 비교합니다.

data-view="grid"

  • 가이드

    온보딩 체크리스트 작성 가이드

    신규 합류자가 첫 주에 완료해야 할 항목을 단계별로 정리합니다.

    김도현2026-07-02

data-view="list"

  • 가이드

    온보딩 체크리스트 작성 가이드

    신규 합류자가 첫 주에 완료해야 할 항목을 단계별로 정리합니다.

    김도현2026-07-02
/* ContentCard.tsx — 카드 하나에 두 레이아웃이 공존한다 */
<div className="flex flex-col gap-2 p-4
  group-data-[view=list]/feed:flex-row
  group-data-[view=list]/feed:items-center
  group-data-[view=list]/feed:gap-4
  group-data-[view=list]/feed:p-3"
>
  {/* ... */}
</div>
  • group/<name>과 group-data-[key=value]/<name>: 조합으로, 별도 props 없이 조상의 data-* 속성만으로 자식 스타일을 바꾼다.
  • 조건부 렌더 대신 CSS variant로 처리하므로 그리드→리스트 전환 시 리마운트가 없고 애니메이션 전환도 자연스럽다.
  • 새 뷰를 추가할 땐 data-view 값 하나와 그에 대응하는 group-data-[view=...] 유틸리티만 추가하면 된다.