Breadcrumb | CoUI

Breadcrumb

현재 페이지의 위치를 계층적으로 나타내는 탐색 경로 컴포넌트

Breadcrumb#

현재 페이지의 위치를 계층적으로 표시하여 사용자가 상위 페이지로 쉽게 이동할 수 있도록 하는 탐색 경로 컴포넌트입니다.

Live Preview#

Web
Flutter
Loading Flutter...
class BreadcrumbDefaultExample extends StatelessComponent {
  const BreadcrumbDefaultExample({super.key});

  @override
  Component build(BuildContext context) {
    return Breadcrumb(
      items: const [
        CoreBreadcrumbItem(label: 'Home', href: '/'),
        CoreBreadcrumbItem(label: 'Components', href: '/components'),
        CoreBreadcrumbItem(label: 'Breadcrumb'),
      ],
      onItemTap: (index) {},
    );
  }
}
class BreadcrumbDefaultExample extends StatelessWidget {
  const BreadcrumbDefaultExample({super.key});

  @override
  Widget build(BuildContext context) {
    return Breadcrumb(
      items: const [
        CoreBreadcrumbItem(label: 'Home', href: '/'),
        CoreBreadcrumbItem(label: 'Components', href: '/components'),
        CoreBreadcrumbItem(label: 'Breadcrumb'),
      ],
      onItemTap: (index) {},
    );
  }
}

사용 시기 (When to Use)#

이 컴포넌트를 사용하세요:

  • 3단계 이상의 계층 구조를 가진 페이지에서 현재 위치를 안내할 때
  • 사용자가 상위 카테고리로 빠르게 돌아갈 수 있어야 할 때 (예: 이커머스 카테고리, 관리자 설정)
  • 문서, 파일 탐색기처럼 깊은 계층 구조를 탐색할 때

대신 다른 컴포넌트를 사용하세요:

  • Tabs: 동일 레벨의 섹션을 전환할 때
  • Navigation: 앱 주요 섹션 간 이동에는 네비게이션 사용
  • Link: 단순 이전 페이지 이동 링크만 필요할 때

기본 사용법 (Basic Usage)#

Flutter / Web 모두 동일한 Breadcrumb API 를 사용합니다. 데이터-드리븐 — CoreBreadcrumbItem 리스트를 넘기면 마지막 항목이 자동으로 현재 위치(비탐색) 로 렌더링됩니다.

// 기본 브레드크럼
Breadcrumb(
  items: const [
    CoreBreadcrumbItem(label: '홈', href: '/'),
    CoreBreadcrumbItem(label: '카테고리', href: '/category'),
    CoreBreadcrumbItem(label: '상품 상세'),
  ],
  onItemTap: handleBreadcrumbNavigation,
)
// 기본 브레드크럼 (href로 <a> 링크 렌더링)
Breadcrumb(
  items: const [
    CoreBreadcrumbItem(label: '홈', href: '/'),
    CoreBreadcrumbItem(label: '카테고리', href: '/category'),
    CoreBreadcrumbItem(label: '상품 상세'),
  ],
  onItemTap: handleBreadcrumbNavigation,
)

Props / Parameters#

속성타입기본값설명
items List<CoreBreadcrumbItem> 필수 탐색 경로 항목 목록 (마지막 = 현재)
onItemTap void Function(int)? null 비탐색(현재) 외 항목 탭 콜백 — 0-based 인덱스
variant CoreBreadcrumbVariant standard 시각 변형
breadcrumbStyle CoreBreadcrumbStyle? null 인스턴스 스타일 (Style 시스템 참조)

CoreBreadcrumbItemlabel (필수) 과 href (선택) 를 가집니다. Web 에서는 href<a> 태그로 렌더링되고, Flutter 에서는 onItemTap 콜백으로 탐색을 처리합니다.

스타일 시스템 (Style System)#

Breadcrumb 의 모든 chrome / dimensional / nested-slot 오버라이드는 CoreBreadcrumbStyle 단일 슬롯으로 흐릅니다. 시맨틱 / behaviour 필드 (items / onItemTap / variant) 는 위젯/컴포넌트 파라미터로 직접 전달합니다.

시맨틱 vs 스타일#

  • 시맨틱 / behaviour: 위젯/컴포넌트 파라미터로 직접 (items, onItemTap, variant)
  • chrome / dimensional / 슬롯 스타일: CoreBreadcrumbStyle 한 곳으로 (itemSeparatorGapStyle / currentItemColor / itemTextStyle / separatorIconStyle)

Resolve chain#

