{"version":3,"file":"JContextMenu.vue2.cjs","sources":["../../../../src/components/molecules/JContextMenu.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport {\r\n  ContextMenu,\r\n  ContextMenuContent,\r\n  ContextMenuGroup,\r\n  ContextMenuItem,\r\n  ContextMenuLabel,\r\n  ContextMenuSeparator,\r\n  ContextMenuSub,\r\n  ContextMenuSubContent,\r\n  ContextMenuSubTrigger,\r\n  ContextMenuTrigger\r\n} from '@/components/shadcn'\r\nimport JKbd from '@/components/atoms/JKbd.vue'\r\nimport type { JContextMenuProps, ContextMenuItem as ContextMenuItemType } from '@/types/context-menu.types'\r\n\r\n/**\r\n * JContextMenu 컴포넌트\r\n * \r\n * shadcn-vue의 Context Menu를 래핑한 사용하기 쉬운 컨텍스트 메뉴 컴포넌트입니다.\r\n * 우클릭 시 나타나는 메뉴를 간단하게 구현할 수 있습니다.\r\n * \r\n * @reference https://www.shadcn-vue.com/docs/components/context-menu.html\r\n * \r\n * @emits select - 메뉴 아이템 선택 시\r\n * @emits open - 메뉴 열림\r\n * @emits close - 메뉴 닫힘\r\n */\r\n\r\nconst props = withDefaults(defineProps<JContextMenuProps>(), {\r\n  items: () => [],\r\n  disabled: false\r\n})\r\n\r\nconst emit = defineEmits<{\r\n  select: [itemId: string]\r\n  open: []\r\n  close: []\r\n}>()\r\n\r\n/**\r\n * 메뉴 구조 계산 - items를 그대로 사용\r\n */\r\nconst menuStructure = computed(() => {\r\n  return props.items\r\n})\r\n\r\n/**\r\n * 아이템 클릭 핸들러\r\n */\r\nconst handleItemClick = (item: ContextMenuItemType) => {\r\n  if (item.disabled) return\r\n  \r\n  emit('select', item.id)\r\n  \r\n  if (item.onClick) {\r\n    item.onClick()\r\n  }\r\n}\r\n</script>\r\n\r\n<template>\r\n  <ContextMenu>\r\n    <ContextMenuTrigger :disabled=\"disabled\" :class=\"props.class\">\r\n      <slot />\r\n    </ContextMenuTrigger>\r\n    \r\n    <ContextMenuContent\r\n      @pointer-down-outside=\"emit('close')\"\r\n      @escape-key-down=\"emit('close')\"\r\n      @focus-outside=\"emit('close')\"\r\n    >\r\n      <template v-for=\"(group, groupIndex) in menuStructure\" :key=\"groupIndex\">\r\n        <!-- 그룹 라벨 -->\r\n        <ContextMenuLabel v-if=\"group.label\">\r\n          {{ group.label }}\r\n        </ContextMenuLabel>\r\n        \r\n        <ContextMenuGroup>\r\n          <template v-for=\"item in group.items\" :key=\"item.id\">\r\n            <!-- 서브메뉴가 있는 경우 -->\r\n            <ContextMenuSub v-if=\"item.children && item.children.length > 0\">\r\n              <ContextMenuSubTrigger :disabled=\"item.disabled\">\r\n                {{ item.label }}\r\n              </ContextMenuSubTrigger>\r\n              <ContextMenuSubContent>\r\n                <template v-for=\"subItem in item.children\" :key=\"subItem.id\">\r\n                  <!-- 일반 서브 아이템 -->\r\n                  <ContextMenuItem\r\n                    :disabled=\"subItem.disabled\"\r\n                    @click=\"handleItemClick(subItem)\"\r\n                  >\r\n                    <slot name=\"item\" :item=\"subItem\">\r\n                      {{ subItem.label }}\r\n                    </slot>\r\n                    <JKbd v-if=\"subItem.shortcut\" size=\"sm\" class=\"ml-auto\">\r\n                      {{ subItem.shortcut }}\r\n                    </JKbd>\r\n                  </ContextMenuItem>\r\n                  <ContextMenuSeparator v-if=\"subItem.separator\" />\r\n                </template>\r\n              </ContextMenuSubContent>\r\n            </ContextMenuSub>\r\n\r\n            <!-- 일반 아이템 -->\r\n            <ContextMenuItem\r\n              v-else\r\n              :disabled=\"item.disabled\"\r\n              @click=\"handleItemClick(item)\"\r\n            >\r\n              <slot name=\"item\" :item=\"item\">\r\n                {{ item.label }}\r\n              </slot>\r\n              <JKbd v-if=\"item.shortcut\" size=\"sm\" class=\"ml-auto\">\r\n                {{ item.shortcut }}\r\n              </JKbd>\r\n            </ContextMenuItem>\r\n            <ContextMenuSeparator v-if=\"item.separator\" />\r\n          </template>\r\n        </ContextMenuGroup>\r\n        \r\n        <!-- 그룹 구분선 -->\r\n        <ContextMenuSeparator v-if=\"groupIndex < menuStructure.length - 1\" />\r\n      </template>\r\n    </ContextMenuContent>\r\n  </ContextMenu>\r\n</template>\r\n\r\n<style scoped>\r\n/* 추가 스타일이 필요한 경우 여기에 작성 */\r\n</style>\r\n\r\n"],"names":["props","__props","emit","__emit","menuStructure","computed","handleItemClick","item","_createBlock","_unref","ContextMenu","_createVNode","ContextMenuTrigger","_normalizeClass","_renderSlot","_ctx","ContextMenuContent","_openBlock","_createElementBlock","_Fragment","_renderList","group","groupIndex","ContextMenuLabel","_createTextVNode","_toDisplayString","ContextMenuGroup","ContextMenuSub","ContextMenuSubTrigger","ContextMenuSubContent","subItem","ContextMenuItem","$event","JKbd","ContextMenuSeparator"],"mappings":"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"}