{"version":3,"file":"JSidebarGroup.vue.cjs","sources":["../../../../../src/components/organisms/JSidebar/JSidebarGroup.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, inject, watch } from 'vue'\nimport type { SidebarMenuItem } from '@/types/sidebar.types'\nimport { SIDEBAR_INJECTION_KEY } from '@/types/sidebar.types'\nimport JIcon from '@/components/atoms/JIcon.vue'\nimport JSidebarItem from './JSidebarItem.vue'\nimport { cn } from '@/lib/utils'\n\n/**\n * JSidebarGroup - 그룹 헤더 (menuType='F' 전용)\n * 폴더 타입 메뉴를 렌더링. 펼침/접힘 토글 + 하위 메뉴 재귀 렌더링.\n * 링크(L)는 JSidebarItem에서 처리.\n */\n\nconst props = defineProps<{\n  item: SidebarMenuItem\n}>()\n\nconst emit = defineEmits<{\n  'menu-click': [item: SidebarMenuItem, event: MouseEvent]\n}>()\n\nconst state = inject(SIDEBAR_INJECTION_KEY)!\n\nconst isExpanded = ref(false)\n\n/** 직계 자식 중 L 타입 개수 (재귀하지 않음) */\nconst childCount = computed(() => {\n  if (!props.item.children) return 0\n  return props.item.children.filter(c => c.menuType === 'L').length\n})\n\nconst toggleExpand = () => {\n  isExpanded.value = !isExpanded.value\n}\n\n/** 자식의 menu-click을 상위로 전파 */\nconst handleChildClick = (item: SidebarMenuItem, event: MouseEvent) => {\n  emit('menu-click', item, event)\n}\n\n/** 현재 경로가 이 그룹의 자식에 포함되면 자동 펼침 */\nconst hasActiveChild = computed(() => {\n  if (!state.activePath || !props.item.children) return false\n  const checkActive = (items: SidebarMenuItem[]): boolean => {\n    for (const child of items) {\n      if (child.menuType === 'L' && child.path === state.activePath) return true\n      if (child.children && checkActive(child.children)) return true\n    }\n    return false\n  }\n  return checkActive(props.item.children)\n})\n\nwatch(hasActiveChild, (active) => {\n  if (active) isExpanded.value = true\n}, { immediate: true })\n</script>\n\n<template>\n  <!-- Collapsed: 구분선만 -->\n  <template v-if=\"state.collapsed\">\n    <div class=\"h-px bg-border mx-2 my-1\" />\n    <!-- collapsed 상태에서 자식 아이템 직접 렌더링 -->\n    <template v-for=\"child in item.children\" :key=\"child.id\">\n      <JSidebarItem\n        v-if=\"child.menuType === 'L'\"\n        :item=\"child\"\n        @menu-click=\"handleChildClick\"\n      />\n      <!-- 중첩 폴더는 collapsed에서 무시 (1단계만) -->\n    </template>\n  </template>\n\n  <!-- Expanded: 그룹 헤더 + 하위 메뉴 -->\n  <div v-else>\n    <!-- 그룹 헤더 -->\n    <button\n      class=\"flex items-center gap-1.5 w-full px-2 py-1 mt-0.5 text-xs font-semibold text-muted-foreground cursor-pointer select-none transition-colors hover:text-foreground\"\n      @click=\"toggleExpand\"\n    >\n      <JIcon\n        name=\"chevronRight\"\n        size=\"sm\"\n        :class=\"cn(\n          'flex-shrink-0 transition-transform duration-200',\n          isExpanded && 'rotate-90'\n        )\"\n      />\n      <span class=\"flex-1 truncate text-left\">{{ item.label }}</span>\n      <span\n        v-if=\"childCount > 0\"\n        class=\"text-[10px] text-muted-foreground/60 flex-shrink-0\"\n      >\n        {{ childCount }}\n      </span>\n    </button>\n\n    <!-- 하위 메뉴 (grid-template-rows 애니메이션) -->\n    <div\n      :class=\"cn(\n        'grid transition-[grid-template-rows] duration-200 ease-out',\n        isExpanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n      )\"\n    >\n      <div class=\"overflow-hidden ml-3 pl-2 border-l border-border/50\">\n        <template v-for=\"child in item.children\" :key=\"child.id\">\n          <JSidebarItem\n            v-if=\"child.menuType === 'L'\"\n            :item=\"child\"\n            @menu-click=\"handleChildClick\"\n          />\n          <!-- 중첩 폴더: 재귀 -->\n          <JSidebarGroup\n            v-else-if=\"child.menuType === 'F'\"\n            :item=\"child\"\n            @menu-click=\"handleChildClick\"\n          />\n        </template>\n      </div>\n    </div>\n  </div>\n</template>\n"],"names":["props","__props","emit","__emit","state","inject","SIDEBAR_INJECTION_KEY","isExpanded","ref","childCount","computed","c","toggleExpand","handleChildClick","item","event","hasActiveChild","checkActive","items","child","watch","active","_unref","_createElementBlock","_Fragment","_createElementVNode","_openBlock","_renderList","_createBlock","JSidebarItem","_hoisted_1","_createVNode","JIcon","cn","_hoisted_2","_toDisplayString","_hoisted_3","_hoisted_4","_component_JSidebarGroup"],"mappings":"wjBAcA,MAAMA,EAAQC,EAIRC,EAAOC,EAIPC,EAAQC,EAAAA,OAAOC,uBAAqB,EAEpCC,EAAaC,EAAAA,IAAI,EAAK,EAGtBC,EAAaC,EAAAA,SAAS,IACrBV,EAAM,KAAK,SACTA,EAAM,KAAK,SAAS,UAAYW,EAAE,WAAa,GAAG,EAAE,OAD1B,CAElC,EAEKC,EAAe,IAAM,CACzBL,EAAW,MAAQ,CAACA,EAAW,KACjC,EAGMM,EAAmB,CAACC,EAAuBC,IAAsB,CACrEb,EAAK,aAAcY,EAAMC,CAAK,CAChC,EAGMC,EAAiBN,EAAAA,SAAS,IAAM,CACpC,GAAI,CAACN,EAAM,YAAc,CAACJ,EAAM,KAAK,SAAU,MAAO,GACtD,MAAMiB,EAAeC,GAAsC,CACzD,UAAWC,KAASD,EAElB,GADIC,EAAM,WAAa,KAAOA,EAAM,OAASf,EAAM,YAC/Ce,EAAM,UAAYF,EAAYE,EAAM,QAAQ,EAAG,MAAO,GAE5D,MAAO,EACT,EACA,OAAOF,EAAYjB,EAAM,KAAK,QAAQ,CACxC,CAAC,EAEDoB,OAAAA,QAAMJ,EAAiBK,GAAW,CAC5BA,MAAmB,MAAQ,GACjC,EAAG,CAAE,UAAW,GAAM,yDAKJ,OAAAC,QAAAlB,CAAA,EAAM,yBAAtBmB,EAAAA,mBAWWC,WAAA,CAAA,IAAA,GAAA,aAVTC,EAAAA,mBAAwC,MAAA,CAAnC,MAAM,0BAAA,EAA0B,KAAA,EAAA,IAErCC,EAAAA,UAAA,EAAA,EAAAH,EAAAA,mBAOWC,WAAA,KAAAG,EAAAA,WAPe1B,EAAA,KAAK,SAAdkB,mDAA8B,IAAAA,EAAM,EAAA,GAE3CA,EAAM,WAAQ,mBADtBS,EAAAA,YAIEC,EAAAA,QAAA,OAFC,KAAMV,EACN,YAAYN,CAAA,kFAOnBU,EAAAA,mBA8CM,MAAAO,EAAA,CA5CJL,EAAAA,mBAmBS,SAAA,CAlBP,MAAM,mKACL,QAAOb,CAAA,GAERmB,EAAAA,YAOEC,EAAAA,QAAA,CANA,KAAK,eACL,KAAK,KACJ,uBAAOV,EAAAA,MAAAW,IAAA,oDAA2E1B,EAAA,OAAU,WAAA,sBAK/FkB,qBAA+D,OAA/DS,EAA+DC,EAAAA,gBAApBlC,EAAA,KAAK,KAAK,EAAA,CAAA,EAE7CQ,EAAA,MAAU,iBADlBc,EAAAA,mBAKO,OALPa,EAKOD,EAAAA,gBADF1B,EAAA,KAAU,EAAA,CAAA,iCAKjBgB,EAAAA,mBAqBM,MAAA,CApBH,uBAAOH,EAAAA,MAAAW,IAAA,+DAAkF1B,EAAA,MAAU,kBAAA,iBAAA,KAKpGkB,EAAAA,mBAcM,MAdNY,EAcM,EAbJX,EAAAA,UAAA,EAAA,EAAAH,EAAAA,mBAYWC,WAAA,KAAAG,EAAAA,WAZe1B,EAAA,KAAK,SAAdkB,mDAA8B,IAAAA,EAAM,EAAA,GAE3CA,EAAM,WAAQ,mBADtBS,EAAAA,YAIEC,EAAAA,QAAA,OAFC,KAAMV,EACN,YAAYN,CAAA,oBAIFM,EAAM,WAAQ,mBAD3BS,EAAAA,YAIEU,EAAA,OAFC,KAAMnB,EACN,YAAYN,CAAA"}