CoreBreadcrumbStyle.defaultX                   // design system default
  → CoreBreadcrumbTheme.style                  // 프로젝트 공통
  → widget.breadcrumbStyle                     // 인스턴스별

슬롯 매핑 (CoreBreadcrumbStyle 4 필드)#

필드타입적용 영역
itemSeparatorGapStyle CoreGapStyle? item / separator / item 간격 (Gap 슬롯)
currentItemColorCoreColor?현재(마지막) 항목 — 비탐색 라벨 색
itemTextStyle CoreTextStyle? 모든 breadcrumb 항목 텍스트 스타일
separatorIconStyle CoreIconStyle? chevron separator 아이콘 스타일 (size / color)

변형 (Variants)#

Breadcrumb 은 현재 단일 시각 변형(standard) 을 가집니다. chevron() 구분자가 기본이며, separator 아이콘 크기 / 색은 breadcrumbStyle.separatorIconStyle 로 오버라이드합니다.

Breadcrumb(
  items: const [
    CoreBreadcrumbItem(label: '대시보드', href: '/'),
    CoreBreadcrumbItem(label: '프로젝트', href: '/projects'),
    CoreBreadcrumbItem(label: 'CoUI'),
  ],
  breadcrumbStyle: const CoreBreadcrumbStyle(
    itemSeparatorGapStyle: CoreGapStyle(size: CoreSpace.space12),
  ),
)

동작 스펙 (Behavior)#

인터랙션#

  • 클릭/탭: 마지막 외 항목 클릭 시 onItemTap 콜백을 0-based 인덱스와 함께 호출 (마지막 항목은 현재 페이지이므로 비활성)
  • 호버: 클릭 가능한 항목 호버 시 텍스트 색이 onSurface 로 전환 (150ms ease-in-out)

상태 전환#

  • 마지막 항목은 현재 위치를 나타내며 onSurface 비활성 텍스트로 표시
  • 앞 항목들은 onSurfaceVariant 링크 스타일로 표시 (클릭 가능)

애니메이션#

  • 링크 호버 시 색상 전환 150ms ease-in-out

사용 가이드라인 (Usage Guidelines)#

✅ Do#

현재 페이지(마지막 항목)는 자동으로 클릭 불가로 표시

Breadcrumb(
  items: const [
    CoreBreadcrumbItem(label: '홈', href: '/'),
    CoreBreadcrumbItem(label: '설정', href: '/settings'),
    CoreBreadcrumbItem(label: '보안'), // 마지막 = 현재 페이지
  ],
  onItemTap: handleNavigation,
)

마지막 항목은 자동으로 비탐색 텍스트로 렌더링되어 현재 위치를 명확히 한다.


❌ Don't#

2단계 이하 계층에서 브레드크럼 남용하지 않기

// ❌ 단순 2단계 구조에 브레드크럼
Breadcrumb(
  items: const [
    CoreBreadcrumbItem(label: '홈', href: '/'),
    CoreBreadcrumbItem(label: '설정'),
  ],
)

2단계 이하는 뒤로가기 버튼 또는 간단한 Link로 충분하며 브레드크럼이 오히려 복잡도를 높인다.

✅ Do#

경로가 길면 좁은 화면에서 가로 스크롤로 흘려보내기

Breadcrumb 은 콘텐츠가 컨테이너를 넘으면 가로 스크롤(overflow-x-auto)로 처리하므로 줄바꿈으로 레이아웃이 깨지지 않는다.

접근성 (Accessibility)#

키보드 인터랙션#

동작
Tab다음 클릭 가능한 항목으로 포커스 이동
Enter포커스된 항목 활성화
Shift + Tab이전 항목으로 포커스 이동

스크린 리더#

  • Flutter: Semantics(role: 'navigation', label: '탐색 경로') 래핑
  • Web: <nav aria-label="breadcrumb"> 자동 적용; 현재 페이지 항목에 aria-current="page" 추가

터치 타겟#

  • 클릭 가능한 항목 최소 터치 타겟: 44x44dp
  • 작은 구분자는 터치 영역에 포함하지 않음

크로스 플랫폼 차이점 (Platform Differences)#

항목FlutterWeb
클래스명BreadcrumbBreadcrumb (동일)
링크 처리 onItemTap 콜백 onItemTap 콜백 + href<a> 태그 렌더링
구분자chevron Iconchevron Icon
호버MouseRegion + 색 전환CSS :hover 토큰 클래스
  • Navigation: 앱 주요 섹션 간 이동에 사용
  • Tabs: 동일 계층의 콘텐츠를 탭으로 전환할 때 사용
  • Link: 단일 이전 페이지 이동 링크가 필요할 때 사용