{"version":3,"file":"JBreadcrumb.vue.cjs","sources":["../../../../src/components/molecules/JBreadcrumb.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport JIcon from '@/components/atoms/JIcon.vue'\r\nimport JLink from '@/components/atoms/JLink.vue'\r\nimport { cn } from '@/lib/utils'\r\n\r\n/**\r\n * JBreadcrumb - 브레드크럼 네비게이션 컴포넌트 (molecules)\r\n * Breadcrumb Navigation Component\r\n * \r\n * @description\r\n * 페이지의 네비게이션 경로를 표시하는 브레드크럼 컴포넌트입니다.\r\n * \r\n * Features:\r\n * - 경로 아이템 표시\r\n * - 클릭 가능한 링크 지원\r\n * - 아이콘 지원\r\n * - 커스터마이징 가능한 구분자\r\n * \r\n * @example\r\n * ```vue\r\n * <JBreadcrumb \r\n *   :items=\"[\r\n *     { label: '홈', href: '/' },\r\n *     { label: '제품', href: '/products' },\r\n *     { label: '상세' }\r\n *   ]\"\r\n * />\r\n * ```\r\n */\r\n\r\nexport type BreadcrumbItem = {\r\n  /** 라벨 텍스트 */\r\n  label: string\r\n  /** 링크 URL (없으면 텍스트만 표시) */\r\n  href?: string\r\n  /** 아이콘 이름 */\r\n  icon?: string\r\n  /** 클릭 핸들러 */\r\n  onClick?: () => void\r\n}\r\n\r\ntype StyleType =\r\n  | 'default'   // 기본 스타일\r\n  | 'minimal'   // 최소 스타일 (작은 크기, 얇은 구분자)\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    /** 브레드크럼 아이템 목록 */\r\n    items: BreadcrumbItem[]\r\n    /** 구분자 (기본값: /) */\r\n    separator?: string\r\n    /** 스타일 타입 */\r\n    styletype?: StyleType\r\n    /** 추가 CSS 클래스 */\r\n    class?: string\r\n  }>(),\r\n  {\r\n    separator: '/',\r\n    styletype: 'default',\r\n  }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n  /** 아이템 클릭 이벤트 */\r\n  itemClick: [item: BreadcrumbItem, index: number]\r\n}>()\r\n\r\n/**\r\n * 스타일 프리셋\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, {\r\n  containerClass: string\r\n  itemClass: string\r\n  separatorClass: string\r\n  lastItemClass: string\r\n}> = {\r\n  default: {\n    containerClass: 'flex items-center gap-2 px-4 py-1.5',\n    itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\n    separatorClass: 'text-muted-foreground/50 text-xs',\n    lastItemClass: 'text-foreground font-medium',\n  },\n  minimal: {\r\n    containerClass: 'flex items-center gap-1.5 px-2 py-1',\r\n    itemClass: 'text-xs text-muted-foreground hover:text-foreground transition-colors',\r\n    separatorClass: 'text-muted-foreground/40 text-xs',\r\n    lastItemClass: 'text-foreground font-medium',\r\n  },\r\n}\r\n\r\nconst preset = computed(() => {\r\n  return STYLE_PRESETS[props.styletype] ?? STYLE_PRESETS.default\r\n})\r\n\r\n/**\r\n * 아이템 클릭 핸들러\r\n */\r\nconst handleItemClick = (item: BreadcrumbItem, index: number) => {\r\n  item.onClick?.()\r\n  emit('itemClick', item, index)\r\n}\r\n\r\n/**\r\n * 마지막 아이템인지 확인\r\n */\r\nconst isLastItem = (index: number) => {\r\n  return index === props.items.length - 1\r\n}\r\n</script>\r\n\r\n<template>\r\n  <nav \r\n    :class=\"cn(preset.containerClass, props.class)\"\r\n    aria-label=\"브레드크럼 네비게이션\"\r\n  >\r\n    <ol class=\"flex items-center gap-2 list-none p-0 m-0\">\r\n      <li\r\n        v-for=\"(item, index) in items\"\r\n        :key=\"index\"\r\n        class=\"flex items-center gap-2\"\r\n      >\r\n        <!-- 아이템 -->\r\n        <span\r\n          v-if=\"isLastItem(index) || (!item.href && !item.onClick)\"\r\n          :class=\"cn(preset.itemClass, preset.lastItemClass, isLastItem(index) && 'cursor-default')\"\r\n        >\r\n          <!-- 아이콘 -->\r\n          <JIcon\r\n            v-if=\"item.icon\"\r\n            :name=\"item.icon\"\r\n            size=\"sm\"\r\n            class=\"mr-1\"\r\n          />\r\n          {{ item.label }}\r\n        </span>\r\n        \r\n        <JLink\r\n          v-else\r\n          :href=\"item.href\"\r\n          :class=\"cn(preset.itemClass)\"\r\n          @click=\"handleItemClick(item, index)\"\r\n        >\r\n          <!-- 아이콘 -->\r\n          <JIcon\r\n            v-if=\"item.icon\"\r\n            :name=\"item.icon\"\r\n            size=\"sm\"\r\n            class=\"mr-1\"\r\n          />\r\n          {{ item.label }}\r\n        </JLink>\r\n\r\n        <!-- 구분자 (마지막 아이템이 아니면 표시) -->\r\n        <span\r\n          v-if=\"!isLastItem(index)\"\r\n          :class=\"preset.separatorClass\"\r\n          aria-hidden=\"true\"\r\n        >\r\n          <JIcon\r\n            v-if=\"separator === 'chevron'\"\r\n            name=\"chevronRight\"\r\n            size=\"sm\"\r\n          />\r\n          <span v-else>{{ separator }}</span>\r\n        </span>\r\n      </li>\r\n    </ol>\r\n  </nav>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","handleItemClick","item","index","isLastItem","_createElementBlock","_normalizeClass","_unref","_createElementVNode","_hoisted_1","_openBlock","_Fragment","_renderList","cn","_createBlock","JIcon","_toDisplayString","JLink","$event"],"mappings":"4cA8CA,MAAMA,EAAQC,EAiBRC,EAAOC,EAQPC,EAKD,CACH,QAAS,CACP,eAAgB,sCAChB,UAAW,wEACX,eAAgB,mCAChB,cAAe,6BAAA,EAEjB,QAAS,CACP,eAAgB,sCAChB,UAAW,wEACX,eAAgB,mCAChB,cAAe,6BAAA,CACjB,EAGIC,EAASC,EAAAA,SAAS,IACfF,EAAcJ,EAAM,SAAS,GAAKI,EAAc,OACxD,EAKKG,EAAkB,CAACC,EAAsBC,IAAkB,CAC/DD,EAAK,UAAA,EACLN,EAAK,YAAaM,EAAMC,CAAK,CAC/B,EAKMC,EAAcD,GACXA,IAAUT,EAAM,MAAM,OAAS,8BAKtCW,EAAAA,mBAwDM,MAAA,CAvDH,MAAKC,EAAAA,eAAEC,EAAAA,YAAGR,EAAA,MAAO,eAAgBL,EAAM,KAAK,CAAA,EAC7C,aAAW,aAAA,GAEXc,EAAAA,mBAmDK,KAnDLC,EAmDK,EAlDHC,EAAAA,UAAA,EAAA,EAAAL,EAAAA,mBAiDKM,WAAA,KAAAC,EAAAA,WAhDqBjB,EAAA,MAAK,CAArBO,EAAMC,mBADhBE,EAAAA,mBAiDK,KAAA,CA/CF,IAAKF,EACN,MAAM,yBAAA,GAIEC,EAAWD,CAAK,GAAA,CAAOD,EAAK,MAAI,CAAKA,EAAK,uBADlDG,EAAAA,mBAYO,OAAA,OAVJ,MAAKC,EAAAA,eAAEC,EAAAA,MAAAM,EAAAA,EAAA,EAAGd,EAAA,MAAO,UAAWA,EAAA,MAAO,cAAeK,EAAWD,CAAK,GAAA,gBAAA,CAAA,CAAA,GAI3DD,EAAK,oBADbY,EAAAA,YAKEC,EAAAA,QAAA,OAHC,KAAMb,EAAK,KACZ,KAAK,KACL,MAAM,MAAA,kEACN,IACFc,EAAAA,gBAAGd,EAAK,KAAK,EAAA,CAAA,CAAA,qBAGfY,EAAAA,YAcQG,EAAAA,QAAA,OAZL,KAAMf,EAAK,KACX,MAAKI,EAAAA,eAAEC,QAAAM,EAAAA,EAAA,EAAGd,EAAA,MAAO,SAAS,CAAA,EAC1B,QAAKmB,GAAEjB,EAAgBC,EAAMC,CAAK,CAAA,qBAGnC,IAKE,CAJMD,EAAK,oBADbY,EAAAA,YAKEC,EAAAA,QAAA,OAHC,KAAMb,EAAK,KACZ,KAAK,KACL,MAAM,MAAA,kEACN,IACFc,EAAAA,gBAAGd,EAAK,KAAK,EAAA,CAAA,CAAA,0CAKNE,EAAWD,CAAK,6CADzBE,EAAAA,mBAWO,OAAA,OATJ,MAAKC,EAAAA,eAAEP,EAAA,MAAO,cAAc,EAC7B,cAAY,MAAA,GAGJJ,EAAA,YAAS,yBADjBmB,EAAAA,YAIEC,EAAAA,QAAA,OAFA,KAAK,eACL,KAAK,IAAA,KAEPL,EAAAA,YAAAL,EAAAA,mBAAmC,2BAAnBV,EAAA,SAAS,EAAA,CAAA,EAAA"}